redis之redisObject对象
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对象示意图

3 使用redisObjec对象的好处
1) 执行redis命令时,可以通过redisObject 的type和encoding属性来确定是否可以执行相应的命令,不用等操作具体的数据时才发现命令不可执行
2) 同一数据类型可以使用不同的底层编码,优化不同场景下的使用效率和节省内存
3) 支持共享和引用计数。当对象被共享时,只占用一份内存拷贝,节省内存
4) 根据lru属性并结合redis内存回收算法淘汰长时间未使用的key
4 type,encoding,数据类型和底层数据结构的关系
相同的type,可能对应不同的encoding:同一个数据类型,redis使用了不同的底层数据结构,导致在内存占用和查找性能上会有所不同
redis中每种数据类型都会有至少对应2种底层数据结构
| type | redis数据类型 | 编码 | encoding | 底层数据结构 |
| REDIS_STRING | String(字符串) | int | REDIS_ENCODING_INT | long型整数的简单动态字符串 |
| REDIS_STRING | String(字符串) | embstr | REDIS_ENCODING_EMBSTR | embstr编码的简单动态字符串 |
| REDIS_STRING | String(字符串) | raw | REDIS_ENCODING_RAW | 简单动态字符串 |
| REDIS_LIST | List(列表) | ziplist | REDIS_ENCODING_ZIPLIST | 压缩列表 |
| REDIS_LIST | List(列表) | linkedlist | REDIS_ENCODING_LINKEDLIST | 双向链表 |
| REDIS_SET | Set(集合) | intset | REDIS_ENCODING_INTSET | 整数集合 |
| REDIS_SET | Set(集合) | hashtable | REDIS_ENCODING_HT | 字典 |
| REDIS_ZSET | Sorted Set(有序集合) | ziplist | REDIS_ENCODING_ZIPLIST | 压缩列表 |
| REDIS_ZSET | Sorted Set(有序集合) | skiplist | REDIS_ENCODING_SKIPLIST | 跳表+字典 |
| REDIS_HASH | Hash(哈希) | ziplist | REDIS_ENCODING_ZIPLIST | 压缩列表 |
| REDIS_HASH | Hash(哈希) | hashtable | REDIS_ENCODING_HT | 字典 |
redis之redisObject对象的更多相关文章
- Redis源代码剖析--对象object
前面一系列的博客分析了Redis的基本数据结构,有动态字符串sds.双端链表sdlist.字典dict.跳跃表skiplist.整数集合intset和压缩列表ziplist等,这些数据结构对于用户来说 ...
- Redis学习之对象系统源码分析
背景知识: Redis并没有直接使用sds,双端链表,字典,压缩列表,跳表等这些数据结构来直接实现键值对数据库,而是基于这些对象创建了一个对象系统,这个对象系统包含5个对象:字符串对象,列表对象,哈希 ...
- Redis 学习笔记(一)redis 数据类型和对象机制
Redis 简介 Redis 是(key-value)的 NoSQL 数据库,所有的 key 都是 String ,它的 value 可以是 String.hash.list.set.zset(有序集 ...
- Redis数据结构与对象
参考<Redis设计与实现> 系列文章目录和关于我 一丶简单动态字符串 当redis需要的不仅仅是一个字符串字面量,而是一个可以被修改的字符串值时,就会使用SDS(simple dynam ...
- redis 序列化存入对象
redis 序列化存入对象 //序列化 public static byte [] serialize(Object obj){ ObjectOutputStream obi=null; ByteAr ...
- redis 存储java对象 两种方式
根据redis的存储原理,Redis的key和value都支持二进制安全的字符串 1.利用序列化和反序列化的方式存储java对象我们可以通过对象的序列化与反序列化完成存储于取出,这样就可以使用redi ...
- Redis如何存储对象与集合示例详解
前言 大家都知道在项目中,缓存以及mq消息队列可以说是不可或缺的2个重要技术.前者主要是为了减轻数据库压力,大幅度提升性能.后者主要是为了提高用户的体验度,我理解的是再后端做的一个ajax请求(异 ...
- 关于Spring Data redis几种对象序列化的比较
redis虽然提供了对list set hash等数据类型的支持,但是没有提供对POJO对象的支持,底层都是把对象序列化后再以字符串的方式存储的.因此,Spring data提供了若干个Seriali ...
- 面试官:Redis的共享对象池了解吗?
我正在面试间里焦急地等待着,突然听到了门外的脚步声,随即门被打开,穿着干净满脸清秀的青年走了进来,一股男士香水的淡香扑面而来. 面试官:"平时在工作中用过Redis吗?" 我:&q ...
- redis源码解析(1):redisObject对象说明
Redis在实现键值对数据库时,并没有直接使用数据结构,而是基于已有的数据结构创建了一个对象系统,每种对象至少包含一种数据结构. redis3.0 中对象结构: typedef struct redi ...
随机推荐
- nginx客户端真实IP配置
https://www.cnblogs.com/kevingrace/p/8269955.html include mime.types; default_type application/octet ...
- 别再写一堆的 for 循环了!Java 8 中的 Stream 轻松遍历树形结构,是真的牛逼
实体类:Menu.java /** * Menu * * @author lcry */ @Data @Builder public class Menu { /** * id */ public I ...
- 【Frida】调试js代码
方法一attach启动 js代码动态注入app,app需要保持运行状态 # coding: utf-8 import sys import frida app_name = "猿人学APP& ...
- 蓝牙mesh组网实践(环境监测传感器应用)
目录 蓝牙mesh组网中的低功耗节点,在应用于低频率上传数据的传感器网络时有着得天独厚的功耗优势,在1min唤醒上传一包的情况下ch582的平均功耗仅有12uA,若每小时甚至每天采样一次数据并上传,平 ...
- docker下载java镜像,执行xxx.jar文件
docker pull java:8u111
- StunServer
Stun 服务器 npm下载stun包 npm i stun -s google stun服务器 google的stun的服务器一般国内访问较慢,所以一般自己搭建一个服务器 const stun = ...
- 我常用的Linux快捷命令
alias 设置快捷自定义命令 语法: alias 快捷命令='完整命令' 因为可以直接把上述当成一条语句来执行,但是服务器重启之后会失效,被称为临时快捷命令: 但是!将他写入 ~/.bashrc 文 ...
- char 与 string 互转 byte与string互转 list<string>与string[]互转 char与byte互转
class Program { static void Main(string[] args) { ...
- Java基础__01.环境安装
该篇文章,主要讲述了Java的一些基础知识及准备工作. Java的特性 简单性 面向对象 可移植性,即跨平台性(Write Once, Run Anywhere) 高性能 分布式 动态性 多线程 安全 ...
- window操作
1.进入目录 cd ... 2. 进入D盘 D: 3.读取文件内容 type file