Redis 初步探索
List
存储类型
存储有序的字符串(从左到右),元素可以重复,可以充当队列和栈的角色
操作命令
lpush queue alpush queue b crpush queue d elpop queueblpop queuebrpop queue
「取值」
lindex queue 0 lindex queue 0 -1
应用场景
- 因为List 是有序的,可以用来做用户的时间线。
- 消息队列
List 提供了两个阻塞的弹出操作:BLOPO/BRPOP,可以设置超时时间
BLPOP:BLPOP key1 timeout 移除并获取列表的第一个元素,如果列表没有元素会阻塞队列直到等待超时或发现可弹出元素为止。
BRPOP:BRPOP key1 timeout 移出并获取列表的最后一个元素,如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。
队列:先进先出:rpush blpop ,左头右尾,右边进行队列,左边出队列。
栈:先进先出:rpush brpop
Set
「存储类型」
String 类型的无序集合,最大存储数量为 2^32-1
「操作命令」
sadd myset a b c d e f g
smembers myset
scard myset
srandmember key
spop myset
srem myset d e f
sismember myset a
应用场景
spop myset
例如:微博点赞:
微博id 为 w1001 ,用户的id为 u2001
用like:w1001来维护u2001 这条微博的所有点赞的用户
点赞了这表微博:sadd like:w1001 u2001
取消点赞:srem: like: w1001 u2001
是否点赞:sismember like:w1001 u2001
点赞的所有用户:smembers like:w1001
点赞数:scrad like:u2001
用tags:t3001 来维护商品所有的标签
sadd tags:t3001 物品便宜
sadd tags:t3001 质量好
sadd tags:t3001 物流超快
获取差集
sdiff set1 set2
获取交集
sinter set1 set2
获取并集
sunion set1 set2
例如:苹果手机上市
iPhone 上市了
sadd brand:apple iPhoneXX
sadd brand: ios iPhoneXX
sad screensize: 6.0-6,24 iPhoneXX
sad screentype:lcd iPhoneXX
筛选商品:苹果的,IOS,屏幕在 6.0~6.24之间的,屏幕材质是lcd屏幕
sinter brand:apple brand:ios screensize:6.0-6.24 screentype:lcd
- 商品筛选
- 商品标签
- 点赞、签到、打卡
- 随机获取元素
- 查看元素是否存在
- 移除一个或者多个元素
- 随机弹出一个元素
- 随机获取一个元素
- 统计元素个数
- 获取所有元素
- 添加一个或者多个元素
ZSet
「存储类型」
sorteed set,有序的set,每个元素有个score
score 先相同时,按照key的ASCII码排序
数据结构对比:
数据结构 | 是否允许重复元素 | 是否有序 | 有序实现方式 |
列表list | 是 | 是 | 索引下标 |
集合set | 否 | 否 | 无 |
有序集合zset | 否 | 是 | 分支score |
「操作命令」
添加元素
zadd myset 10 java 20 php 30 python 40 go
获取全部元素
zrange myzset 0 -1 withscoreszrevrange myset 0 -1 withscores
根据分支区间获取元素
zrangebyscore myset 20 30
移除元素
也可以根据score rank 删除
zrem myzset php cpp
统计元素个数
zcard myzset
分值递增
zincrby myset 5 java
根据分支统计个数
zcount myset 20 60
获取元素rank
zrank myset java
获取元素 score
zscore myset java
也有倒序的rev 操作(reverse)
应用场景
- 排行榜
id为 6001 的新闻点击数加1,:zincrby hotNews:20200701 1 n6001
获取今天点击最多的15条:zrevrange hotNews: 20200701 0 15 withscores
BitMaps
BitMaps 是在字符串类型上面定义的位操作,一个字节由8个二进制位组成。
set k1 a
获取value 在 offset 处的值(a 对应的ASCII码是97,转换为二进制数据是:01100001)
getbit k1 0
修改二进制数据(b 对应的ASCII码是98,转换为二进制数据为 01100010)
setbit k1 6 1setbit k1 7 0get k1
统计二进制位中1的个数
bitpos k1 1bitpos k1 0
BITOP 命令支持AND \OR \NOT\XOR这四种操作中的任意一种参数:
BITOP AND destkey srckey1 ..... srckeyN,对一个或者多个key求逻辑与,并将结果保存到destkey
BITOP OR destkey srckey1 ..... srckeyN,对一个或者多个 key 求逻辑或,并将结果保存到 destkey
BITOP XOR destkey srckey1 .... srckeyN,对一个或者多个key,求逻辑异或,并将结果保存到 destkey
BITOP NOT destkey srckey1,对给定key求逻辑非,并将结果保存到destkey
应用场景
- 用户访问统计
- 在线用户统计
Hyperloglogs
提供了一种不太准确的基数统计方法,比如统计网站的UV,存在一定的误差
Streams
5.0 推出的数据类型。支持多播的可持久化的消息队列,用户实现发布订阅功能。
总结
对象 | 对象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_INSERT | intset\hashtable |
有序集合对象 | OBJ_ZSET | "zset" | OBJ_ENCODING_ZIPLIST\OBJ_ENCODING_SKIPLIST | ziplist\skiplist |
编码转换总结
对象 | 原始编码 | 升级编码 | |
字符串对象 | INT | embstr | raw |
整数并且小于long 2^63-1 | 超过44字节,被修改 | ||
哈希对象 | ziplist | hashtable | |
键和值的长度小于64byte,键值对个数不超过512个,同时满足 | |||
列表对象 | quicklist | ||
集合对象 | intset | hashtable | |
元素都是整数类型,元素个数小于512个,同时 | |||
有序集合对象 | ziplist | skiplist | |
元素数量不超过128个,任何一个member的长度小于64字节,同时满足 |