【Redis-01】RedisObject基本原理及各属性结构的作用

 我们知道,redis常用的5种类型底层都是通过redisObject去封装的。看一下redisObject的源码:

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

 这几个属性都很重要,下面就看下他们各自代表什么含义以及有什么作用。

1. type

 这个比较熟悉,type的值对应的就是我们平时接触最多的5种数据类型,即:string、list、set、sortedset、hash,当然还包括其他一些不常用的类型,在此不再列举。我们通过 type key 这个命令,可以拿到它的值类型。
 type在redis中也会对客户端输入的操作命令进行检查,校验合法性。在redis中,有两种类型的命令,一种是针对所有类型都适用的,如 del、ttl、expire等,还一种是针对特定类型的操作,比如 get、hget、lpush等,针对后者,type就可以对命令和参数的类型进行校验,校验通过会继续执行,否则就会向客户端返回错误提示。

2. encoding

 encoding这个值记录的每种值对象在底层的结构实现编码,什么意思呢?比如 hash 在redis的实现结构有两种类型,数据量比较少的时候使用 ziplist,数据量比较大的时候是 dict,那么encoding的值分别就是上面提到的 “ziplist” 和 “dict”。使用 object encoding key这个命令可以查询。
 除了记录编码值之外,redis也会借助于encoding,实现命令的执行函数。还是上面提到的hash,比如我们执行了 hlen 获取hash长度,如果encoding标记的是ziplist,那么redis就会使用ziplist相关len函数去执行,如果encoding标记的值是dict,就会调用dict 相关的len函数去执行。在这里插入图片描述

3. lru

 lru这个必然是和内存回收相关的了,这里它记录的是当前的值对象最后一次被程序访问的时间,通过这个时间我们可以得到该对象的空转时长,就是当前时间 - lru记录的时间,如果说redis服务器打开了 maxmemory 最大内存管理的选项,并且内存回收使用 volatile-lru 或者 allkeys-lru算法,那么服务器就会优先释放这个空转时长比较长的对象,从而回收内存。
 通过object idletime key这个命令就可以得到最近一次被访问的时间,需要注意的是,这个命令本身也访问了该对象,但是却不会引起这个时间值的改变。

4. refcount

 refcount记录的是当前这个值对象正在被多少数据结构所共享,redis用这个属性实现了引用计算器,这个值在低版本和高版本的设定有所区别。
 在低版本中,有如下场景,创建了一个键值对,key和val是 a = 100,那么此时a的值对象refcount值就是1,如果我们再新增一个键值对,key和val是b = 100,那么a和b的refcount的值都是2。但是在高版本中,同样使用object refcount key测试的时候结果截然不同,查看源码得知,在高版本中,redis把一个对象设置为共享状态的时候,就会把refcount的值设置为固定的INT_MAX,所以是2147483647。而且redis把0~9999的数值默认设定为共享的状态,当服务器使用这些值的时候,会使用共享对象而不是新创建。
 虽然共享对象可以节约内存,但是如果共享一些结构比较复杂的对象,会导致对象比较的时间复杂度提高,受制于cpu计算时间的限制,redis只会对包含整数值的字符串对象进行共享。同理,如果refcount的值变为0时,表示对象没有被其他结构所共享了,它所占用的内存就会被服务器释放。

5. ptr

 ptr是个指针,指向了对象真正数据结构的实现,这些数据结构是由上面提到的encoding属性决定的。不同type可以对应不同的ptr实现,所以redisObject这种多态的特性也使得redis更加灵活。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/308080.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ubuntu python播放MP3,wav音频和录音

目录 一.利用pygame(略显麻烦,有时候播放不太正常)1.安装依赖库2.代码 二.利用mpg123(简洁方便,但仅争对mp3)1.安装依赖库2.代码 三.利用sox(简单方便,支持的文件格式多)…

YOLO训练results.csv文件可视化(原模型与改进模型对比可视化)

一、单独一个文件可视化(源码对应utils文件夹下的plots.py文件的plot_results类) from pathlib import Path import matplotlib.pyplot as plt import pandas as pd def plot_results(fileruns/train/exp9/results.csv, dir):# Plot training results.c…

图像的颜色及Halcon颜色空间转换transfrom_rgb/trans_to_rgb/create_color_trans lut

图像的颜色及Halcon颜色空间转换 文章目录 图像的颜色及Halcon颜色空间转换一. 图像的色彩空间1. RGB颜色 2. 灰度图像3. HSV/ HSI二. Bayer 图像三. 颜色空间的转换1. trans_from_rgb算子2. trans_to_rgb算子3. create_color_trans_lut算子 图像的颜色能真实地反映人眼所见的真…

python+django网上购物商城系统o9m4k

语言:Python 框架:django/flask可以定制 软件版本:python3.7.7 数据库:mysql 数据库工具:Navicat 开发工具pycharm/vscode都可以 前端框架:vue.js 系统使用过程主要涉及到管理员和用户两种角色,主要包含个…

Android MVVM 写法

前言 Model:负责数据逻辑 View:负责视图逻辑 ViewModel:负责业务逻辑 持有关系: 1、ViewModel 持有 View 2、ViewModel 持有 Model 3、Model 持有 ViewModel 辅助工具:DataBinding 执行流程:View &g…

[NCTF 2022] web题解

[NCTF 2022]calc 考点:python环境变量注入 打开题目,F12有hint 访问一下得到源码 app.route("/calc",methods[GET]) def calc():ip request.remote_addrnum request.values.get("num")log "echo {0} {1} {2}> ./tmp/log…

@PersistenceContext和@Autowired在EntityManager上应用的不同

首先PersistenceContext是jpa专有的注解,而Autowired是spring自带的注释 上方图片的意思就是EntityManager不是线程安全的,当多个请求进来的时候,spring会创建多个线程,而PersistenceContext就是用来为每个线程创建一个EntityMana…

如何编写一个javaAgent jar工具包超详细教程

介绍 Java Agent技术 Java Agent技术是JDK提供的用来编写Java工具的技术,使用这种技术生成一种特殊的jar包,这种jar包可以让Java程序 运行其中的代码。 Java Agent技术的两种模式 Java Agent技术实现了让Java程序执行独立的Java Agent程序中的代码…

Spring boot:3.X + Security OAuth2 自定义登录页面、登出后跳转到登录页

本文描述了基于 Spring Oauth2 的 code 模式&#xff0c;实现登陆同时授权、自定义登录界面、登出页面的功能。 1.Maven依赖&#xff1a; <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactI…

如何在 NAS 上安装 ONLYOFFICE 文档?

文章作者&#xff1a;ajun 导览 ONLYOFFICE 文档 是一款开源办公套件&#xff0c;其是包含文本文档、电子表格、演示文稿、表单、PDF 查看器和转换工具的协作性编辑工具。它高度兼容微软 Office 格式&#xff0c;包括 .docx、.xlsx 、.pptx 、pdf等文件格式&#xff0c;并支持…

55.网游逆向分析与插件开发-游戏增加自动化助手接口-自动药水设定功能的逆向分析

内容来源于&#xff1a;易道云信息技术研究院VIP课 上一个内容&#xff1a;项目需求与需求拆解-CSDN博客 之前在找到过一个虚函数&#xff0c;每个按钮的都有一个实现机制&#xff0c;参考这里游戏结束过程的逆向分析 实际上找起来会不会用上不知道&#xff0c;接下来开始逆…

抬头举手阅读YOLOV8NANO

首先用YOLOV8NANO得到PT模型&#xff0c;转换成ONNX,OPENCV调用&#xff0c;PYTHON,C,ANDROID都可以举手写字阅读YOLOV8NANO