GP -- redis数据结构、存储结构

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] []

使用场景

  1. Session: 序列化存到 redis 中。
  2. IP 限制:原子递增 ,计数器
  3. 短信验证:每分钟发 一次……

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]获取列表长度

使用场景

  1. 消息队列:生产者 lpush, 消费者 brpop
  2. 实现栈:lpush + lpop
  3. 实现队列: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–存在

使用场景

  1. 存储对象

Set

数据不能重复,无序。

存储结构

intset

hashtable

field-value,value 设为空,利用 hashtable 中 field 的唯一性

常用命令

命令说明
sadd [key] [value] [value] ……
smembers [key]获取 key 里面的数据
sdiff [key] [key]比较多个 key 的结果集差异(去掉相同元素)

使用场景

  1. 标签,标记用户属于那一类型
  2. 交集、并集、差集

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]递减排序

使用场景

  1. 排序
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值