其他数据结构
BitMaps
Bitmaps 是在字符串类型上面定义的位操作。一个字节由8个二进制位组成。
set k1 a
获取value在offset处的值(a对应的ASCII码是97,转换为二进制数据是01100001)
getbit k1 0
修改二进制数据
setbit k1 6 1
setbit k1 7 0
get k1
QA:怎么变成b了?(b对应的ASCII码是98,转换为二进制数据是01100010)
//统计二进制位中1的个数
bitcount k1
//获取第一个1或者0的位置
bitpos k1 1
bitpos k1 0
因为bit非常节省空间(1MB = 8388608 bit),可以用来做大数据量的统计。
例如:在线用户统计,留存用户统计
setbit onlineusers 0 1
setbit onlineusers 1 1
setbit onlineusers 2 0
支持按位与、按位或等等操作。
BITOP AND destkey key [key ...], 对一个或多个key求逻辑并,并将结果报错到destkey。
BITOP OR destkey key [key ...], 对一个或多个key求逻辑或,并将结果报错到destkey。
BITOP XOR destkey key [key ...], 对一个或多个key求逻辑异或,并将结果报错到destkey。
BITOP NOT destkey key , 对给定key求逻辑非,并将结果报错到destkey。
应用场景:
用户访问统计
在线用户统计
Hyperloglogs
Hyperloglogs : 提供了一种不太精确的基数统计法,用来统计一个集中不重复的元素个数,比如统计网站的UV,或者应用的日活、月活,存在一定的误差。
在Redis中实现的HyperLogLog,只需要12k内存就能统计2^64个数据。
Geo
需求:获取半径1公里以内的门店,那么我们就要把门店的经纬度保存起来。那么这时候我们是直接把经纬度保存在数据库中,一个字段存经度,一个字段存纬度。计算距离比较复杂。Redis的GEO直接提供了这个方法、
geoadd location 11.3333 232.31313 xxx
geopos location xxx
操作:增加地址位置信息、获取地址位置信息、计算两个位置的距离、获取指定范围内的地理位置集合。
Streams
5.0推出的数据类型。支持多播的可持久化的消息队列,用于实现发布订阅功能,借鉴kafka的设计。
总结
数据结构总结
对象 | 对象type属性值 | type命令输出 | 底层可能的存储结构 | object encoding |
---|---|---|---|---|
字符串对象 | OBJ_STRING | "string" | OBJ_ENCODING_INT OBJ_ENCODING_EMBSTR OBJ_ENCODING_RAW |
int embstr raw |
列表对象 | OBJ_LIST | "list" | OBJ_ENCODING_QUICKLIST | quicklist |
哈希对象 | OBJ_HASH | "hash" | OBJ_ENCODING_ZIPLIST OBJ_ENCODING_HT |
ziplist hashtable |
集合对象 | OBJ_SET | "set" | OBJ_ENCODING_INTSET OBJ_ENCODING_HT |
intset hashtable |
有序集合对象 | OBJ_ZSET | "zset" | OBJ_ENCODING_ZIPLIST OBJ_ENCODING_SKIPLIST |
ziplist skiplist+hashtable |
编码转换总结
对象 | 原始编码 | 升级编码 | |
---|---|---|---|
字符串对象 | INT 整数并且小于long 2^63-1 |
embstr 超过44字节,被修改 |
raw |
哈希对象 | ziplist 键和值的长度小于64byte,键值对个数不超过512个,同时满足 |
hashtable |
|
列表对象 | quicklist | ||
集合对象 | intset 元素都是整数类型,元素个数小于512个,同时满足 |
hashtable |
|
有序集合对象 | ziplist 元素数量不超过128个,任何一个member的长度小于64字节,同时满足 |
skiplist |
应用场景总结
缓存 -- 提升热点数据的访问速度
共享数据 -- 数据的存储和共享的问题
全局ID -- 分布式全局ID 的生成方案(分库分表)
分布式锁 -- 进程间共享数据的原子操作保证
在线用户统计和计数
队列、栈 -- 跨进程的队列、栈
消息队列 -- 异步解耦的消息机制
服务注册与发现 -- RPC通信机制的服务协调中心(Dubbo支持Redis)
购物车
新浪、Twitter 用户消息时间线
抽奖
点赞、签到、打卡
商品标签
用户关注模型
电商产品筛选
排行榜