首页 > 数据库 >redis数据结构编码优化(1)

redis数据结构编码优化(1)

时间:2023-07-12 21:55:39浏览次数:40  
标签:编码 ENCODING redis redisObject REDIS 键值 数据结构 define

redis数据结构内部编码优化(1)

Redis可以通过内部编码规则来节省空间。Redis为每种数据类型提供了两种内部编码方式。以散列类型为例,散列类型是通过散列表实现的,这样就可以实现o(1)时间复杂度的查找、赋值操作,然而当键中元素很少的时候,o(1)的操作并不会比o(n)有明显的性能提高,所以这种情况下redis会采用一种更为紧凑但性能稍差的内部编码方式。当键中元素变多时,redis会自动将该键的内部编码方式转换成散列表。

redis的每一个键值都是使用一个redisObject结构保存的,redisObject的定义如下:

typedef struct redisObject 
{ 
	unsigned type:4; 			  //当前值对象的数据类型
	unsigned encoding:4;          //当前值对象底层编码类型
	unsigned lru:REDIS_LRU_BITS;  //存储最后一次使用此对象的时间等信息
	/* lru time (relative to server.lruclock) */  
	int refcount; 				  // 记录对象引用次数
	void *ptr;					  //指向真正底层数据结构的指针
} robj;

其中type字段表示的是键值的数据类型,取值可以是如下内容

#define REDIS_STRING 0
#define REDIS_LIST 1
#define REDIS_SET 2
#define REDIS_ZSET 3
#define REDIS_HASH 4

encoding字段表示的就是Redis键值的内部编码方式,取值可以是:

#define REDIS_ENCODING_RAW 0 
#define REDIS_ENCODING_INT 1
#define REDIS_ENCODING_HT 2
#define REDIS_ENCODING_ZIPMAP 3
#define REDIS_ENCODING_LINKEDLIST 4
#define REDIS_ENCODING_ZIPLIST 5
#define REDIS_ENCODING_INTSET 6
#define REDIS_ENCODING_SKIPLIST 7
数据类型 可使用的编码方式(元素多/元素少)
字符串string raw,int
散列类型hash hashtable,zipist
列表类型list linkedlist,ziplist
集合类型set hashtable,intset
有序集合类型zset skiplist,ziplist

字符串类型

redis使用一个sdshdr类型的变量来存储字符串,而redisObject的ptr字段指向的是该变量的地址。
reids中key的类型为字符串类型

sdshdr的定义如下:

struct sdshdr {
  int len;
  int free;
  char buf[];
}

其中len字段表示的是字符串的长度,free字段表示buf中的剩余空间,而buf字段存储的才是字符串的内容。

所以当之心SET key foobar时,存储简直需要占用的空间是sizeof(redisObject)+sizeof(sdshdr)+strlen("foor") = 30字节

而当键值内容可以用一个64位有符号整数表示时,redis会将键值转换成long类型来存储。如SET key 123456,实际占用的空间是sizeof(redisObject) = 16字节,比存储"foobar"节省一半的存储空间

img

redisObject中的refcount字段存储的是该键值被引用数量,即一个键值可以被多个键引用。redis启动后会预先建立10000个分别存储从0到9999这些数字的redisObject类型变量作为共享对象,如果要设置的字符串键值在这10000个数字内(如SET key1 123)则可以直接引用共享对象而不用再建立一个redisObject了,也就是说存储键值占用的空间是0字节

img

当执行了SET key1 123和SET key2 123后,key1和key2两个键都直接应用了一个已经建立好的共享对象,节省了存储空间

标签:编码,ENCODING,redis,redisObject,REDIS,键值,数据结构,define
From: https://www.cnblogs.com/zpf253/p/17548969.html

相关文章

  • 数据结构-链表带哨兵
    一.链表带哨兵importjava.util.Iterator;importjava.util.function.Consumer;//带哨兵publicclassshuju02implementsIterable<Integer>{//整体privateNodehead=newNode(666,null);//头指针​@Override​publicIterator<Integer>iterator(){​......
  • 说透MySQL:从数据结构到性能优化,附实际案例和面试题
    typora-copy-images-to:imgmysql索引第一章MySQL性能(掌握)1分析-数据库查询效率低下我们进入公司进行项目开发往往关注的是业务需求和功能的实现,但是随着项目运行的时间增加,数据量也就增加了,这时会影响到我们数据库的查询性能。所以我们要提高操作数据库的性能,有如下两种方式:1.......
  • golang的list数据结构demo
    packagemainimport"container/list"funcmain(){varmylistlist.List//放在尾部mylist.PushBack("go")mylist.PushBack("grpc")mylist.PushBack("mysql")//头部放数据mylist.PushFront("gi......
  • docker 安装 docker 并下载mysql redis镜像
    **步骤:1.Uninstalloldversions(卸载旧版本): sudoyumremovedocker\         docker-client\         docker-client-latest\         docker-common\         docker-latest\  ......
  • 数据结构泛做
    为啥这个一向很讨厌ds题的人会在临考前做根号题呢,懂得都懂.(因为上课只有想这种不用脑子的东西才能想出来)10月15日CFeduF题不知道这题我为啥要想这么久,看来是应该好好休息一下了大意就是单点修改,询问[l,r]区间每个数的出现次数是否都是k的倍数第一,要知道分块是可以O(......
  • 数据结构学习2
    5、线性表的链式存储结构①定义链式存储:用一组任意的存储单元存储线性表中的数据元素。线性链表:用这种方法存储的线性表简称线性链表。特点:结点在存储器中的位置是随意的,即在逻辑上相邻的数据元素在物理上不一定相邻。实现:为了正确表示结点间的逻辑关系,在存储每个结点......
  • redis学习十九:redis复制
    定义:主从复制,master以写为主,slave以读为主当master数据变化的时候,自动将新的数据异步同步到其他slave数据库作用:1.读写分离2.容灾备份3.数据备份4.水平扩容支撑高并发如何实现:配从库不配主库权限细节:master如果配置了requirepass参数,需要密码登录那么slave就需要配置ma......
  • Media Encoder 2023-视频编码软件mac/win版
    AdobeMediaEncoder2023是Adobe公司推出的一款专业的媒体编码和转换软件。作为AdobeCreativeCloud套件的一部分,它与其他Adobe创意应用程序(如PremierePro、AfterEffects)无缝集成,提供了一个强大的工具集,用于优化、转换和编码各种媒体文件。→→↓↓载MediaEncoder2......
  • redis工具类
    @ComponentpublicclassRedisUtils{@AutowiredprivateRedisTemplate<String,Object>redisTemplate;@AutowiredprivateValueOperations<String,String>valueOperations;@AutowiredprivateHashOperations<String,Strin......
  • 解决redis可视化的具体操作步骤
    实现Redis可视化概述在介绍实现Redis可视化的步骤之前,我们先来了解一下Redis和可视化的概念。Redis是一个开源的内存数据结构存储系统,可以用作数据库、缓存、消息中间件等。它支持多种数据结构,如字符串、哈希表、列表、集合等,并提供了丰富的命令和功能,使得开发者可以方便地操作......