1.Redis核心数据结构比较
2.微博与微信消息流redis实现
3.微信点赞、收藏与标签基于redis实现
4.微博与微信朋友关注模型基于redis实现
5.电商购物车用redis实现
- [ 待办 ] 电商购物车用redis实现
- [ 待办 ] 电商推荐系统使用redis实现
- [ 待办 ] redis高性能核心原理剖析
一 、Redis核心数据结构比较
hash优点:
1:同类数据归类整合储存,方便数据管理
2:相比string操作消耗内存与cpu更小
3:相比string储存更节省空间
hash缺点:
1:过期功能不能用在field上,只能用在key上
2:redis集群架构下不适合大规模使用 - 分片,将用户表的数据划分到不同的槽位
redis集群结构
redis用以购物车
电商购物车
1)以用户id为key
2)商品id为field
3)商品数量为value
购物车操作
添加商品hset cart:1001 10088 1
增加数量hincrby cart:1001 10088 1
商品总数hlen cart:1001
删除商品hdel cart:1001 10088
获取购物车所有商品hgetall cart:1001
list使用场景:
1.栈:LPOP + LPUSH
2.队列:LPUSH + RPOP
3.MQ阻塞队列: LPUSH + BRPOP
数据结构:
此外:
BLPOP key [key ...] timeout //从key列表表头弹出一个元素,若列表中没有元素,阻塞等待 timeout秒,如果timeout=0,一直阻塞等待
BRPOP key [key ...] timeout //从key列表表尾弹出一个元素,若列表中没有元素,阻塞等待 timeout秒,如果timeout=0,一直阻塞等待
set的操作
SADD set1 'a'
SADD set1 'b'
SADD set1 'c'
SADD set2 'b'
SADD set2 'c'
SADD set2 'd'
SADD set3 'c'
SADD set3 'd'
SADD set3 'e'
SINTER set1 set2 set3 -> { c }
SUNION set1 set2 set3 ->{ a,b,c,d,e }
SDIFF set1 set2 set3 -> { a }
// 以第一个集合为基准 减去后面俩集合的并集
// abc-bcde 只看第一个集合还剩下的元素
set参与抽奖
微信抽奖小程序
1)点击参与抽奖加入集合
SADD key {userlD}
2)查看参与抽奖所有用户
SMEMBERS key
3)抽取count名中奖者
SRANDMEMBER key [count] / SPOP key [count]
// key是活动id,抽奖的时候不改变
SRANDMEMBER key // 看参与抽奖的人还有多少
SPOP key 3 // 先抽三个人
----------------------------
微信微博点赞,收藏,标签
1) 点赞
SADD like:{消息ID} {用户ID}
SADD 1001 “1001”
SADD 1001 “1002”
2) 取消点赞
SREM like:{消息ID} {用户ID}
SREM 1001 “1001”
3) 检查用户是否点过赞
SISMEMBER like:{消息ID} {用户ID}
SISMEMBER 1001 1001
4) 获取点赞的用户列表
SMEMBERS like:{消息ID}
SMEMBERS 10011
-- 别的人进来就是共同好友
5) 获取点赞用户数
SCARD like:{消息ID}
SCARD 1002
---------------------------
微博共同关注的人、共同好友、可能认识的人
1 我和老师的共同关注:
SADD ddpSet p1
SADD ddpSet p2
SADD ddpSet p4
SADD teacherSet p1
SADD teacherSet p3
SADD p2Set p5
SADD p2Set p7
SADD p2Set teacher
SADD p4Set p6
SINTER ddpSet teacherSet--> {p1}
2 我关注的人也关注老师: // 分页
SISMEMBER p2Set teacher -- 展示teacher
SISMEMBER p4Set teacher -- 不展示teacher
3 我可能认识的人:
SDIFF p2Set ddpSet ->(p1, p2 ,p4}
// p5p7-p1p2p4 = p5p7
二、微博与微信消息流redis实现
微博主页和微信公众号和朋友圈( 不是大v,订阅者2000到3000+先给在线的用户发送),订阅的微信公众号,后发的消息展示最前面,这都是带有时间线的消息流,用redis的LPUSH放数据+LRANGE取数据实现
LRANGE key start stop // 返回key中指定区间内的元素,区间是偏移量start和stop指定的区间
如果大量的消息,pull模式,大v发消息到队列中去,其他用户上线之后,从队列中拉取
问题是用pull,本地要给消息再排序-新浪微博