自己公司的代码遇到这个需求,于是身为法人的我,自己写了代码。
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,匹配给他