聊天系统,所有逻辑业务主要都使用mysql。
用户聊天时需要判断是否为好友关系,如果每次聊天都从mysql中去查询判断是否为好友,频率太高了,个人觉得不合理。
(存在删除了好友,聊天界面未刷新或其他情况,所以聊天时有必要判断是否为好友)方案一:
于是使用redis string 的 key value结构来判断是否为好友关系:
friend_relation_maxid_minid
maxid是userId friendId最大值,minid为userId friendId最小值。
添加好友时,创建对应的friend_relation_maxid_minid:1来存储,删除好友时,移除对应的key(该系统逻辑是删除了好友,双方同时都删除)
在聊天时判断friend_relation_maxid_minid是否为1,如果不是,则返回错误信息。方案二:添加好友或删除好友时,mysql同步好友列表到redis ,用无序集合存储
在聊天时取出我的好友列表,判断对方用户ID是否在这个列表中。如果不是,返回错误信息。以上两种方案哪种合适,或者有其它更好的方案?求推荐!
方案二可能更强大,可以实现交集并集之类的。

解决方案 »

  1.   

    1、好友存到MySQL表中,用户登陆后 将好友ID从表中取出  序列化后缓存到 redis  
    2、每次发消息时从redis中取到缓存值,反序列后到php数组中,再核对是否为好友,php运算还是相当快的。
    3、将此用户近10个聊天的好友缓存到 redis中 ,每次先对此次发起的聊天对象是否在此列表中作对比,如果不在,再执行第2步。
    至于删除添加好友时,更新redis的值即可全部手打,好累
      

  2.   

    1, 判断是否为好友关系: 正如你们现在所想的一样, 将自己的ID与好友的ID 存入Redis缓存之中,然后进行读取判断即可.
    2,针对删除了好友,聊天界面未刷新情况: 可以使用GatewayWorker实现即时通知处理,使页面自动将移除的好友去掉.