redis 的 key 设计原则

一、用户下单

在设计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个数据库

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Micrle_007

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值