一、用户下单
在设计redis key 的时候,我们要遵循“一对多”的原则,就是“一”作为redis 的 key,“多”作为value,啥都不说了,上实际业务场景,比如下单的业务,设计方法如下:
1、由于一个订单肯定包含多个部分,比如:价格,商品id,订单日期等,所以订单和订单详情是一对多的关系,可以用hash 类型:
hmset order:1 goodId 001 price 30 date 2020-09-06
hmset order:2 goodId 002 price 30 date 2020-09-06
hmset order:3 goodId 003 price 30 date 2020-09-06
2、下单肯定是用户的行为,一个用户可以下多个订单,所以这里的用户是“一”,订单是“多”,所以用户就可以作为redis 的 key,可以用 List 类型:
Lpush user:1:order order:1 order:2 order:3
当用户再次下单,就可以直接用hash set进去:
hmset order:4 goodId 004 price 50 date 2020-09-06
对于user也是一样:
Lpush user:1:order order:4
3、当需要取出用户订单的时候:
List<String> orderIds = Lrange user:1:order 0 -1;
for (String orderId:orderIds){
List list = hmget(orderId);
}
二、微信朋友圈点赞
微信朋友圈点赞的抽象模型:
一个用户可以发送多条朋友圈(msg),每条朋友圈可以被多个用户点赞,对单条朋友圈来说,用户的msg和点赞的人是一对多的关系,所以可以用set类型:
sadd msgId userId1 userId2 userId3
由于我们的点赞是有顺序的,所以显示的时候也是按照点赞的先后显示,那可以用zset,那zset 的value是比set多了一个score:
zadd msgId 1 userId1 2 userId2 3 userId3
三、微信订阅号
因为每条message都有自己的id号,所以可以通过list,把用户订阅的这些message id添加到用户的订阅列表里:
lpush userId msg:001 msg:002 msg:003
这个操作是由具体的订阅号去做
还有包括微博的共同好友,可以通过求list的交集求出来:
sinter user:1 user:2 (交集)
sdiff user:1 user:2 (差集)
sunion user:1 user:2 (并集)
抽奖活动,活动id作为key:
首先添加参与者:
sadd active:Id user:1 user:2 user:3 user:4 user:5 user:6 user:7
随机抽取2位:
srandmember active:Id 2
腾讯新闻话题榜,以日期作为key:
1)首先计算话题的点击量
zincrby topic:20200825 1 article:1
2)根据点击量的大小,倒序排序,展示前10名点击量的article
zrevrange topic:20200825 0 9 withscores
>>>>>>>>>>>>>>统计近3日的点击数据<<<<<<<<<<<<<<<<<<
zunionstore topic:3 3 topic:1 topic:2 topic:3
>>>>>>>>>>>>>>展示近3日的前9名<<<<<<<<<<<<<<<<<<<<
zrevrange topic:3 0 9 withscores
Tip:redis在单点情况下是有16个库,但是在集群的情况下,只保留第0个数据库