redis之redisObject对象

目录

redisObject对象

1 redisObject对象的底层结构

2 redisObject对象示意图

3 使用redisObjec对象的好处 

4 type,encoding,数据类型和底层数据结构的关系


redisObject对象

无论什么数据类型,redis都是以key-value形式保存,并且所有的key都是字符串
redis每存储一条数据,都会生成一个redisObject对象,通过redisObject对象来表示存储的数据

redisObject对象是联结外部数据类型和redis底层数据结构的桥梁

redisObject对象至少包括:
1) 用来描述具体数据的类型
2) 存储的具体数据

1 redisObject对象的底层结构

结构如下:

typedef struct redisObject {
  unsigned type:4;
  unsigned encoding:4;
  unsigned lru:LRU_BITS;
  int refcount;
  void *ptr;
} robj;

其中:

type:数据类型,占4bit,目前包括:REDIS_STRING(字符串)、REDIS_LIST(列表)、REDIS_HASH(哈希)、REDIS_SET(集合)、REDIS_ZSET(有序集合)

encoding:储存的具体数据对应的redis底层编码,占4bit

lru:对象最后一次被访问的时间,用于redis内存回收算法淘汰key

refcount:引用计数,允许redisObject对象在某些情况下被共享

ptr:指向数据的指针,实际指向数据类型对应的底层数据结构

2 redisObject对象示意图

66c6927ccc1b1bd60f8692db402ebddc.png

3 使用redisObjec对象的好处 

   1) 执行redis命令时,可以通过redisObject 的type和encoding属性来确定是否可以执行相应的命令,不用等操作具体的数据时才发现命令不可执行
 2) 同一数据类型可以使用不同的底层编码,优化不同场景下的使用效率和节省内存
 3) 支持共享和引用计数。当对象被共享时,只占用一份内存拷贝,节省内存
 4) 根据lru属性并结合redis内存回收算法淘汰长时间未使用的key

4 type,encoding,数据类型和底层数据结构的关系

相同的type,可能对应不同的encoding:同一个数据类型,redis使用了不同的底层数据结构,导致在内存占用和查找性能上会有所不同

redis中每种数据类型都会有至少对应2种底层数据结构

typeredis数据类型编码encoding底层数据结构
REDIS_STRINGString(字符串)intREDIS_ENCODING_INTlong型整数的简单动态字符串
REDIS_STRINGString(字符串)embstrREDIS_ENCODING_EMBSTRembstr编码的简单动态字符串
REDIS_STRINGString(字符串)rawREDIS_ENCODING_RAW简单动态字符串
REDIS_LISTList(列表)ziplistREDIS_ENCODING_ZIPLIST压缩列表
REDIS_LISTList(列表)linkedlistREDIS_ENCODING_LINKEDLIST双向链表
REDIS_SETSet(集合)intsetREDIS_ENCODING_INTSET整数集合
REDIS_SETSet(集合)hashtableREDIS_ENCODING_HT字典
REDIS_ZSETSorted Set(有序集合)ziplistREDIS_ENCODING_ZIPLIST压缩列表
REDIS_ZSETSorted Set(有序集合)skiplistREDIS_ENCODING_SKIPLIST跳表+字典
REDIS_HASHHash(哈希)ziplistREDIS_ENCODING_ZIPLIST压缩列表
REDIS_HASHHash(哈希)hashtableREDIS_ENCODING_HT字典

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Java中使用Redis存储对象,需要将对象序列化为字节数组,常用的序列化方式有Java内置的序列化方式和JSON等。然后可以使用Jedis等Java Redis客户端库提供的set等方法将序列化后的字节数组存储Redis中。 以下是使用Java内置序列化方式存储对象Redis的示例代码: ```java import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import redis.clients.jedis.Jedis; public class RedisObjectStorage { public static void main(String[] args) { // 连接Redis Jedis jedis = new Jedis("localhost", 6379); // 序列化对象 Person person = new Person("Alice", 20); byte[] bytes = serialize(person); // 存储对象Redis jedis.set("my_obj".getBytes(), bytes); // 从Redis中获取对象 byte[] result = jedis.get("my_obj".getBytes()); Person obj = (Person) deserialize(result); System.out.println(obj.getName()); // 输出Alice // 关闭连接 jedis.close(); } // 序列化方法 private static byte[] serialize(Object obj) { ByteArrayOutputStream baos = new ByteArrayOutputStream(); try (ObjectOutputStream oos = new ObjectOutputStream(baos)) { oos.writeObject(obj); } catch (Exception e) { e.printStackTrace(); } return baos.toByteArray(); } // 反序列化方法 private static Object deserialize(byte[] bytes) { Object obj = null; try (ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(bytes))) { obj = ois.readObject(); } catch (Exception e) { e.printStackTrace(); } return obj; } } // Person类 class Person implements java.io.Serializable { private static final long serialVersionUID = 1L; private String name; private int age; public Person(String name, int age) { this.name = name; this.age = age; } public String getName() { return name; } public int getAge() { return age; } } ``` 需要注意的是,使用Java内置序列化方式会导致序列化后的字节数组较大,存储和传输的效率较低。建议使用JSON等轻量级的序列化方式来存储对象

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值