Redis教程:数据对象分析(二)
目录
1 类型检查与命令多态
2 内存回收
3 对象共享
4 对象的时转时长
1 类型检查与命令多态
Redis中用于操作键的命令基本上可以分为两种类型:其中一种命令可以对任何类型的键执行,比如DEL命令、EXPIRE命令、RENAME命令、TYPE命令、OBJECT命令等。举个栗子,DEL命令可以用来删除三种不同类型的键:
# 字符串键
127.0.0.1:6379> SET msg "hello"
OK
# 列表键
127.0.0.1:6379> RPUSH numbers 1 2 3
(integer) 3
# 集合键
127.0.0.1:6379> SADD fruits apple banana cherry
(integer) 3
127.0.0.1:6379> DEL msg
(integer) 1
127.0.0.1:6379> DEL numbers
(integer) 1
127.0.0.1:6379> DEL fruits
(integer) 1
而另一种命令只能对特性类型执行,比如:
- SET、GET、APPEND、STRLEN等命令只能对字符串键执行
- HDEL、HSET、HGET、HLEN等命令只能对哈希键执行
- RPUSH、LPOP、LINSERT、LLEN等命令只能对列表键执行
- SADD、SPOP、SINTER、SCARD等命令只能对集合键执行
- ZADD、ZCARD、ZRANK、ZSCORE等命令只能对有序集合键执行
2 内存回收
因为C语言并不具备自动回收内存的功能 ,所以Redis在自己对的对象系统中构建了一个引用计数技术来实现自动回收内存,通过这一机制,程序可以跟踪对象的引用计数信息,在适当的时候自动释放对象并进行内存回收。每个对象的引用计数信息由redisObject结构的refcount属性记录:
redis.h
typedef struct redisObject {unsigned type:4;/* Not used */unsigned encoding:4;unsigned lru:22; //引用计数int refcount;void *ptr;
} robj;
对象的引用计数信心会随着对象的使用状态而不断变化:
- 在创建一个新对象时,引用计数的值会被初始化为1
- 当对象被一个新程序使用时,它的引用计数值会被增一
- 当对象不再被一个程序使用时,它的引用计数值会被减一
- 当对象的引用计数值变为0时,对象所占用的内存会被释放
函数 | 作用 |
incrRefCount | 将对象的引用计数值增一 |
decrRefCount | 将对象的引用计数值减一,当对象的引用计数值等于0时,释放对象 |
resetRefCount | 将对象的引用计数值设置为0,但并不释放对象,这个函数通常在需要重新设置对象的引用计数值时使用 |
3 对象共享
为了减少内存的开销,redis会共享0~9999的整数型字符串对象,不共享字符型字符串对象是由于字符匹配教复杂,可能得不偿失。
4 对象的时转时长
除了前面介绍过的type、encoding、ptr和refcount四个属性外,redisObject结构包含的最后一个属性为lru属性,该属性记录了对象最后一次被命令程序访问的时间:
OBJECT IDLETIME命令可以打印出给定键的空转时长,这一空转时长就是通过将当前时间减去键对象的lru时间计算得出:
127.0.0.1:6379> SET msg "hello world"
OK
# 等待一小段时间
127.0.0.1:6379> OBJECT IDLETIME msg
(integer) 28
# 等待一小段时间
127.0.0.1:6379> OBJECT IDLETIME msg
(integer) 51
# 访问 msg 键的值
127.0.0.1:6379> GET msg
"hello world"
# 键处于活跃状态,空转时长为 3
127.0.0.1:6379> OBJECT IDLETIME msg
(integer) 3
, 键的空转时长还有另外一项作用:如果服务器打开了maxmemory选项,并且服务器用于回收内存的算法为volatile-lru或者allkeys-lru,那么当服务器占用的内存超过maxmemory选项所设置的上限值时,空转时长较高的那部分键会优先被服务器释放,从而回收内存 。
参考:
1、redis设计与实现(第二版)
Redis教程:数据对象分析(二)相关推荐
- erp物料报废 oracle_ERP核心业务流程和Oracle-ERP业务和数据对象分析
作者:人月神话,新浪博客同名 简介:多年SOA规划建设,私有云PaaS平台架构设计经验,长期从事一线项目实践 今天简单整理下原来整理过的ERP核心业务流程和Oracle-ERP核心业务功能和数据对象分 ...
- 简述oracle的主要数据库对象,Oracle数据库数据对象分析
Oracle数据库数据对象分析 Oracle数据库数据对象中最基本的是表和视图,其他还有约束.序列.函数.存储过程.包.触发器等.对数据库的操作可以基本归结为对数据对象的操作,理解和掌握Oracle数 ...
- ERP核心业务流程和Oracle-ERP业务和数据对象分析
ERP核心业务流程和Oracle-ERP业务和数据对象分析 https://www.toutiao.com/i6869658665129869832/?tt_from=weixin&utm_c ...
- 数据包络分析-二阶段网络带feedback(第二篇)
数据包络分析-二阶段网络带feedback(第二篇) 模型示意图 第一点:投入分配 第二点:只需要用一个 C h a r n e s C o o p e r Charnes\;Cooper Charn ...
- Redis教程:数据对象分析(一)
目录 1 五种基本数据对象 2 数据结构对象分析 2.1 类型 2.2 编码与底层实现 2.3 编码转换 1 五种基本数据对象 图1 redis数据对象 2 数据结构对象分析 Redis中的每个对象都 ...
- Redis教程:常见问题分析
1.redis的优势? 性能很好 支持事务 支持丰富的数据类型 支持数据持久化 2.redis为什么这么快? 纯内存操作 单线程操作,避免了频繁的上下文切换 采用了非阻塞I/O多路复用机制 图1 re ...
- 数据包络分析--二阶段网络(考虑各阶段的公平性)
DEA-关注公平的两阶段DEA模型:建模和计算方面 文献介绍 二阶段网络示意图 基础知识--合作和非合作模式 非合作模式(Non-cooperative mode) subDMU1dominatest ...
- redis lettuce 超时_Spring Cache 操作 Redis 实现数据缓存(上)
点击上方☝SpringForAll社区 轻松关注!及时获取有趣有料的技术文章 本文来源:http://www.mydlq.club/article/55/ . 一.缓存概念知识 . 1.是什么缓存 . ...
- SpringBoot 结合 Spring Cache 操作 Redis 实现数据缓存
点击上方"后端技术精选",选择"置顶公众号" 技术文章第一时间送达! 作者:超级小豆丁 http://www.mydlq.club/article/55/ 系统 ...
最新文章
- java ascii 编码方式_JAVA 的ASCII字符编码一览表
- vue调试工具如何使用_教你使用Vue.js的DevTools来调试vue项目
- Leaflet获取可视范围内4个顶点
- 【手写系列】透彻理解MyBatis设计思想之手写实现
- 操作系统之文件管理:5、文件物理结构(连续分配、链式(显式、隐式)分配、索引分配(链接、多层索引、混合索引))
- 访问权限修饰符( public,protected,default,private )的使用对象和作用域
- 使用 IntraWeb (12) - 基本控件之 TIWGradButton、TIWImageButton
- linux java mysql 备份 runtime_Mysql如何在linux中实现定时备份
- MySQL二十四:索引
- 30岁学python有前途吗-为什么做大数据一定要学Python?
- php text换行_php实现文字换行
- c语言程序设计贪吃蛇报告,C语言“贪吃蛇”程序设计报告.doc
- 如何对网站服务器进行安全防护
- 运算放大器参数的详细解释和分析-运放压摆率(SR)
- 职业倾向测试脸型软件,气质类型测试适合职业
- 癫痫的神经行为和临床共病:白质网络中断/损伤的作用
- java 为什么要get,set方法
- 短视频推荐算法过程分享,论如何针对推荐算法来优化短视频内容
- 成熟的男人喜欢什么样的女性?
- Java缓存知识汇总
热门文章
- PHP中COOKIE即时生效,php实现cookie即时生效
- 虚拟化--051 vsphere linux搭建NTP服务器搭建
- 【Win 10应用开发】Adaptive磁贴模板的XML文档结构
- Linux使用Mac键盘,System76 推出 Linux 键盘 看完手痒了!
- 【05】CC - 格式
- html类名定义规则_好程序员分享Java语言中的标识符规则
- 使CEdit处于全选状态
- java二分查找范围区间_二分查找(Java实现)
- mysql从文本导入表_[Mysql] 用load data将文本文件数据导入到表
- 树莓派Linux内核编译选项如何开启TPM 2.0