Redis深入之对象

Redis对象系统

前面介绍了Redis用到的所有主要数据结构,如简单动态字符串(SDS)、双端链表、字典、压缩列表、整数集合等

Redis并没有直接使用这些数据结构来实现键值对数据库,而是基于这些数据结构创建了一个对象系统,这个系统包含字符串对象、列表对象、哈希对象、集合对象和有序集合对象这五种类型的对象,每种对象都用到了至少一种我们前面所介绍的数据结构。

Redis对象系统还实现了内存回收机制、对象共享机制。Redis的对象带有访问时间记录信息,该信息可以用于计算数据库键的空转时长,空转时长较大的那些键可能会优先被服务器删除。

SET命令创建一个新的键值对,SET msg “hello world”

包含两个对象,键对象和值对象,每个对象都由一个redis对象结构表示,有3个属性和保存数据有关,type类型,encoding:编码和ptr:指向底层实现数据结构的指针。

键总是一个字符串对象,值可以是字符串对象、列表对象、哈希对象、集合对象或有序集合对象中的一种。

Redis > SET msg“hello world”   字符串对象

Redis >RPUSHnumbers  1 3 5  列表对象

Redis> HMSETprofile name Tom age 25 career Programmer 哈希

Redis>SADDfruits apple banana cherry  集合

Redis>ZADDprice 8.5 apple 5.0 banana 6.0 cherry 有序集合

使用OBJECT ENCODING命令可以查看一个数据库键的值对象的编码

String——INT整形、RAW简单动态字符串

LIST——ZIPLIST压缩列表、LINKEDLIST双端链表

HASH——ZIPLIST压缩列表、HT字典

SET——INTSET整数集合、HT字典

ZSET——ZIPLIST压缩列表、SKIPLIST跳跃表和字典

通过encoding属性来设定对象所使用的编码,而不是为特定类型的对象关联一种固定的编码,极大地提升了Redis的灵活性和效率,因为Redis可以根据不同的使用场景来为一个对象设置不同的编码,从而优化对象在某一场景下的效率。

比如:在列表对象包含的元素比较少时,Redis使用压缩列表作为列表对象的底层实现:

因为压缩列表比双端链表更节约内存,并且在元素数量较少时,在内存中以连续块方式保存的压缩列表比起双端链表可以更快地载入到缓存中。

随着列表对象包含的元素越来越多,使用压缩列表来保存元素的优势逐渐消失,对象就会将底层实现从压缩列表转向功能更强、也更适合保存大量元素的双端链表上面。

时间: 2024-11-05 06:39:19

Redis深入之对象的相关文章

[转] Redis 存储List对象

如果需要用到Redis存储List对象,而list又不需要进行操作,可以按照MC的方式进行存储,不过Jedis之类的客户端没有提供API,可以有两种思路实现: 1.      分别序列化 elements ,然后 set 存储 2.    序列化List对象,set存储 这两种方法都类似MC的 Object方法存储,运用这种方式意味着放弃Redis对List提供的操作方法. import net.spy.memcached.compat.CloseUtil; import net.spy.mem

Redis如何存储对象与集合示例详解

前言 大家都知道在项目中,缓存以及mq消息队列可以说是不可或缺的2个重要技术.前者主要是为了减轻数据库压力,大幅度提升性能.后者主要是为了提高用户的体验度,我理解的是再后端做的一个ajax请求(异步),并且像ribbmitmq等消息队列有重试机制等功能. 这里主要讲redis/303688.html">redis如何把对象,集合存入,并且取出.下面话不多说了,来一起看看详细的介绍吧. 1.在启动类上加入如下代码 private Jedis jedis;private JedisPoolCo

redis jedis存储对象简单操作,map list 自定义对象

安装好redis,进行了基本的操作.包括对map list 和自定义对象的基本操作.笔记都在代码注释里,直接上代码. private Jedis jedis; @Before public void before() { jedis = new Jedis("127.0.0.1"); } /** * 简单添加 */ @Test public void test1() { String name = "name"; String value = "qq&qu

Python中 redis StrictRedis对象操作string类型

准备 在桌面上创建redis目录 使用pycharm打开 redis目录 创建redis_string.py文件 from redis import * if __name__=="__main__": try: #创建StrictRedis对象,与redis服务器建?连接 sr=StrictRedis() except Exception as e: print e string-增加 ?法set,添加键.值,如果添加成功则返回True,如果添加失败则返回False 编写代码如下 f

redis 数据类型和对象类型

1 数据类型 这些数据结构我们并不会用到,他是redis底层的数据结构. 我们能够用到的是对象 1.1 简单动态字符串 redis中的字符串使用的是 struct sdshdr { int len; //已用长度 int free; //未用长度 char buf[]; // buf 的大小为len+free+1 } 最后依然兼容c的字符串,最后一个字节使用'\0',因此最终的总长度为len+free+1 相比较c的字符串优点在于: o(1)内获得字符串长度 避免了缓冲区溢出 减少了修改字符串带

Redis实现之对象(三)

集合对象 集合对象的编码可以是intset或者hashtable,intset编码的集合对象使用整数集合作为底层实现,集合对象包含的所有元素都被保存在整数集合里面.举个栗子,以下代码将创建一个图1-12所示的intset编码集合对象: 127.0.0.1:6379> SADD numbers 1 3 5 (integer) 3 127.0.0.1:6379> OBJECT ENCODING numbers "intset" 图1-12   inset编码的numbers集合

redis系列之------对象

前言 Redis 并没有直接使用数据结构来实现键值对 数据库, 而是基于这些数据结构创建了一个对象系统, 这个系统包含字符串对象.列表对象.哈希对象.集合对象和有序集合对象这五种类型的对象, 每种对象都用到了至少一种我们前面所介绍的数据结构. 通过这五种不同类型的对象, Redis 可以在执行命令之前, 根据对象的类型来判断一个对象是否可以执行给定的命令. 使用对象的另一个好处是, 我们可以针对不同的使用场景, 为对象设置多种不同的数据结构实现, 从而优化对象在不同场景下的使用效率. 除此之外,

redis 序列化存入对象

//序列化 public static byte [] serialize(Object obj){ ObjectOutputStream obi=null; ByteArrayOutputStream bai=null; try { bai=new ByteArrayOutputStream(); obi=new ObjectOutputStream(bai); obi.writeObject(obj); byte[] byt=bai.toByteArray(); return byt; }

Redis 基础数据结构与对象

Redis用到的底层数据结构有:简单动态字符串.双端链表.字典.压缩列表.整数集合.跳跃表等,Redis并没有直接使用这些数据结构来实现键值对数据库,而是基于这些数据结构创建了一个对象系统,这个系统包括字符串对象.列表对象.哈希对象.集合对象和有序结合对象共5种类型的对象. 1 简单动态字符串 redis自定义了简单动态字符串数据结构(sds),并将其作为默认字符串表示. struct sdshdr { unsigned int len; unsigned int free; char buf[