持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第3天,点击查看活动详情
本文已参与「新人创作礼」活动,一起开启掘金创作之路。
redis数据结构:
string(字符串)、hash(哈希)、list(列表)、set(集合)、zset(有序集合)如图所示
1.1字符串
字符串类型的值实际可以是字符串(简单的字符串、复杂的字符串(JSON、XML)、数字、二进制) 值最大不能超过512M
1.2 哈希
哈希类型是指键值本身又是一个键值对结构 redis的键值对和哈希二和的关系如图所示
1.3列表
列表类型是用来存储多个有序的字符串
1.4集合
集合是类型也是用来保存多个字符串元素,但是和列表类型不一样的是,集合中不允许有重复的元素,并且集合是无序的
1.5有序集合
有序集合保留了集合不能有重复成员的特性,并且是有序的 与列表不同,它是每个元素设置分数来进行排序的。
列表、集合和有序集合三者的异同点如图
这五种数据结构在redis内部都有各自的内部编码实现,如果遇到不同场景redis会转换内部编码。参考资料《redis开发与运维》
2.redis数据结构内部编码
设置内部编码好处 :改进内部编码对外部没有影响,若开发更优秀的内部编码,对外部是感知不到的; 多种内部编码实现可以在不同场景发挥各自的优势,例如ziplist比较省空间,但是列表元素较多的情况下,性能会有下降,redis会根据配置选项将列表类型的内部转换为likedlist。
2.1 字符串
字符串类型的内部编码有三种:int:8个字节的长整型;embstr:小于等于39个字节的字符串;raw:大于39个字节的字符串
2.2哈希
哈希类型的内部编码有两种:
·ziplist(压缩列表):当哈希类型元素个数小于hash-max-ziplist-entries 配置(默认512个)、同时所有值都小于hash-max-ziplist-value配置(默认64 字节)时,Redis会使用ziplist作为哈希的内部实现,ziplist使用更加紧凑的 结构实现多个元素的连续存储,所以在节省内存方面比hashtable更加优秀。
·hashtable(哈希表):当哈希类型无法满足ziplist的条件时,Redis会使 用hashtable作为哈希的内部实现,因为此时ziplist的读写效率会下降,而 hashtable的读写时间复杂度为O(1)。
2.3列表
列表类型的内部编码有两种。
·ziplist(压缩列表):当列表的元素个数小于list-max-ziplist-entries配置 (默认512个),同时列表中每个元素的值都小于list-max-ziplist-value配置时 (默认64字节),Redis会选用ziplist来作为列表的内部实现来减少内存的使 用。
·linkedlist(链表):当列表类型无法满足ziplist的条件时,Redis会使用 linkedlist作为列表的内部实现。
2.4集合
集合类型的内部编码有两种:
·intset(整数集合):当集合中的元素都是整数且元素个数小于set-max- intset-entries配置(默认512个)时,Redis会选用intset
来作为集合的内部实 现,从而减少内存的使用。
·hashtable(哈希表):当集合类型无法满足intset的条件时,Redis会使 用hashtable作为集合的内部实现。
2.5有序集合
有序集合类型的内部编码有两种:
·ziplist(压缩列表):当有序集合的元素个数小于zset-max-ziplist- entries配置(默认128个),同时每个元素的值都小于zset-max-ziplist-value配 置(默认64字节)时,Redis会用ziplist来作为有序集合的内部实现,ziplist 可以有效减少内存的使用。
·skiplist(跳跃表):当ziplist条件不满足时,有序集合会使用skiplist作 为内部实现,因为此时ziplist的读写效率会下降。
参考 《redis开发与运维》 《redis设计与实现》