自己公司的代码遇到这个需求,于是身为法人的我,自己写了代码。
A用户从池中匹配,如果匹配到了B用户,则返回AB。同样B也是返回AB。
用一个接口实现。
我的逻辑:
最后前端删除的接口我还没有写,就是清空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,匹配给他