Redis从入门到精通(11):redis数据类型两个实际案例

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>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值