数据结构、存储结构
String
可存储任何形式的字符串,包括二进制数据。最大容量 512M。
存储结构
int
存放 整型数据
sds
存放 字节/字符串和浮点类型
底层源码( typedef char *sds )
sdshdr 5 种类型:
struct attribute (( packed )) sdshdr5
struct attribute (( packed )) sdshdr8 (默认使用)
struct attribute (( packed )) sdshdr16
struct attribute (( packed )) sdshdr32
struct attribute (( packed )) sdshdr64
常用命令
命令 | 说明 |
---|---|
set [key] [value] | |
mset [key] [value] [key] [value] | 设置多个key-value |
get [key] | |
getset[key] value | 设置新值并返回旧值 |
setex [key] [seconds] [value] | 设置value并设置过期时间 |
setnx [key] [value] | key不存在时才可设置key |
msetnx [key] [value] [key] [value] | 设置多个key-value,仅当key不存在时 |
strlen [key] | 返回key的value长度 |
incr [key] | key的value+1,如果key不存在,先set key 0 ,再+1 |
decr [key] | key的value-1,如果key不存在,先set key 0 ,再-1 |
append [key] [value] | 再旧value后面追加新value,如果key不存在,先set [key] [] |
使用场景
- Session: 序列化存到 redis 中。
- IP 限制:原子递增 ,计数器
- 短信验证:每分钟发 一次……
List
内部基于双向列表的实现,越接近两端的数据获取速度越快。
存储结构
linkedlist
双向链表。链表头尾 push、pop,易于添加数据,但内存开销大。
ziplist
压缩列表。list 元素少、单个元素长度小时,采用ziplist可减少内存开销。
ziplist 存储在连续的内存上,存储效率高,但添加删除操作,频繁申请和释放内存。
quicklist
linkedlist 和 ziplist 的结合,仍是双向链表。
常用命令
命令 | 说明 |
---|---|
lpush [listName] [value][value]…… | 首部插入 |
rpush [listName] [value][value]…… | 尾部插入 |
lset [key] [index] [value] | 通过索引插入 |
lpop [listName] | 弹出首部第一个元素,若list不存在,返回 null |
rpop [listName] | |
blpop [listName] | 弹出首部第一个元素,若 list 为空,则阻塞直到有元素 |
brpop [listName] | 弹出尾部最后一个元素,若 list 为空,则阻塞直到有元素 |
lrange [listName] [from] [to] | 返回列表指定区间的元素,不删除。eg: lrange mylist 0 -1 , 0:列表第一个元素 -1:列表最后一个元素 |
lindex [key] [index] | 通过索引获取元素,不删除 |
llen [key] | 获取列表长度 |
使用场景
- 消息队列:生产者 lpush, 消费者 brpop
- 实现栈:lpush + lpop
- 实现队列:lpush + rpop
Hash
value 不支持其他类型嵌套
存储结构
ziplist
同list-ziplist
hashtable
dictEntry
管理一个 key-value,并保留相邻 key-value 的指针
dictht
hash 表用一个 buckets(捅)存放 dictEntry 的地址,并且hash(key)%len的值决定了要将此 dictEntry 放在 buckets 的哪个索引中
dict
当 dictht 需要扩容/缩容时,用来管理 dictht 的迁移
dict、dictht、dictEntry 关系
dict 包含 2 个 dictht,dictht 包含多个 dictEntry
注:hash(key)%len 值如果是 3,那对应的 dictEntry 就会放到buckets 第 4 个位置。
常用命令
命令 | 说明 |
---|---|
hset [key] [field] [value] [field] [value]…… | |
hexists [key] [field] | 判断 key 对应的 table 中,field 是否存在,0–不存在 1–存在 |
使用场景
- 存储对象
Set
数据不能重复,无序。
存储结构
intset
hashtable
field-value,value 设为空,利用 hashtable 中 field 的唯一性
常用命令
命令 | 说明 |
---|---|
sadd [key] [value] [value] …… | |
smembers [key] | 获取 key 里面的数据 |
sdiff [key] [key] | 比较多个 key 的结果集差异(去掉相同元素) |
使用场景
- 标签,标记用户属于那一类型
- 交集、并集、差集
SortedSet
多了顺序的概念(score)
存储结构
ziplist
skiplist + hashtable
skiplist(跳跃表):
常用命令
命令 | 说明 |
---|---|
zadd [key] [score][value] [score][value] …… | |
zscore [key] [value] | 获取 score |
zrange [key] [from] [to] | 将区间内的数据,以 scores 排序输出 |
zrange [key] [from] [to] withscores | 将区间内的数据,以 scores 排序,携带 scores 输出 |
zrevrange [key] [from] [to] | 递减排序 |
使用场景
- 排序