redis最常用的五种数据类型:string,hash,list,set,sorted_set。如何在实际应用场景中对这五种数据类型进行综合考虑,这一篇我们用两个简单的例子一起来看看。
我是T型人小付,一位坚持终身学习的互联网从业者。喜欢我的博客欢迎在csdn上关注我,如果有问题欢迎在底下的评论区交流,谢谢。
限时限次数的访问限制
例如某在线视频网站规定普通用户每天只能观看10个视频,黄金会员可以观看100个视频,铂金会员没有限制。如何实现?
思路一:针对普通用户,为每个userid创建一个key,记录观看的视频数量,如果这个key存在且value为10,那么不允许继续观看。如果key不存在,则初始化并设置超时时间。其余情况直接incr。黄金会员同理。
这里为简化演示,将限制改为60秒观看5次
127.0.0.1:6380> setex user:id:01 60 1
OK
127.0.0.1:6380> incr user:id:01
(integer) 2
127.0.0.1:6380> ttl user:id:01
(integer) 42
127.0.0.1:6380> incr user:id:01
(integer) 3
127.0.0.1:6380> incr user:id:01
(integer) 4
127.0.0.1:6380> incr user:id:01
(integer) 5
127.0.0.1:6380> ttl user:id:01
(integer) 20
127.0.0.1:6380> ttl user:id:01
(integer) 4
127.0.0.1:6380> setex user:id:01 60 1
还有一种思路:利用动态的检测,只要距离10的那个视频的时间戳距离现在超过了时间限制就可以看,否则就将现在的时间戳写到最新的记录里面。这里利用sorted_set,value放视频的id,score放时间戳。
127.0.0.1:6380> zadd user:id:01 1581861890 video:01
(integer) 1
127.0.0.1:6380> zadd user:id:01 1581861924 video:02
(integer) 1
127.0.0.1:6380> zadd user:id:01 1581861958 video:03
(integer) 1
127.0.0.1:6380> zrevrange user:id:01 0 -1 withscores
1) "video:03"
2) "1581861958"
3) "video:02"
4) "1581861924"
5) "video:01"
6) "1581861890"
127.0.0.1:6380>
例如想和3个视频前的时间戳去比,就可以拿video1的时间戳
127.0.0.1:6380> zrevrange user:id:01 2 2 withscores
1) "video:01"
2) "1581861890"
类微信对话展示顺序
在微信的对话界面,首先显示的是置顶对话,然后会根据消息来的时间,不同的对话在顺序上会有上下交替。如何实现?
思路一:这里将list做为栈来使用,创建两个list,分别对应置顶的对话和普通对话。对每个list,有新的消息进来,就先将该对话的id先从list中删除,然后从左面push进去。展示的时候从左往右依次排列即可。
127.0.0.1:6380> lrem chat 1 user:1
(integer) 0
127.0.0.1:6380> lpush chat user:1
(integer) 1
127.0.0.1:6380> lrem chat 1 user:2
(integer) 0
127.0.0.1:6380> lpush chat user:2
(integer) 2
127.0.0.1:6380> lrem chat 1 user:3
(integer) 0
127.0.0.1:6380> lpush chat user:3
(integer) 3
127.0.0.1:6380> lrem chat 1 user:2
(integer) 1
127.0.0.1:6380> lpush chat user:2
(integer) 3
127.0.0.1:6380> lrem chat 1 user:1
(integer) 1
127.0.0.1:6380> lpush chat user:1
(integer) 3
127.0.0.1:6380> lrem chat 1 user:3
(integer) 1
127.0.0.1:6380> lpush chat user:3
(integer) 3
127.0.0.1:6380> lrange chat 0 -1
1) "user:3"
2) "user:1"
3) "user:2"
127.0.0.1:6380>
如果想要显示未读消息个数,则再针对每个对话创建一个计数器,来消息则incr,阅读了就清空即可,这里就不演示了。
思路二:利用sorted_set存储每个对话最新的时间戳,按照最新的时间戳去排序也是可以。
127.0.0.1:6380> zadd chat 1581869831 user:1
(integer) 1
127.0.0.1:6380> zadd chat 1581869858 user:2
(integer) 1
127.0.0.1:6380> zadd chat 1581869864 user:3
(integer) 1
127.0.0.1:6380> zadd chat 1581869875 user:2
(integer) 0
127.0.0.1:6380> zadd chat 1581869888 user:1
(integer) 0
127.0.0.1:6380> zrevrange chat 0 -1
1) "user:1"
2) "user:2"
3) "user:3"
127.0.0.1:6380>