String、List、Hash、Set、SortedSet的常用方法和底层编码实现
STRING (字符串)
实现原理
底层由SDS(Simple Dynamic String, 简单动态字符串)实现。
特点:
- 1个
value
最大支持512M
的数据 - 可以存储二进制字符串
常用命令:
- SET key value
- 设置
key
的值的value
- 设置
- GET key
- 获取
key
的值
- 获取
- INCR key
key
的值自加1- key 的值必须要是整数 且要在64位int范围内
[-2^63, 2^63 - 1]
- INCRBY key increment
key += increment
- DECR key
- key的值自减1
- DECRBY key increment
key -= increment
- GETSET key value
- 设置key的值并返回老的值
- SETRANGE key offset value
key
的值从offset
开始设置为value
- key看做是一个指针, 这个命令把key + offert的地址开始设置为了value,不检查长度
- MGET key [key …]
- 获取多个
key
的值
- 获取多个
- MSET key value [key value …]
- 同时设置多个键的值
- SETNX key value
- 只有
key
不存在的时候才设置key
的值为value
- 只有
- SETEX key seconds value
- 设置
key
的过期时间, 过期就自动被删了
- 设置
LIST (列表)
实现原理
底层使用 quicklist
实现,quicklist
是一个 ziplist
的双向链表, 每个 ziplist
最大值可在配置文件中的list-max-ziplist-size
设置, 默认为 -2 (8kb)
Redis的列表与双端队列(deque)类似
常用方法
- RPUSH key value [value …]
- 将值推入到列表
key
的右端 - 相当于
python
的append()
- 将值推入到列表
- LPUSH key value [value …]
- 将值推入列表左端
- 相当于
python
列表的insert(0, value)
- 将多个
value
按从左到右的顺序lpush
,最右边的值在最左边
- LPOP
- 列表左端弹出一个值并返回弹出的值
- RPOP
- 列表右端弹出一个值
- LRANGE key start stop
- 获取列表在指定范围上的所有值, 包括
start
和stop
- 获取列表在指定范围上的所有值, 包括
- LINDEX
- 获取列表在给定位置上的单个元素
- LSET key index value
- 设置列表
key
的索引为index
的值value
- 设置列表
- LTRIM key start stop
- 只保留索引 在
[start, end]
中的元素的值, 干掉其他的
- 只保留索引 在
- LINSERT key BEFORE|AFTER pivot value
- 在列表
key
的值为pivot
的元素前或后插入一个值为value
的元素 - 存在多个相同值的元素只管最左侧的元素
- 成功: 返回列表长度, 指定元素不存在不执行操作, 返回-1, 列表不存在返回0
- 在列表
HASH (哈希表)
实现原理
底层由 hashtable
与 ziplist
实现
满足以下2个条件是使用 ziplist
, 否则转化为hashtable
编码
- 哈希保存的键值对数量小于
hash-max-ziplist-entries
(默认为512
)个 - 所有键值对的键和值的字符串长度都小于
hash-max-ziplist-value
(默认为64
) 字节
和 Python 的字典类似, 不过 Redis 的 HASH 的 key 和 value 都只能是STRING, 不能嵌套
常用方法:
- HSET key field value
- 将哈希表
key
中的字段field
的值设为value
- 将哈希表
- HGET key field
- 获取哈希表
key
中字段field
的值
- 获取哈希表
- HEXISTS key field
- 查询哈希表
key
中,指定字段filed
是否存在
- 查询哈希表
- HVALS key
- 获取哈希表
key
中的所有值
- 获取哈希表
- HLEN key
- 获取哈希表中键值对的数量
- HKEYS key
- 获取哈希表
key
中的所有键
- 获取哈希表
SET (集合)
底层实现
底层由 hashtable
和 intset
实现
当集合的元素都是整数 且 元素个数小于 set-max-intset-entries
(默认为512) 时集合的编码对象是intset, 其他情况都是哈希表
常用命令
- SADD key member [member …]
- 将
member
添加到集合key
中
- 将
- SMEMBERS key
- 获取集合
key
的所有元素
- 获取集合
- SCARD key
- 获取集合的元素数量
- SDIFF key1 [key2 …]
- 求给定所有集合的差集(
s1-s2-s3-...
)
- 求给定所有集合的差集(
- SINTER key1 [key2]
- 求给你所有集合的交集(
s1&s2&s3...
)
- 求给你所有集合的交集(
- SUNION key1 [key1…]
- 求给定所有集合的并集(
s1|s2|s3...
)
- 求给定所有集合的并集(
- SDIFFSTORE destination key1 [key2 …]
- 求给定所有集合的差集, 并存储到
destination
中
- 求给定所有集合的差集, 并存储到
- SINTERSTORE destination key [key …]
- 求给定所有集合的交集, 并存储到
destination
中
- 求给定所有集合的交集, 并存储到
- SUNIONSTORE destination key [key …]
- 求给定所有集合的并集, 并存储到
destination
中
- 求给定所有集合的并集, 并存储到
- SREM key member [member …]
- 从集合中删除一个或多个元素
- SPOP key [count]
- 随机删除
count
个幸运元素, 不指定count
则随机删除一个
- 随机删除
- SMOVE source destination member
- 将
member
从集合source
移动到destination
中 - 删掉
source
中的member
同时向destination
中添加member
(不管destination中有没有)
- 将
- SISMEMBER key member
- 判断
member
是否是集合中的元素
- 判断
SORTED_SET (有序集合)
底层实现
底层由ziplist
和skiplist
(跳表实现)
常用命令
- ZADD key [NX|XX] [CH] [INCR] score member [score member …]
- 将一个或多个
member
元素及其score
值加入到有序集合key
中 - 如果某个
member
已经是有序集合的元素,那么更新这个member
的score
值 - 参数:
- XX: 仅更新已经存在的元素, 不添加元素。
- NX: 只添加新元素, 不改变已有元素
- CH: 将返回值修改为添加和修改的元素数量总数(不加此参数值返回添加的元素数量)
- INCR: 将
member
的分值加上score
(与ZINCRBY
功能相同)
- 将一个或多个
- ZSCORE key member
- 获取有序集合中指定元素的分数
- ZCARD key
- 获取有序集合
key
的元素数量
- 获取有序集合
- ZCOUNT key min max
- 获取值在
[min, max]
之间的元素数量
- 获取值在
- ZRANGE key start stop [WITHSCORES]
- 获取有序集合 key 中,索引在[start, stop]的元素(从小到大排序)
-1
表示最后一个元素,-2
表示倒数第二个元素
- ZREVRANGE key start stop [WITHSCORES]
- 与
ZRANGE
功能相同, 从大到小排序
- 与
- ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count]
- 获取有序集合中分数在
[min, max]
中的元素 min
和max
可以是inf
和-inf
- 获取有序集合中分数在
- ZREVRANGEBYSCORE key max min [WITHSCORES] [LIMIT offset count]
- 与
ZRANGEBYSCORE
功能相同, 从大到小排序
- 与
- ZRANK key member
- 返回有序集合中member元素的排名(按分值从小到大排序), 分值相同按键的
ascii
字母排序
- 返回有序集合中member元素的排名(按分值从小到大排序), 分值相同按键的
- ZREVRANK key member
- 返回
member
元素从大到小的排名
- 返回
- ZREM key member [member …]
- 删除有序集合中指定的元素
- ZREMRANGEBYRANK key start stop
- 删除有序集合中排名在
[start, stop]
之间的元素
- 删除有序集合中排名在
- ZREMRANGEBYSCORE key min max
- 删除值在
[min, max]
之间的元素
- 删除值在
- ZINTERSTORE destination numkeys key [key …] [WEIGHTS weight] [AGGREGATE SUM|MIN|MAX]
- 计算给定的一个或多个有序集的交集,其中给定 key 的数量必须以 numkeys 参数指定,并将该交集(结果集)储存到 destination
- ZUNIONSTORE destination numkeys key [key …] [WEIGHTS weight] [AGGREGATE SUM|MIN|MAX]
- 计算给定的一个或多个有序集的并集,其中给定 key 的数量必须以 numkeys 参数指定,并将该并集(结果集)储存到 destination
WEIGHTS
参数可指定权重AGGREGATE
参数可指定聚合方式 和|最大值|最小值, 默认是 SUM