springboot 利用redis 1对1匹配逻辑

自己公司的代码遇到这个需求,于是身为法人的我,自己写了代码。

A用户从池中匹配,如果匹配到了B用户,则返回AB。同样B也是返回AB。

用一个接口实现。

我的逻辑:

springboot 利用redis 1对1匹配逻辑

最后前端删除的接口我还没有写,就是清空hash中的数据,当最后一个字段为1的用户,调用另外我没写的接口,去删除,他和他对应兄弟的hashMap的数据,保持redis资源充足。

代码

package cn.learningfriend.base.wechat;

import org.springframework.stereotype.Service;
import redis.clients.jedis.Jedis;

import java.util.HashMap;
import java.util.List;
import java.util.Set;

@Service
public class VoiceMatch {


    //    语音匹配,随机匹配一个正在匹配的用户,返回给他
    public  String suijiMatch(String user_id) {
        Jedis jedis = new Jedis("ip");//改成自己的
        jedis.auth("password");//改成自己的


//            池中有数据
        System.out.println("------------------");
        //            1.取池中的值list中的一个作为key,采用的Pop删除获取模式
        String active_userid = jedis.rpop("matchList");//获取可获取的用户,无用户,则为null
        if (active_userid!=null) {//有数据
            System.out.println("有数据"+active_userid);
            //            2.去hash获取key的值,将值改成自己的user_id
            jedis.hset("matchHash", active_userid, user_id);
            //            3.返回给用户
            return user_id+"!--!"+active_userid+"!--!"+"0";
        } else {//池中无数据
//            1.将自己先存在hash中,自己在将user_id存在list中
            jedis.hset("matchHash",user_id,"0");
            jedis.lpush("matchList",user_id);

            System.out.println("无数据的时候添加hash成功"+jedis.hget("matchHash",user_id));
            System.out.println("添加的list"+jedis.hget("matchHash",user_id));

            //            2.15秒后结束,每秒判断自己的值是否为0)
            int j=15;
            for (int i = 0; i <j ; i++) {


                try {
                    Thread.currentThread().sleep(1000);//等待1秒
                    String other_user_id = jedis.hget("matchHash", user_id);//没有和其他用户匹配则为0
                    System.out.println("无数据的匹配成功"+user_id+"的值为"+other_user_id);
                    if(!other_user_id.equals("0")){//不等于0则退出

                        return user_id+"!--!"+other_user_id+"!--!"+"1";
                    }
                } catch (InterruptedException e) {
                    return "0";
                }


            }
            //            4.当15秒后,值也为0,返回用户匹配超时,请重新匹配
            //没有匹配到删除自己的list
            jedis.lrem("matchList",0,user_id);
            return "-1"; //15秒内没有用户匹配

        }



    }
}
//            4.前端接收到了2个用户后,调用接口,删除hash中的值(如果有则删除)
//    选择好友的User_id,匹配给他



上一篇:CSS3----伪元素和伪类选择器---动态伪类和表单伪类


下一篇:【BZOJ1688】[Usaco2005 Open]Disease Manangement 疾病管理 状压DP