收录常见的redis用法,既涨涨见识,也方便遇到相关场景能快速参考。
求共同好友
原理 : sinter key1 key2
redis自带的sinter命令就是对两个集合求交集,系统为用户添加好友的同时,只要往redis存入用户的好友ID集合,后续就能很简单得出了用户相对于另一个用户的共同好友
127.0.0.1:6379> sinter user:friend:123 user:friend:234
1) "3"
2) "5"
简单的用户协同推荐
原理:交集与差集的合理利用
假设有用户A的喜好列表SA[1,2,3]和用户B的喜好列表SB[3,4,5],通过len(SA^SB)/len(SA)就能简单地得到一个能代表B相对于A的相似度,虽然不一定很精准,但胜在简单。
127.0.0.1:6379> sinter a:like b:like
1) "3"
len(SA^SB)=1
len(SA)=3
因而相似度为1/3
对于某个用户A,用A对其他用户C[2,3,6],D[1,2,3,4],E[1,2,3,4,5,6,7],求相似度,通过对列表排序,就能得到关于A的相似度优先列表[D,E,C,B]
相似度分别为2/3,1,1(此处有点问题,远多于这种情形应该是不怎么相似才对)
因而排序是D,E,C,B
使用差集操作,B相对于A的差集就是除并集外B的剩余部分,此场景下通俗点来讲就是从相似好友中推荐A可能会喜欢的物品。 sdiff key1 key2,求出key1相对于key2的差集
127.0.0.1:6379> sdiff d:like a:like
1) "4"
127.0.0.1:6379> sdiff e:like a:like
1) "4"
2) "5"
3) "6"
4) "7"
127.0.0.1:6379> sdiff c:like a:like
1) "6"
127.0.0.1:6379> sdiff b:like a:like
1) "4"
2) "5"
(integer) 2
这个时候,将所有的差集求并集之后就能得到用户a的推荐列表了
订阅发布
原理 : redis自带的pub/sub
某个客户端sub某个频道后,往后有消息从该频道被pub时,该客户端就会收到通知,可以用在异步回调,应用解耦,广播等情形。
sub操作的客户端
127.0.0.1:6379> subscribe test
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "test"
3) (integer) 1
1) "message"
2) "test"
3) "test pub/sub"
pub操作的客户端
127.0.0.1:6379> publish test "test pub/sub"
(integer) 1
简单的延迟队列
原理 : zrangebyscore delay:queue 0 now
往zset里放置需要延时处理的消息或者任务的同时,设置score为当前时间的时间戳。
另起一个协程,每隔一段时间从zset内取出score比取出时间的时间戳要小的消息或任务进行处理。
错误限制次数
原理:setex userToken count ex
通过设置key为用户的唯一标识,每次用户错误就累加count,达到限制次数后就禁止用户的操作,直到redis中的key过期后才恢复
尾声
期待交流
后续代码存放地址