Redis五种基本数据类型

Redis五种基本数据类型

Redis 五种基本的数据类型分别是:String、List、Hash、Set、ZSet。
这五种数据类型都是由Redis中的几种数据结构组成,然后封装在Redis的RedisObject中。所以我们先简单讲讲RedisObject的结构。

RedisObject

Redis中任意数据类型的键和值都会被封装为RedisObject。其源码如下:

typedef struct redisObject {
	// 对象类型,占4个bit,从0-4分代表String、List、Set、ZSet、Hash
	unsigned type:4;
	// 底层编码方式,占4个bit,共有11种
	unsigned encoding:4;
	// LRU_BITS为24,lru表示本对象最后一次被访问的时间
	unsigned lru:LRU_BITS;
	// 对象引用计数器,计数器为0说明无人引用,可以被回收
	int refcount;
	// 指向实际被封装数据的地址
	void *ptr;
} robj;
  • encoding11种编码方式
    encoding编码
  • 五种数据类型分别使用对应的哪种编码方式
    在这里插入图片描述

String

  • String是Redis中最常见的数据类型,String类型是二进制安全的,意思是 redis 的 string 可以包含任何数据。如数字,字符串,jpg图片或者序列化的对象。
  • 基本编码方式是:RAW,基于简单动态字符串(SDS)实现,存储上限为512mb;
  • 如果SDS长度小于44字节,则会采用EMBSTR编码,此时object head与SDS是一段连续的空间。申请内存时只需要调用一次内存分配函数,效率更高。
  • 如果存储的字符串是整数,并且大小在LONG_MAX范围内,则会采用INT编码;直接将数据保存在RedisObject的ptr指针位置(刚好8字节),不再需要SDS。

不同编码方式的结构

在这里插入图片描述

String常见命令使用

string命令

List

Redis中的List结构类似于一个双端链表,可以从首、尾对列表进行操作,元素可以重复。

  • 在Redis3.2版本之前,Redis采用LinkedList和 ZipList 来实现List,当元素数量小于512并且元素大小小于64字节时采用 ZipList 编码,超过则采用LinkedList编码;
  • 在Redis3.2版本之后,Redis统一采用 QuickList 来实现List;

List结构

List结构

List常见命令使用

List命令

  • 使用列表的技巧
    • lpush+lpop=Stack(栈)
    • lpush+rpop=Queue(队列)
    • lpush+ltrim=Capped Collection(有限集合)
    • lpush+brpop=Message Queue(消息队列)

Set

  • Redis 的 Set 是 String 类型的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据。
  • Redis 中集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是 O(1)。
  • 采用的是Redis中的HT编码(Dict)。其中Dict的key为存储的数据,value为null。
  • 当存储的所有数据都是整数,并且元素数量不超过set-max-intset-entries时,Set会采用 IntSet 编码,以节省空间。

Set结构

Set结构

Set常见使用命令

Set命令

ZSet

Redis 有序集合和集合一样也是 string 类型元素的集合,且不允许重复的成员。不同的是每个元素都会关联一个 double 类型的分数。redis 正是通过分数来为集合中的成员进行从小到大的排序;
所以ZSet有如下特点:

键值存储
键必须唯一
可排序

Redis中ZSet通过两个数据结构(Dict + SkipList)来实现。

typedef struct zset{
	dict *dict;
	zskiplist *zsl;
}

Zset结构

ZSet结构
当元素数量不多时,HT和SkipList的优势不明显,而且更耗内存。因此zset还会采用 ZipList 结构来节省内存,不过需要同时满足两个条件:

  • 元素数量小于zset_max_ziplist_entries,默认值128
  • 每个元素都小于zset_max_ziplist_value字节,默认值64

ziplist本身没有排序功能,而且没有键值对的概念,因此需要有zset通过编码实现:

  • zipList是连续内存,因此score和element是紧挨在一起的两个entry,element在前,score在后
  • score越小越接近队首,score越大越接近队尾,按照score值升序排列

ZSe常见命令

ZSet命令

Hash

Hash 是一个 string 类型的 field(字段) 和 value(值) 的映射表,hash 特别适合用于存储对象。
Hash与ZSet非常类似

都是键值存储
都需要根据键获取值
键必须唯一

区别

  • zset键是member,值是score;Hash键值任意;
  • zset需要根据score排序;Hash无需排序;

Hash结构

Hash结构默认采用ZipList编码,用以节省内存。ZipList中相邻的两个entry分别保存field和value

结构1

当数据量较大时,Hash结构会转为HT (Dict) 编码,也就是Dict,触发条件有两个:

  • ZipList中的元素数量超过了hash-max-ziplist-entries(默认512),
  • zipList中的任意entry大小超过了hash-max-ziplist-value (默认64字节)

结构2

Hash常见命令

Hash命令

参考文章

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值