redis常用demo收集(一)——总起

463 阅读2分钟

收录常见的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过期后才恢复

尾声

期待交流

后续代码存放地址