ITKeyword,专注技术干货聚合推荐

注册 | 登录

Redis不同数据类型的的数据结构实现

标签:

相关推荐:Redis与Java - 数据结构

Redis与Java标签 : Java与NoSQL Redis(REmote DIctionary Server) is an open source (BSD licensed), in-memory data structure store, used as datab

我们知道Redis支持五种数据类型,分别是字符串、哈希表(map)、列表(list)、集合(set)和有序集合,和Java的集合框架类似,不同数据类型的数据结构实也是不一样的。>>Redis中的redisObject对象Redis是使用C编写的,内部实现了一个struct结构体redisObject对象,通过结构体来模仿面向对象编程的“多态”,作为一个底层的数据支持,redisObject代码:/* * Redis 对象 */typedef struct redisObject {

// 类型

unsigned type:4;

// 对齐位

unsigned notused:2;

// 编码方式

unsigned encoding:4;

// LRU 时间(相对于 server.lruclock)

unsigned lru:22;

// 引用计数

int refcount;

// 指向对象的值

void *ptr;} robj; 其中type、encoding、ptr3个属性分别表示:type:redisObject的类型,字符串、列表、集合、有序集、哈希表encoding:底层实现结构,字符串、整数、跳跃表、压缩列表等ptr:实际指向保存值的数据结构如果一个 redisObject 的 type 属性为 REDIS_LIST , encoding 属性为 REDIS_ENCODING_LINKEDLIST ,那么这个对象就是一个 Redis 列表,它的值保存在一个双端链表内,而 ptr 指针就指向这个双端链表;如果一个 redisObject 的 type 属性为 REDIS_HASH , encoding 属性为 REDIS_ENCODING_ZIPMAP ,那么这个对象就是一个 Redis 哈希表,它的值保存在一个 zipmap 里,而 ptr 指针就指向这个 zipmap 。下面这张图片中的REDIS_STRING/REDIS_LIST/REDIS_ZSET/REDIS_HASH/REDIS_SET针对的是redisObject中的type,后面指向的REDIS_ENCODING_LINKEDLIST等针对的是encoding字段。Redis的底层数据结构有以下几种:简单动态字符串sds(Simple Dynamic String)双端链表(LinkedList)字典(Map)跳跃表(SkipList)下面针对五种数据类型,学习相关的底层数据结构。>>String如果一个String类型的val

相关推荐:实时投票系统:数据类型上的差异:memcache和redis - 程序开发中遇到的问题

最近要写一个类投票的系统:由于访问量可能会比较大,最好不直接使用mysql数据库,完全使用缓存的话,存在缓存失效等的风险,因此在mysql上面写个缓存中间过渡:

ue能够保存为整数,则将对应redisObject 对象的encoding修改为REDIS_ENCODING_INT,将对应robj对象的ptr值改为对应的数值。如果不能转为整数,保持原有encoding为REDIS_ENCODING_RAW。因此String类型的数据可能使用原始的字符串存储(实际为sds - Simple Dynamic Strings,对应encoding为REDIS_ENCODING_RAW)或者整数存储。Redis可以直接查看对象的ENCODING值:redis:6379> set strtest 1OKredis:6379> OBJECT ENCODING strtest"int"redis:6379> set strtest blogOKredis:6379> OBJECT ENCODING strtest"raw"

>>List列表的底层实现有2种:REDIS_ENCODING_ZIPLISTREDIS_ENCODING_LINKEDLISTZIPLIST相比LINKEDLIST可以节省内存,当创建新的列表时,默认是使用压缩列表作为底层数据结构的。Redis内部会对相关操作做判断,当list的elem数小于配置值: hash-max-ziplist-entries 或者elem_value字符串的长度小于 hash-max-ziplist-value, 可以编码成 REDIS_ENCODING_ZIPLIST 类型存储,以节约内存;但由于在zip list添加和删除元素会涉及到数据移动,因此当list内容较多时,使用双向链表。>>Hash创建新的Hash类型时,默认也使用ziplist存储value,保存数据过多时,使用hast table。>>Set集合的底层实现也有两种:REDIS_ENCODING_INTSETREDIS_ENCODING_HT(字典)创建Set类型的key-value时,如果value能够表示为整数,则使用intset类型保存value。数据量大时,切换为使用hash table保存各个value。>>Sorted Set有序集合的底层实现也是2种:REDIS_ENCODING_ZIPLISTREDIS_ENCODING_SKIPLIST关于Redis中的跳跃表,查看这篇文章:跳跃表跳跃表在 Redis中的使用,就是实现有序集合数据类型。 非一手资料,相关分析整理自论坛博客等,版本Redis 2.6。了解更多:Redis 数据类型 

相关推荐:redis快速入门-数据类型

前言最近因项目需要用到redis,所以借助《Redis入门指南》(李子骅 编著)这本书快速入门了一下,此处记录下一些知识点(主要是命令),方便以后查阅。简

我们知道Redis支持五种数据类型,分别是字符串、哈希表(map)、列表(list)、集合(set)和有序集合,和Java的集合框架类似,不同数据类型的数据结构实也是不一样的。>>Redis中的redisObj...

相关阅读排行


用户评论

游客

相关内容推荐

最新文章

×

×

请激活账号

为了能正常使用评论、编辑功能及以后陆续为用户提供的其他产品,请激活账号。

您的注册邮箱: 修改

重新发送激活邮件 进入我的邮箱

如果您没有收到激活邮件,请注意检查垃圾箱。