当前位置: 首页 > 后端技术 > Java

Redis的类型(type)和编码(encoding)

时间:2023-04-01 14:13:41 Java

本文已收录在Github,各种场景推荐阅读。在Redis中,数据类型(type)和编码(encoding)是非常重要的概念。本篇博客将详细介绍Redis支持的数据类型、对应的编码方式和底层实现原理。查看Redis中某个key的内部编码,可以使用Redis命令OBJECTENCODINGkey。其中key为你要查询的键名。例如,如果要查询名为mykey的key的内部编码,可以执行如下命令:127.0.0.1:6379>objectencodingmykey//查看某个Rediskey值的编码。redisObject在Redis中,redisObject是最基本的数据结构之一。redisObject用于表示Redis中键值对中的值,可以是字符串、整数、列表、哈希表等任何Redis数据类型。redisObject的定义如下:typedefstructredisObject{//类型无符号类型:4;//编码方式unsignedencoding:4;//引用计数intrefcount;//指向实际值的指针void*ptr;}robj;type:representationRedisObject的类型。encoding:表示redisObject的编码方式。refcount:表示当前redisObject被引用的次数。ptr:ptr字段是指向实际Redis对象的指针。Redis源编码值如下:#defineOBJ_ENCODING_RAW0/*Rawrepresentation*/#defineOBJ_ENCODING_INT1/*Encodedasinteger*/#defineOBJ_ENCODING_HT2/*Encodedashashtable*/#defineOBJ_ENCODING_ZIPMAP3/*Encodedaszipmap*/#defineOBJ_ENCODING_LINKEDLIST4/*不再使用:旧列表编码。*/#defineOBJ_ENCODING_ZIPLIST5/*编码为ziplist*/#defineOBJ_ENCODING_INTSET6/*编码为intset*/#EncodedasLISTIPSKIDING_7/*skiplist*/#defineOBJ_ENCODING_EMBSTR8/*嵌入式sds字符串编码*/#defineOBJ_ENCODING_QUICKLIST9/*Encodedaslinkedlistofziplists*/类型和编码介绍Redis支持五种主要数据类型:字符串(string)、列表(list)、集合(set)、有序集合(sortedset)和散列(hash)。每种数据类型都有对应的编码方式。数据类型和编码方式概述如下:数据类型编码方式stringint,embstr,rawhashtableziplist,hashtablelistziplist,linkedlist,quicklistsetintset,hashtableorderedsetziplist,skipliststringstring是Redis中最基本的一种数据类型,通常用于存储文本或二进制数据。Redis支持两种编码方式:int:当一个字符串可以表示为整数时,Redis会将其转换为整数并以int编码存储。int编码方式的优点是存储空间小,运行效率高。缺点是只能存储整数,不支持字符串操作。embstr(embstr-encodedstring):保存一个长度小于44字节的字符串。当字符串比较短时,使用这种编码方式存储,可以减少内存占用。raw(raw-encodedstring):保存长度大于44字节的字符串。当字符串比较长时,使用这种编码方式存储。列表列表是有序的字符串集合,可以从中添加、修改和删除元素。Redis支持三种编码方式:ziplist:在Redis3.2之前,当List列表中每个字符串的长度小于64字节且List列表中的元素个数小于512时,List对象使用ziplist编码,否则使用链表编码。ziplist是一种紧凑的压缩列表结构,可以节省内存。适合小列表。链表:链表是一种链表结构,支持任意大小的列表。但是它的内存使用量随着列表的长度而增加。quicklist:redis3.2版本引入,quicklist是由多个ziplist组成的list结构,既能保证性能,又能节省内存。适用于大型列表。集合集合是无序的字符串集合,支持添加、删除和查询元素。Redis支持两种编码方式:intset:当集合中的元素都是整数时,Redis会使用intset编码来存储。intset编码方式的优点是存储空间小,运行效率高。hashtable:当集合中的元素包含字符串时,Redis会使用hashtable编码来存储。hashtable编码方式的优点是可以存储任意类型的元素,支持字符串操作。缺点是存储空间比较大,运行效率比较低。有序集是一组无序的字符串,每个元素都与一个分数相关联,并且可以根据分数进行排序。Redis支持两种编码方式:ziplist:使用ziplist编码保存少于128个元素且所有元素的大小都小于64字节,ziplist是一种紧凑的压缩列表结构,适用于小型有序集合。skiplist:skiplist是一种skip表结构,支持快速查询和排序。适用于大型分类集合。哈希表哈希表是键值对的集合,每个键都与一个值相关联。Redis支持两种编码方式:ziplist:hash对象中存储的所有键值的字符串长度小于64字节且键值对的个数小于512。Redis将使用ziplist编码进行存储。ziplist编码方式的优点是存储空间小,运行效率高。缺点是不支持快速键查找操作。hashtable:除了以上条件,Redis还会使用hashtable编码来存储。hashtable编码方式的优点是支持快速的key查找操作。缺点是存储空间比较大,运行效率比较低。类型和编码的底层原理了解了Redis支持的数据类型和编码方式之后,我们来看看它们的底层实现原理。编码转换Redis中的每个键值对都有一个类型标识,表示该键值对的数据类型。当我们对一个key进行操作时,Redis会根据key当前的编码方式和操作所需要的编码方式对键值对进行转换。例如,当我们向字符串追加内容时,如果字符串当前的编码是raw,但是新的内容可以以embstr编码存储,那么Redis会将字符串的编码从raw转换为embstr。数据结构除了编码方式,Redis还使用了很多经典的数据结构来实现各种数据类型。例如,Redis列表和哈希表是使用链表结构实现的。有序集使用跳跃表(SkipList)这种高效的数据结构。这些数据结构都经过精心设计和优化,以满足各种场景下的应用需求。例如,链表结构适合频繁增删元素,而跳表结构适合排序和查找。小结本篇博客主要介绍Redis支持的五种主要数据类型以及对应的编码方式。Redis的数据类型和编码方式都是为了在不同的场景下实现最佳的性能和内存使用。在使用Redis时,需要根据实际情况选择合适的数据类型和编码方式,以达到最佳效果。同时,需要注意不同数据类型和编码方式的优缺点,以便在实际使用中做出合理的选择。本文就到此为止,感谢大家的阅读,如果本博客有什么错误或者建议,欢迎大家留言指正。文章持续更新中,大家可以关注公众号第一时间阅读。