最常用的五种数据结构为:String、Hash、Set、List、Zset(Sorted Set)
另外还有几种特殊的数据结构:Bitmap、HyperLogLog、Bloom、GeoHash
String
最常用,用来做普通的get、set的KV操作。
Hash
类似HashMap的一种数据结构。
用处:
- 存储结构化的数据,例如存储用户的登录态数据。
List
列表 - 双向链表实现。
用处:
- 实现一些简单的消息队列:lpush/rpush和rpop/lpop写入和读取消息、brpop/blpop来实现阻塞队列。
- 或者用来存储一些像粉丝列表、文章评论列表等热点数据。除此之外,其独特的lrange命令(返回指定区间的元素)还可以实现分页功能,并且性能很好。
Set
无序集合。
用处
- 一般用来对一维的数据做去重
- 另外一种适用场景就是用来求交集、并集、差集:比如计算两人的好友交集(共同好友)、差集(可能认识的好友)。
// 你的好友列表abcd
sadd you a b c d
// 我的好友列表cdef
sadd me c d e f
// 基于"你"来求和"我"之间的差集
sdiff you me
结果:a b
即可实现把你的好友a、b推荐给我
Sorted Set
有序集合。
用处:
- 排行榜
- 延迟队列(需要消费端定时轮询)
// 订单限时支付(score为当前时间+30min)
zadd delay_q now+30min task:orderId
// 消费端定时轮询队列delay_q(通过score排名:0开始排名到当前时间)
zrangebyscore delay_q 0 now
- 限速器
Bitmap
位图。底层实际上也是String。
用处:
- 是否参与过某次活动、是否已读某篇文章。。。
// 标志用户001参加过活动0001
setbit 0001 001 1
// 判断是否参加过活动
getbit 0001 001
- 日活量统计
// 日期0605作为key,将一个个用户id映射的bit置1
setbit login:0605 001 1
setbit login:0605 002 1
setbit login:0605 003 1
...
// 直接统计该key为1的数量
bitcount login:0605
- 统计连续登录
在统计日活量的基础上,对不同日期的bitmap做一个与运算。比如一个用户连续登录两天,那他id所映射到的那个bit,与运算的结果肯定为1。
网友评论