最新要闻
- 环球时讯:琥珀手串会变色吗 琥珀手串会越戴越亮吗
- 环球看点!全球首个空中飞行出租车来了:巴黎开测 2024奥运会要用
- 【天天报资讯】抗早泄国产“伟哥”药物上市 市场有多大?专家称将翻倍增长 国内患者众多
- 全球首搭帝瓦雷音响!比亚迪腾势N7猎跑SUV亮相:运动低趴
- 当前速讯:鸡鸣寺游客爆满设反悔门引导离寺 网友神评:我佛果然慈悲 给反悔机会
- 北方多地遭遇沙尘暴 PM爆表:气象台再发预警 还没退去
- 环球头条:流浪小狗乞求收养者一起带走玩具熊:画面让养狗人士泪目 为何被遗弃
- 今日关注:iPhone 14首发的车祸检测功能让人崩溃!苹果iOS 16.4将优化升级
- 每日头条!LOL2023狗熊怎么出装(上单狗熊2023出装顺序)
- 精选!等了 11年 《CSGO2》电竞网游终于官宣:画质大升级 免费更新
- 环球快讯:NVIDIA突然复活SLI!但不是你想的那样
- 每日看点!比尔·盖茨谈ChatGPT 赞其1980年以来最革命性技术进步
- 天天即时:爱子飞机上死亡:母亲怒告世界最大航司美国航空
- 谷歌的“GPT”终于憋出来了!但是 也不比百度强多少啊
- 当前热议!抖音救人一命!男子发头孢配酒视频获救:客服教科书式报警
- 头条:交700个税的工资多少_j700
手机
iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
- 警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- 男子被关545天申国赔:获赔18万多 驳回精神抚慰金
- 3天内26名本土感染者,辽宁确诊人数已超安徽
- 广西柳州一男子因纠纷杀害三人后自首
- 洱海坠机4名机组人员被批准为烈士 数千干部群众悼念
家电
当你对 redis 说你中意的女孩是 Mia
作者:京东科技 周新智
一、Redis
众所周知,Redis = Remote Dictionary Server,即远程字典服务。
是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。
(资料图片仅供参考)
二、当你对 redis 说你中意的女孩是 Mia 时
1、set myLove Mia
redis 会将 key:myLove value:Mia
包装成一个 dictEntry 对象、一个 redisObject 对象,如下图所示:
•dictEntry
:众所周知,Redis是Key-Value数据库,因此对每个键值对都会有一个dictEntry,里面存储了指向Key和Value的指针;next指向下一个dictEntry,与本Key-Value无关。
•Key
:图中右上角可见,Key("myLove")并不是直接以字符串存储,而是存储在SDS结构中。
•redisObject
:Value("Mia")既不是直接以字符串存储,也不是像Key一样直接存储在SDS中,而是存储在redisObject中。实际上,不论Value是5种类型的哪一种,都是通过redisObject来存储的;而redisObject中的type字段指明了Value对象的类型,ptr字段则指向对象所在的地址。不过可以看出,字符串对象虽然经过了redisObject的包装,但仍然需要通过SDS存储。
1.1、对 myLove 进行对象封装
1.1.1、dictEntry
redis内部整体的存储结构是一个大的hashmap,内部是数组实现的hash,key冲突通过挂链表去实现,每个dictEntry为一个key/value对象,value为定义的redisObject。
结构图如下:
dictEntry是存储key->value的地方,再让我们看一下dictEntry结构体
/* * 字典 */typedef struct dictEntry { // 键 void *key; // 值 union { // 指向具体redisObject void *val; // uint64_t u64; int64_t s64; } v; // 指向下个哈希表节点,形成链表 struct dictEntry *next;} dictEntry;
1.1.2、对象封装 redisObject
我们接着再往下看redisObject究竟是什么结构的
/* * Redis 对象 */typedef struct redisObject { // 类型 4bits unsigned type:4; // 编码方式 4bits unsigned encoding:4; // LRU 时间(相对于 server.lruclock) 24bits unsigned lru:22; // 引用计数 Redis里面的数据可以通过引用计数进行共享 32bits int refcount; // 指向对象的值 64-bit void *ptr;} robj;
*ptr指向具体的数据结构的地址;type表示该对象的类型,即String,List,Hash,Set,Zset中的一个,但为了提高存储效率与程序执行效率,每种对象的底层数据结构实现都可能不止一种,encoding 表示对象底层所使用的编码。
redis对象底层的八种数据结构:
REDIS_ENCODING_INT(long 类型的整数) REDIS_ENCODING_EMBSTR embstr (编码的简单动态字符串) REDIS_ENCODING_RAW (简单动态字符串) REDIS_ENCODING_HT (字典) REDIS_ENCODING_LINKEDLIST (双端链表) REDIS_ENCODING_ZIPLIST (压缩列表) REDIS_ENCODING_INTSET (整数集合) REDIS_ENCODING_SKIPLIST (跳跃表和字典)
查看 redisObject 详细信息 :
# 查看 key对应value的 redisObject 类型type key type myLove # 查看 key对应value的redisObject 详细信息debug object key debug object myLove
value 为 string 、int 类型是 redisObject 中的 type、encoding 不同表现形式
Value 为 string 类型时:
Value 为 int类型时:
以上两种不同 value 类型,type 相同,encoding 不同
1.2、对 myLove 进行持久化
1.2.1、rdb 文件写入
1.2.2、aof 缓存写入 文件保存
默认情况下 没有开启 AOF ( append only file)
开启 AOF 持久化后,每执行一条会更改 redis 数据的命令,redis就会将写入、修改、删除命令写入到硬盘中的 AOF 文件(当然并不是立即写入文件,而是立即写入aof缓存中,再根据aof配置的数据持久化条件进行写入),这一过程显然会降低 redis 的性能,但大部分情况下这个影响是能够接受的,
另外使用快的硬盘可以提高 AOF 的性能。
配置 redis.conf
# 可以通过修改redis.conf配置文件中的appendonly参数开启 appendonly yes# AOF文件的保存位置和RDB文件的位置相同,都是通过dir参数设置的。 dir ./# 默认的文件名是appendonly.aof,可以通过appendfilename参数修改 appendfilename appendonly.aof
AOF文件中存储的是redis的命令 原理
Redis 将所有对数据库进行过写入的命令(及其参数)记录到 AOF 文件, 以此达到记录数据库状态的 目的, 为了方便起见, 我们称呼这种记录过程为同步。
同步命令到 AOF 文件的整个过程可以分为三个阶段:
命令传播:Redis 将执行完的命令、命令的参数、命令的参数个数等信息发送到 AOF 程序中。 缓存追 加:AOF 程序根据接收到的命令数据,将命令转换为网络通讯协议 RESP 的格式,然后将协议内容追加到服务器的 AOF 缓存中。 文件写入和保存: AOF 缓存中的内容被写入到 AOF 文件末尾,如果设定的 AOF 保存条件被满足的话, fsync 函数或者 fdatasync 函数会被调用,将写入的内容真正地保存到磁盘中。
命令传播:
当一个 Redis 客户端需要执行命令时, 它通过网络连接, 将协议文本发送给 Redis 服务器。服务器在 接到客户端的请求之后, 它会根据协议文本的内容, 选择适当的命令函数, 并将各个参数从字符串文 本转换为 Redis 字符串对象( StringObject )。每当命令函数成功执行之后, 命令参数都会被传播到 AOF 程序。
缓存追加:
当命令被传播到 AOF 程序之后, 程序会根据命令以及命令的参数, 将命令从字符串对象转换回原来的 协议文本。协议文本生成之后, 它会被追加到 redis.h/redisServer 结构的 aof_buf 末尾。
redisServer 结构维持着 Redis 服务器的状态, aof_buf 域则保存着所有等待写入到 AOF 文件的协 议文本。
RESP 协议:
Redis客户端使用RESP(Redis的序列化协议)协议与Redis的服务器端进行通信。 虽然该协议是专门为 Redis设计的,但是该协议也可以用于其他 客户端-服务器 (Client-Server)软件项目。
可以通过特殊符号来区分出数据的类型:
单行回复:以+号开头。
错误回复:以-号开头。
整数回复:以:号开头。
批量回复:以$号开头。
多条批量回复:以*号开头。
1、间隔符号,在Linux下是\r\n,在Windows下是\n
2、简单字符串 Simple Strings, 以 "+"加号 开头
3、错误 Errors, 以"-"减号 开头
4、整数型 Integer, 以 ":" 冒号开头
5、大字符串类型 Bulk Strings, 以 "$"美元符号开头,长度限制512M 6、数组类型 Arrays,以 "*"星号开头 用SET命令来举例说明RESP协议的格式。
实际发送的请求数据:
redis> SET myLove "Mia""OK"*3\r\n$3\r\nSET\r\n$6\r\nmyLove\r\n$3\r\nMia\r\n*3$3SET$5mykey$5Hello
实际收到的响应数据:
+OK\r\n
文件写入和保存:
每当服务器常规任务函数被执行、 或者事件处理器被执行时, aof.c/flushAppendOnlyFile 函数都会被 调用, 这个函数执行以下两个工作:
WRITE:根据条件,将 aof_buf 中的缓存写入到 AOF 文件。 SAVE:根据条件,调用 fsync 或 fdatasync 函数,将 AOF 文件保存到磁盘中。
2、给你的爱一个期限 expire myLove 999999999
从图可知,在redis的数据库中,redisDb结构中的expires字典中保存了数据库中所有键的过期时间,所以叫过期字典。
过期字典的key是一个指针,指向键空间的某个键对象(就是数据库键)
过期字典的value是一个long类型的整数,这个整数保存了键所指向的数据库键的过期时间,一个毫秒精度的UNIX时间戳
过期键判定
通过过期字典,我们可以得到一个key是否过期:
判断key是否存在于过期字典中
通过过期字典拿到key的过期时间,判断当前UNIX时间戳是否大于key时间
过期key如何删除
惰性删除策略
过期键的惰性删除策略由db.c/expireIfNeeded函数实现,所有读写数据库的Redis命令在执行之前都会调用expireIfNeeded函数对输入键进行检查:
如果输入键已经过期,那么expireIfNeeded函数将输入键从数据库中删除。
如果输入键未过期,那么expireIfNeeded函数不做动作。
expireIfNeeded函数就像一个过滤器,它可以在命令真正执行之前,过滤掉过期的输入键,从而避免命令接触到过期键。
另外,因为每个被访问的键都可能因为过期而被expireIfNeeded函数删除,所以每个命令的实现函数都必须能同时处理键存在以及键不存在这两种情况:
当键存在时,命令按照键存在的情况执行。
当键不存在或者键因为过期而被expireIfNeeded函数删除时,命令按照键不存在的情况执行。
定期删除策略的实现
过期键的定期删除策略由redis.c/activeExpireCycle函数实现,每当Redis的服务器周期性操作redis.c/serverCron函数执行时,activeExpireCycle函数就会被调用,它在规定的时间内,分多次遍历服务器中的各个数据库,从数据库的expires字典中随机检查一部分键的过期时间,并删除其中的过期键。
3、del myLove
不好意思,哥们的爱无法删除!
关键词:
-
全球简讯:在 Arch Linux 中安装 GNOME 桌面所需步骤介绍
本指南解释了在Arch& 160;Linux& 160;中安装GNOME桌面所需的步骤。本指南有两部分:第一部分是关于安...
来源: Java八股文之基础篇
全球简讯:在 Arch Linux 中安装 GNOME 桌面所需步骤介绍
当你对 redis 说你中意的女孩是 Mia
环球时讯:琥珀手串会变色吗 琥珀手串会越戴越亮吗
环球看点!全球首个空中飞行出租车来了:巴黎开测 2024奥运会要用
【天天报资讯】抗早泄国产“伟哥”药物上市 市场有多大?专家称将翻倍增长 国内患者众多
全球首搭帝瓦雷音响!比亚迪腾势N7猎跑SUV亮相:运动低趴
当前速讯:鸡鸣寺游客爆满设反悔门引导离寺 网友神评:我佛果然慈悲 给反悔机会
全球今日报丨读C#代码整洁之道笔记04_重构C#代码识别代码坏味道
北方多地遭遇沙尘暴 PM爆表:气象台再发预警 还没退去
环球头条:流浪小狗乞求收养者一起带走玩具熊:画面让养狗人士泪目 为何被遗弃
今日关注:iPhone 14首发的车祸检测功能让人崩溃!苹果iOS 16.4将优化升级
世界热讯:读Java性能权威指南(第2版)笔记25_性能测试方法上
每日头条!LOL2023狗熊怎么出装(上单狗熊2023出装顺序)
精选!等了 11年 《CSGO2》电竞网游终于官宣:画质大升级 免费更新
天天简讯:使用C#开发微信公众号对接ChatGPT和DALL-E
今日关注:关于人工智能的思考,写在chatGPT爆火之时
Vue——initRender【八】
环球快讯:NVIDIA突然复活SLI!但不是你想的那样
每日看点!比尔·盖茨谈ChatGPT 赞其1980年以来最革命性技术进步
天天即时:爱子飞机上死亡:母亲怒告世界最大航司美国航空
谷歌的“GPT”终于憋出来了!但是 也不比百度强多少啊
当前热议!抖音救人一命!男子发头孢配酒视频获救:客服教科书式报警
头条:交700个税的工资多少_j700
今日讯!SEO优化:友情链接!真心换真心?
通过 poe 免费使用ChatGPT、GPT-4
天天观察:71.C++标准库类型string
CTAS建表时报错ORA-65114
Go HTTP编程
天天热点!苹果官方推荐!iNote灵感笔记新版发布:超紧凑模式来了
热讯:金士顿无敌了!拿下2022年全渠道SSD市场占有率第一
高德、口碑正式合并:阿里旗下本地到店业务将统一整合
热推荐:国科微:目前晶圆产能较前两年已趋于缓和
全球最新:关于基于AWS-Cli的方式对RDS资源批量添加tag的方法
全球微速讯:小红书去水印技巧合集(亲测有效!!!)
每日热点:Git基本使用
RHEL无法配置网关问题一则
世界快看点丨加快步伐!腾讯高管:“生成式AI”或纳入微信和QQ
天津金逸影城
2023年3月22日(软件工程日报)
阿里云大使和代理商的优惠的区别与选择
动态焦点:美债市场危机四伏 “安全资产”吸引力或进一步下降
3GB显存被封杀!《光环无限》都不让玩
Opera浏览器推送97.0.4719.26更新:集成ChatGPT与AI总结功能
世界速递!碧桂园打造湖湘人居典范 护航品质生活
世界新动态:70.C++ using的三种用法详解
环球资讯:农业银行发行700亿元二级资本债进一步增强资本实力
3599元 铭凡NUCG5迷你主机上架:碳纤维机身、下压式散热
世界百事通!比RTX 4080小一半!NVIDIA发布RTX 4000 SFF半高卡:功耗仅70瓦
【世界新要闻】专家:沙尘天气里最好别戴隐形眼镜
焦点播报:成龙和甄子丹"打架"谁会赢?甄子丹:我老了 他更老
性价比更高 有哪些散片CPU值得入手?
每日精选:Swift 备忘清单_开发速查表分享
全球信息:利用“姿态相似度比较”功能,对运动(动作)识别检测“秒”适配
国民第一APP坐实了 微信月活破13亿无可匹敌
天天时讯:堆料最多的小米手机!曝小米13 Ultra最高配1TB UFS 4.0闪存
iPhone 15 Pro工业设计敲定!这外观果粉会打多少分?
1499元!微星发布MD271UL 4K显示器:P3色域可达99%
399元1TB 速度5000MB/s!影驰星曜X4 PRO SSD图赏
世界热推荐:IDC 预计 2023 年全球可穿戴设备出货量预计将出现反弹
微头条丨低代码开发,一场深度的IT效率革命
混合多云第二课——混合技术如何每年为京东节省上亿元成本?
【天天新视野】记录--我在前端干工地(three.js)
数据库系统原理之数据库编程
当前滚动:债市日报:3月22日
女子应聘被HR质疑23岁用苹果手机:称其年纪小 手机贵
天天速讯:四川一高校放7天春假 鼓励大家去恋爱!网友:坚持一个四川原则
环球速递!腾讯2022年人均年薪102.5万!一年增加近20万
世界资讯:“长胡子”了 比亚迪海豚泰国版发布:售价约16万人民币
【全球新视野】被马化腾视为腾讯希望!微信视频号使用时长已超朋友圈
世界看热讯:农历中的惊蛰到底有什么寓意?
天天快讯:Kruise Rollout v0.3.0:教你玩转 Deployment 分批发布和流量灰度
ThreadPool实现机制
焦点热议:nodejs处理嵌套对象的npm包:dot-prop
中国西北地区发现广泛分布的侏罗纪被子植物化石
3年陈花香白牡丹:董德福鼎白茶200g装128元大促(200元券)
环球快看:188GB显存 800W功耗!NVIDIA发布H100 NVL加速卡:ChatGPT提速2倍
世界新资讯:美国两囚犯用牙刷挖洞越狱成功:墙内钢筋松了!职能部门颜面扫地
当前观察:9岁女孩豪掷18.9万打赏游戏主播 偷偷记下密码还删除转账记录
天天速讯:新能源汽车高速没电竟然倒车回服务区充电 后方车辆纷纷避让
Geyser - Minecraft Server 基岩版与Java版互通教程
世界速讯:Rust 知识积累(5)
全球热文:CSIG企业行-走进合合信息成功举行,聚焦生成式人工智能、智能文档处理前沿热点
环球今日讯!webrtc QOS笔记三 RTT计算,SRS增加XR
你可能不那么知道的Tomcat生命周期管理 | 博学谷狂野架构师
全球新资讯:国家药监局:2022年抽检11类化妆品20368批次产品 合格率97.60%
每日速看!【财经分析】投资收益拖累2022年券商业绩 投行业务景气度仍处于高位
【聚看点】澳弘电子(605058.SH):年产高精密度多层板、高密度互连积层板120万平方米建设项目及研发中心升级改造项目结项
真我GT Neo5 SE“最终幻想”配色回归:赛博朋克风满满
当前消息!《黑暗荣耀2》蝉联网飞电视剧全球榜第一:观看时间过亿
当前热门:又一日系即将退出中国?广汽三菱否认传闻:正常运转
世界看点:被谷歌商店下架 拼多多驳斥恶意软件指控!
世界聚焦:上市五年市值缩水99.6%!昔日“明星”趣头条宣布退市
新资讯:火山引擎 VeDI 零售行业解决方案 聚焦精准营销场景提升品牌转化
面试官:ThreadLocal 为什么会内存泄漏吗?是怎么产生的?面试必问!
JavaSE笔记之注解和反射(含案例代码)
当前速递!Android BLE 广播定制
环球报道:关于asp.net core filters生命周期的探究
今头条!北方多地迎沙尘!长春直接下“泥雨”:汽车变泥车
环球速讯:OPPO、小米、vivo联盟:跨品牌一键换机新增第三方应用迁移