redis的设计与实现(四)——单机数据库特性

1. 前言

我们前面了解了redis的数据结构,对象。但是redis对于这些对象的使用和管理策略需要也熟记于心,这篇文章我们就了解一下吧。

2. 类型检查和命令多态

在这里插入图片描述

  • DEL,EXPIRE,RENAME,TYPE,OBJECT 可以对任何数据类型执行
  • SET,GET,APPEND,STRLEN,等只能对字符串执行
  • HDEL,HSET,HGET,HLEN,等只能对哈希键执行
  • RPUSH,LPOP,LINSERT,LLEN,等只能对列表键执行
  • SADD,SPOP,SINTER,SCARD,等只能对集合键执行
  • ZADD,ZCARD,ZRANK,ZSCORE,等只能对有序集合键执行

如何实现的类型检查?
在这里插入图片描述
在这里插入图片描述

  1. 在执行llen命令之前,确保对象内type是不是命令对应类型
  2. 如果是的话就执行
  3. 否则就返回上图类型错误

如何实现通用命令多态?

  • 实际上不仅是通用命令是多态,像llen也是多态实现,由于列表底层可以是压缩列表或者或链表,所以获取元素数量的内置操作是不同的。
  • 所以内部会进行if操作,如果是ziplist就执行ziplistLen如果是链表就使用listlength获取长度

而这些通用命令也是一样的思路。

3. 内存回收策略

c 语言不具备内存回收功能,所以redis自行实现了,内存回收。使用的策略是引用计数策略和 jvm 的可达性分析不一样。

  • 当创建一个对象的时候,引用数设置为1
  • 当被一个新程序使用的时候,引用数加1
  • 不被一个程序使用的时候,引用数减1在这里插入图片描述
    对象的生命周期包括:创建对象,操作对象,和释放对象

4. 对象共享

对象共享的目的是节约内存,实际上和 java 语言类似。

redis内部已经实现了这些,但是我们理解内部过程对于熟练使用redis极为重要。

  • redis 在初始化的时候会创建1w(0-9999)个整数字符串
    在这里插入图片描述
    我们可以看到1这个证书字符串,居然整数1被引用率2147483647之多。这种思路在java中integer有点类似,integer在创建之初就有-128-127的缓存。

另外,这些共享对象不单单只有字符串键可以使用,那些在数据结构中嵌套了字符串对象的对象(linkedlist编码的列表对象、hashtable编码的哈希对象、hashtable编码的集合对象,以及zset编码的有序集合对象)都可以使用这些共享对象。

5. 对象空转时长

redisObject中还有最后一个属性,lru,长度为22字节
在这里插入图片描述
这个属性记录了上次使用时间,当前之间减去lru可以计算出空转时长

如果服务器打开了maxmemory选项,并且服务器用于回收内存的算法为volatile-lru或者allkeys-lru,那么当服务器占用的内存数超过了maxmemory选项所设置的上限值时,空转时长较高的那部分键会优先被服务器释放,从而回收内存

6. 数据库

  1. redisDb *d保存着redis中所有数据库
    在这里插入图片描述
  2. redis会根据dbnum决定数据库创建的数量,默认是16.
    在这里插入图片描述
  3. 通过select可以选择数据库
    在这里插入图片描述
    redisClient中*db记录了当前数据库
    在这里插入图片描述
  4. reids 全数据字典
    在这里插入图片描述
    redis所有的数据都是key-value,redisDb数据结构中,dict中保存了所有数据的key-value。如果添加数据,就是向dict中添加值。

6.1. 过期键的删除策略

在这里插入图片描述
过期时间并非保存在对象内,而是另外开了一个字典exoires,专门用于保存对象的生存时间。好处是集中处理更便捷。

  • 定时删除
    使用定时器定期对对象删除
  • 惰性删除:
    等读取时,进行过期判断
  • 定期删除:
    使用定时器,不过限制删除的时间,相当于降低了延迟,降低了吞吐,是一个中庸的方法。

6.2. rdb和aof对过期键的处理

  1. rdb不保存处理
    如果rdb存储键值的时候会对过期键进行过期检查,只有非过期的键才会保存持久化。
  2. aof的不理睬处理
  • aof一般情况下并不会关系键是否过期,因为aof跟踪数据库状态,除非系统处理过期键,然后aof会追加和系统相同的删除命令。
  • 当然,如果aof进行了重写,这时候的思路就和rdb类似,会对过期键理睬,只保存不过期的键,因为aof重写本身就是一个类rdb的行为。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【opencv】教程代码 —ImgProc (10)图像平滑处理

10. Smoothing.cpp 图像平滑处理 演示不同滤波器的效果。这些滤波器包括均值滤波、高斯滤波、中值滤波和双边滤波。每个滤波器都会在原始图像上应用,并显示滤波后的效果。 /*** 文件 Smoothing.cpp* 简单滤镜的样例代码* 作者 OpenCV团队*///引入所需库文件 #includ…

PL/SQL的词法单元

目录 字符集 标识符 分隔符 注释 oracle从入门到总裁:​​​​​​https://blog.csdn.net/weixin_67859959/article/details/135209645 PL/SQL块中的每一条语句都必须以分号结束。 一个SQL语句可以跨多行,但分号表示该语句的结束:一行中也可以有多条 SQL语句&…

一周学会Django5 Python Web开发-Django5模型查询(上)

锋哥原创的Python Web开发 Django5视频教程: 2024版 Django5 Python web开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili2024版 Django5 Python web开发 视频教程(无废话版) 玩命更新中~共计41条视频,包括:2024版 Django5 Python we…

NLP深入学习:结合源码详解 BERT 模型(三)

文章目录 1. 前言2. 预训练2.1 modeling.BertModel2.1.1 embedding_lookup2.1.2 embedding_postprocessor2.1.3 transformer_model 2.2 get_masked_lm_output2.3 get_next_sentence_output2.4 训练 3. 参考 1. 前言 前情提要: 《NLP深入学习:结合源码详…

2024年N1叉车司机证考试题库及N1叉车司机试题解析

题库来源:安全生产模拟考试一点通公众号小程序 2024年N1叉车司机证考试题库及N1叉车司机试题解析是安全生产模拟考试一点通结合(安监局)特种作业人员操作证考试大纲和(质检局)特种设备作业人员上岗证考试大纲随机出的…

串口通信标准RS232 RS485 RS422的区别

RS-232、RS-422、RS-485是关于串口通讯的一个机械和电气接口标准(顶多是网络协议中的物理层),不是通讯协议,它们之间的几个不同点如下: 一、硬件管脚接口定义不同 二、工作方式不同 RS232: 3线全双工 RS…

在线教学软件推荐!一站式白板让线上教学更顺畅!

可以用于线上教学的软件,之前大家最为熟悉的莫过于使用各类视频会议软件,如腾讯会议、钉钉会议、飞书会议、Zoom 等,基于视频会议软件来共享电脑屏幕,然后再切换到本地的 PPT 演示文稿进行讲解。 但采用这个线上教学方案存在一些…

如何用磁力仪探测管缆的位置和埋深?

不论是航空磁测,还是海洋磁测,都是直接测量磁场总强度T,而后以总磁异常ΔT成图。磁异常总强度Ta是磁场总强度T与正常场T0的矢量差,即: Ta= T- T0 根据参考文献1,2的推导&#xff0c…

2024信息通信展览会|中国通信展览会|通讯大会

2024信息通信展览会|中国通信展览会|通讯大会 2024年中国国际信息通信展览会与同期举办的ICT.中国论坛于2024年9月25-27日在北京.国家会议中心隆重举办,共同奋力开启信息通信的新篇章。这是一场集交流、展示、共赢于一体的盛大盛典,为信息通信领域的企业…

保研线性代数机器学习基础复习2

1.什么是群(Group)? 对于一个集合 G 以及集合上的操作 ,如果G G-> G,那么称(G,)为一个群,并且满足如下性质: 封闭性:结合性:中性…

一种重要却容易被我们忽略的能力

你有多久没有「发呆」过了? 我指的不是那种偶尔的走神和分心,而是那种持续一段时间,什么也不做、什么也不想,就这样静静站着或坐着,让大脑放空的状态。 可能有人会觉得:这太奢侈了,我们每天都恨…

【任职资格】某大型制造型企业任职资格体系项目纪实

该企业以业绩、责任、能力为导向,确定了分层分类的整体薪酬模式,但是每一名员工到底应该拿多少工资,同一个岗位的人员是否应该拿同样的工资是管理人员比较头疼的事情。华恒智信顾问认为,通过任职资格评价能实现真正的人岗匹配&…

基于Spring boot + Vue协同过滤算法的电影推荐系统

末尾获取源码作者介绍:大家好,我是墨韵,本人4年开发经验,专注定制项目开发 更多项目:CSDN主页YAML墨韵 学如逆水行舟,不进则退。学习如赶路,不能慢一步。 目录 一、项目简介 二、开发技术与环…

分享一下自己成功入职为AIGC工程师的经历

据外媒援引知情人士消息,OpenAI预计2023年收入将达到2亿美元,到2024年将达到10亿美元,全世界都看出了AIGC工程师的市场潜力。 而对于广大职场人士而言,则是意味着新的职场机遇出现了,学习好AIGC技术,无论是…

gemma 大模型(gemma 2B,gemma 7B)微调及基本使用

待整理… gemma介绍 Gemma是Google推出的一系列轻量级、最先进的开放模型,基于创建Gemini模型的相同研究和技术构建。提供了 2B 和 7B 两种不同规模的版本,每种都包含了预训练基础版本和经过指令优化的版本。所有版本均可在各类消费级硬件上运行&#x…

ThreadLocal和Synchronized的区别

目录 背景过程ThreadLocal什么是ThreadLocal?既然都是保证线程访问的安全性,那么和Synchronized区别是什么呢?ThreadLocal的使用TheadLocal使用场景原理高并发场景下ThreadLocal会造成内存泄漏吗?什么原因导致?如何避免…

aws 入门篇 01.aws学习的方法论

aws入门篇 01.aws学习的方法论 第1章 aws学习的方法论 aws的服务很多,现在应该有100多个服务了,怎么来学习aws呢? 这几年也使用了一些aws的服务,谈谈自己对学习aws的理解。 1.先横向,后纵深 比如说,aws最…

SpringCloud微服务集成Dubbo

1、Dubbo介绍 Apache Dubbo 是一款易用、高性能的 WEB 和 RPC 框架,同时为构建企业级微服务提供服务发现、流量治理、可观测、认证鉴权等能力、工具与最佳实践。用于解决微服务架构下的服务治理与通信问题,官方提供了 Java、Golang 等多语言 SDK 实现。使用 Dubbo 开发的微服…

手撕算法-最小覆盖子串

描述 分析 滑动窗口。 参考力扣官方的题解思路 本问题要求我们返回字符串 s 中包含字符串 t 的全部字符的最小窗口。我们称包含 t 的全部字母的窗口为「可行」窗口。 我们可以用滑动窗口的思想解决这个问题。在滑动窗口类型的问题中都会有两个指针,一个用于「延伸…

文件操作(下)(想要了解如何操作文件,那么看这一片就足够了!)

前言:在文件操作(上)中,我们讲到了基础的文件操作,包括文件的打开,文件的关闭,以及文件的基础读写,那么除了之前学习的读写之外,还有什么其他的方式对文件进行读写操作吗…