Redis五大数据类型的实现原理

Redis五大数据类型

Redis不仅仅支持简单的k/v类型的数据,同时还提供list,set,zset,hash等数据结构的存储,它还支持数据的备份,即master-slave模式的数据备份,同样Redis支持数据的持久化,可以将内存中的数据保持在磁盘中,重启的时候可以再次加载进行使用。

Redis支持的五大数据类型包括String(字符串 用法: 键 值),Hash(哈希 类似Java中的 map 用法: 键 键值对),List(列表 用法:键 集合 不可以重复),Set(集合 用法:键 集合 可以重复),Zset(sorted set 有序集合 用法: 键 值 值)

String(字符串)

string 类型是二进制安全的。意思是 redis 的 string 可以包含任何数据。比如jpg图片或者序列化的对象。

string 类型是 Redis 最基本的数据类型,string 类型的值最大能存储 512MB。

内部编码运用场景

字符串对象的编码可以是int,raw或者embstr。

1、int 编码:保存的是可以用 long 类型表示的整数值。

2、raw 编码:保存长度大于44字节的字符串(redis3.2版本之前是39字节,之后是44字节)。

3、embstr 编码:保存长度小于44字节的字符串(redis3.2版本之前是39字节,之后是44字节)。

127.0.0.1:6379> set str  1234
OK
127.0.0.1:6379> object encoding str
"int"
127.0.0.1:6379> set str "hello word"
OK
127.0.0.1:6379> object encoding str
"embstr"
127.0.0.1:6379> set str "hello word,你好世界,你好我好大家好,真的好,哈哈哈哈哈哈哈哈或或或"
OK
127.0.0.1:6379> object encoding str
"raw"

int 编码是用来保存整数值,raw编码是用来保存长字符串,而embstr是用来保存短字符串。其实 embstr 编码是专门用来保存短字符串的一种优化编码

应用场景
对于string 数据类型,因为string 类型是二进制安全的,可以用来存放图片,视频等内容,另外由于Redis的高性能读写功能,而string类型的value也可以是数字,可以用作计数器(INCR,DECR),比如分布式环境中统计系统的在线人数,秒杀等。

Hash(哈希)

哈希对象的键是一个字符串类型,值是一个键值对集合

内部编码运用场景
ziplist(压缩列表):元素个数小于hash-max-ziplist-entries(默认512个)且同时所有值都小于+ + hash-max-ziplist-value(默认64字节)

hashtable(哈希表):无法满足ziplist的条件时

127.0.0.1:6379> hmset hash filed1 1 filed2 2 filed3 3
OK
127.0.0.1:6379> object encoding hash
"ziplist"
127.0.0.1:6379> hset hash  filed4 "hello word,你好世界,你好我好大家好,真的好,哈哈哈哈哈哈哈哈还........"
(integer) 1
127.0.0.1:6379> object encoding hash
"hashtable"

hashtable 编码的哈希表对象底层使用字典数据结构,哈希对象中的每个键值对都使用一个字典键值对。

应用场景
  对于 hash 数据类型,value 存放的是键值对,比如可以做单点登录存放用户信息。

List(列表)

内部编码运用场景
(3.2版本之前)
ziplist(压缩列表):同哈希的ziplist
linkedlist(链表):无法满足ziplist的条件时
3.2版本之后统一使用的是了quicklist,由于我使用的redis版本为3.2.100,关于3.2版本之前的内部编码不再演示

127.0.0.1:6379> rpush list a b c
(integer) 3
127.0.0.1:6379> object encoding list
"quicklist"

应用场景
对于 list 数据类型,可以实现简单的消息队列,另外可以利用lrange命令,做基于redis的分页功能

Set(集合)

Redis的Set是string类型的无序集合。

集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)。

sadd 命令

添加一个 string 元素到 key 对应的 set 集合中,成功返回1,如果元素已经在集合中返回 0,如果 key 对应的 set 不存在则返回错误。

内部编码运用场景
intset(整数集合):集合中的元素都是整数且元素个数小于set-max-intset-entries(默认512个)
hashtable(哈希表):无法满足intset的条件时

127.0.0.1:6379> sadd set 1 2 3
(integer) 3
127.0.0.1:6379> object encoding set
"intset"
127.0.0.1:6379> sadd set 1 2 3 a
(integer) 1
127.0.0.1:6379> object encoding set
"hashtable"

应用场景
对于 set 数据类型,由于底层是字典实现的,查找元素特别快,另外set 数据类型不允许重复,利用这两个特性我们可以进行全局去重,比如在用户注册模块,判断用户名是否注册

zset(sorted set:有序集合)

Redis zset 和 set 一样也是string类型元素的集合,且不允许重复的成员。

不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。

zset的成员是唯一的,但分数(score)却可以重复。

内部编码运用场景
ziplist(压缩列表):当元素个数小于zset-max-ziplist-entries(默认128个),同时每个元素的值都小于zset-max-ziplist-value(默认64字节)时
skiplist(跳跃表):ziplist条件不满足时

有序集合的编码可以是 ziplist 或者 skiplist。

ziplist 编码的有序集合对象使用压缩列表作为底层实现,每个集合元素使用两个紧挨在一起的压缩列表节点来保存,第一个节点保存元素的成员,第二个节点保存元素的分值。并且压缩列表内的集合元素按分值从小到大的顺序进行排列,小的放置在靠近表头的位置,大的放置在靠近表尾的位置。

27.0.0.1:6379> zadd price 8.5 apple 5.0 banana 6.0 cherry
(integer) 3
27.0.0.1:6379> zrange price 0 -1
"banaba"
"cherry"
"apple"

应用场景
对于 zset 数据类型,有序的集合,可以做范围查找,排行榜应用,取 TOP N 操作等

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值