redis原理深入解析之看完这篇还需要努力

数据结构

动态字符串SDS

struct __attribute__ ((__packed__)) sdshdr8 {uint8_t len;   /*已保存的字节数 不含结束标识 header*/uint8_t alloc; /*申请总的字节数,不含结束标识 header*/unsigned char flags;/*不同sds头类型,控制sds头大小 header*/char buf[]; 
}

len:4 alloc:4 flags:1  数组 \0

sds可追加:动态扩容  减少内存分配次数 二进制安全

   如新字符串<1m 新空间为扩展后字符串长度的两倍+1

   如新字符串>1m 新空间为扩展后字符串长度+1m+1 内存预分配

IntSet

set集合实现方式,整数数组 长度可变 有序(升序)

typedef struct intset {uint32_t encoding;/*编码方式 支持存放16 32 64位*/uint32_t length; /*元素个数*/int8_t contents[];/*整数数组 保存集合数据*/
}

encoding:iniset_enc_int16(四字节)  length:3(四字节)  contents[] (地址) 

  intset_enc_int32  32位 4字节  ; intset_enc_int16  16位2字节 

自动升级编码encoding

 升级:编码升级 倒序依次将数组元素拷贝到扩容后到正确位置(所占字节数)

元素唯一          支持类型升级 节省内存空间           二分查找元素

dict:哈希表 哈希节点 字典组成

向dict添加键值对,先key计算hash值h,利用h & sizemask计算元素存储到数组中索引位置

     与运算:同1则1 否则0   真真则真and

//哈希表
typedef struct dictht {dictEntry **table ;//数组 指向entry到指针unsigned long size;//哈希表大小 2的n次方unsigned long sizemask;//哈希表大小的掩码 size-1unsigned long used;//entry个数
}dictnt;
//节点
typedef struct dictEntry{void *key;//键union {void *val;uint64_t u64;int64_t s64;double d;}v;//值//下一个entry指针struct dictEntry *next;
}dictEntry;

字典dict

typedef struct dict {dictType *type;//类型,内置不同的hash函数void *privdata;//私有数据,特殊hash运算时用dictht ht[2];//两个哈希表,当前数据 另个一般为空 rehash使用long rehashidx;//rehash进度 -1未进行int16_t pauserehash;//rehash是否暂停 1暂停0继续
}

元素较多    哈希冲突多     链表长    查询效率降低 

扩缩

扩容

     负载因子 loadFactor >= 1 未执行bgsave/bgrewriteaof等

     或者loadFactor > 5

收缩

     删除,loadFactor<0.1

ziplist 节省内存 双端链表 连续内存 O(1)

通过记录上一节点本节点长度来寻址,内存占用低

  zlbytes(总字节数) zltail(尾偏移量|尾节点距压缩列表起始地址)zllen(节点个数65534)entry(头节点)……entry(尾节点)zlend(oxFF标记末端)

 entry

   previous_entry_length前节点长度   

   encoding编码属性记录数据类型及长度

   contents保存节点的数据

优化:限制ziplist长度 entry大小   多个ziplist分片存储数据 

quicklist  3.2 双端链表 节点上ziplist  压缩

list-max-ziplist-size

   正数限制entry个数

  -1内存不超4k -2不超8k默认  -3不超16k -4不超32k  

list-compress-depth

  0首尾不压缩 1首尾各1节点不压缩中间压 2首尾各2节点不压 其他压

skiplist 链表 升序排列存储 

 一个节点多个指针 跨度不同   多层指针 

redisObject类型

底层编码

  

字符串:int  embstr  raw

sds   存储上限512m

  长度小于44 embstr  header与sds连续 空间 一次内存分配  64k不需要分片 效率高

list 首尾操作 

 ziplist压缩 双端访问 记录地址大小推算出 ,存储上限低

 linkedlist 普通链表 双端访问 内存占用高 碎片多

 quicklist:linkedlist+ziplist 双端访问 内存占用低 3.2

set   单列    无序    唯一    交并差集

 hash(dict) key存元素value为null;

 intset编码,省内存 数据都是整数 量不超过set-max-inset-entries

 

zset 可排序 score member

hashtable +skiplist 排序 :内存占用大

ziplist数据量不多:元素<zset_max_ziplist_entries 128,元素<zset_max_ziplist_value 64

hash 键值存储 键唯一 

ziplist 节省内存 相邻的entry分别存储field和value

hash:数据量大 num>hash_max_ziplist_entries512 & entry>hash_max_ziplist_value64

网络模型

用户空间 内核空间

进程寻址空间

用户空间:受限的命令ring3,不直接调用系统资源 通过内核接口访问

内核空间:调用一切资源 特权命令

阻塞io与非阻塞

阻塞io:阻塞等待数据

非阻塞io:反复调用recvfrom,二阶段阻塞等待 处理数据返回成功标识

io多路复用:

文件描述符file descriptor,从0开始递增无符号整数,关联linux文件

io多路复用:单个线程同时监听多个fd,在某个fd可读 可写时得到通知 利用cpu资源

通知方式:

select/poll:会通知用户进程fd就绪,但是不确定哪个fd,一次询问谁准备好了

     select 每次都需要将fd_set用户到内核,结束在拷贝回用户

     不知道具体哪个fd就绪,监听的fd数量<1024

poll:

epoll:通知用户进程谁准备就绪了

 事件通知事件

fd有数据 epoll_wait 可得到通知 但是事件通知的模式:

   levelTriggered:有数据可读 重复通知多次 直到数据处理完成 epoll默认模式

   edgetriggered:有数据可读,只通知一次 

网络模型

命令处理 单线程 

4.0引入多线程异步处理一些耗时较长的任务,异步删除命令unlink

6.0核心网络模型引入多线程 多核CPU利用率

redis网络模型 

通信规范

resp:CS架构的软件 通信一般分两步(不含pipeline和pubsub)

  client 向 server 发送一条命令

  服务端解析并执行命令,返回响应给客户端

数据类型:

  单行字符串 首字节+ 后跟单行字符串 crlf结尾(\r\n)

  错误errors,首字符- crlf结尾

  数值:首字节: + 数字格式的字符串 crlf结尾 

  多行字符串:首字节$ 最大支持512m,=0空字符串$0\r\n\r\n. =-1不存在$-1\r\n

  数组 首字节* 后面跟上 数组元素个数 再跟上元素  

key过期  

 两个dict记录key-value和key-ttl

过期策略:

惰性删除:每次查找先判断是否过期 

周期删除:定时任务  周期性抽样部分过期key 删除

   skiw:默认1s10次,周期100ms,遍历db多bucket 取20key是否过期 一删除,执行清理耗时不超过一次执行周期短25%

 fast:两次间隔不低于2ms,清理耗时不超过1ms,逐个遍历db多bucket 取20key是否过期,

淘汰策略

  processCommand尝试做内存淘汰

   noeviction:不淘汰 内存满不写数据

   volatile-ttl设置了ttl的key,比较key的剩余ttl值越小越先被淘汰

   allkeys-random全体key 随机淘汰 db->dict

   allkeys-lru lru算法 最少最近使用 当前时间减去最后一次访问时间 大则先淘汰

   volatile-lru:设置了ttl的key lru淘汰

   allkeys-lfu:全体key 基于lfu算法淘汰

   volatile-lfu设置了ttl的可以 基于lfi算法进行淘汰

lru算法 最少最近使用 当前时间减去最后一次访问时间 大则先淘汰

lfu最少频率使用,统计key访问频率,值越小淘汰优先级越高

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

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

相关文章

【AI视野·今日Robot 机器人论文速览 第八十二期】Tue, 5 Mar 2024

AI视野今日CS.Robotics 机器人学论文速览 Tue, 5 Mar 2024 Totally 63 papers &#x1f449;上期速览✈更多精彩请移步主页 Interesting: &#x1f4da;双臂机器人拧瓶盖, (from 伯克利) website: https://toruowo.github.io/bimanual-twist &#x1f4da;水下抓取器, (from …

Dynamo初学尝试梳理(五)-代码块上

“学而时习之&#xff0c;不亦说乎”&#xff0c;今天接着来&#xff0c;稍微提高点难度&#xff08;高手直接忽略就行&#xff09;。 代码块&#xff08;Code Block&#xff09;&#xff0c;是 dynamo 中可以直接输入 DesignScript 的节点。可以通过双击鼠标左键&#xff0c;快…

程序员书单推荐:从入门到精通的必读之作

在程序员的职业生涯中&#xff0c;阅读技术书籍是不断学习和提升自我的重要途径。本文将为你推荐一系列从入门到精通的程序员书单&#xff0c;帮助你系统地掌握编程知识、提高技能水平&#xff0c;并在职业生涯中取得更大的进步。 一、入门篇 《Head First C语言》&#xff1…

基于SpringBoot+Vue+ElementUI+Mybatis前后端分离管理系统超详细教程(一)

Vue.js 是一个流行的前端框架&#xff0c;用于构建用户界面和单页应用程序。Vue 2 是其第二个主要版本&#xff0c;它提供了数据绑定、组件化、虚拟DOM等核心特性。要搭建一个 Vue 2 的工程化项目&#xff0c;可以遵循以下步骤&#xff1a; 一、前端环境搭建 &#xff08;一&a…

Maven入门(作用,安装配置,Idea基础maven,Maven依赖,Maven构建项目)【详解】

目录 一. Maven的作用 1.依赖管理 2.统一项目结构 3.项目构建 二.Maven安装配置 1. Maven的仓库类型 2 加载jar的顺序 3. Maven安装配置 4.安装Maven 5.配置仓库 三.idea集成maven 1.给当前project集成maven 2.给新建project集成maven 3.创建maven项目 4.pom…

二维码门楼牌管理系统应用场景:地方社区管理的新利器

文章目录 前言一、地方社区管理部门的门牌信息利用二、与社区管理部门的联动效应三、结论 前言 随着信息技术的不断发展&#xff0c;二维码门楼牌管理系统逐渐成为地方社区管理的新宠。该系统通过集成二维码技术与门楼牌信息&#xff0c;为社区管理带来了前所未有的便利与高效…

Github 2024-03-07Go开源项目日报 Top10

根据Github Trendings的统计,今日(2024-03-07统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Go项目10TypeScript项目1Harbor - 开源的云原生注册表项目 创建周期:2908 天开发语言:Go协议类型:Apache License 2.0Star数量:21549 个For…

uniapp 解决请求出现 /sockjs-node/info?t=问题

1. uniapp请求出现 /sockjs-node/info?t问题 1.1. 问题 uniapp项目老是出现 http://192.168.2.106:8080/sockjs-node/info?t1709704280949 1.1. sockjs-node介绍 sockjs-node 是一个JavaScript库&#xff0c;提供跨浏览器JavaScript的API&#xff0c;创建了一个低延迟、全…

selinux规则

selinux状态 相关命令 进程要和文件的安全上下文相匹配&#xff0c;进程才能打开文件 查找这个命令从哪个安装包来的用 yum provides 命令 进程httpd 必须与ls -Z的文件类型一致&#xff0c;要不然在强制模式下面&#xff0c;打开不了 在终端2用此命令&#xff0c;把文件类型改…

【有趣】带照明灯的自行车“铃”

这个自行车“铃”发出的不是令行人刺耳讨厌的金属铃声&#xff0c;而是礼貌友好的“请让路&#xff0c;谢谢&#xff01;”声&#xff0c;新颖而有趣&#xff1b;照明灯则为夜间骑车带来方便&#xff0c;既保安全而又实用。整个装置成本不足10元&#xff0c;制作和安装使用也都…

微信小程序用户登陆和获取用户信息功能实现

官方文档&#xff1a; https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/login.html 接口说明&#xff1a; https://developers.weixin.qq.com/miniprogram/dev/OpenApiDoc/user-login/code2Session.html 我们看官方这个图&#xff0c;梳理一下用户…

本地项目推送到腾讯云轻量应用服务器教程(并实现本地推送远程自动更新)

将本地项目上传到腾讯云轻量应用服务器并实现后续的推送更新&#xff0c;具体步骤如下&#xff1a; 在本地项目目录下初始化 Git 仓库&#xff1a; cd 项目目录 git init将项目文件添加到 Git 仓库并提交&#xff1a; git add . git commit -m "Initial commit"在…

git 命令怎么回退到某个特定的 commit 并将其推送到远程仓库?

问题 不小心把提交的名称写错提交上远程仓库了&#xff0c;这里应该是 【029】的&#xff0c;这个时候我们想回到【028】这一个提交记录&#xff0c;然后再重新提交【029】到远程仓库&#xff0c;该怎么处理。 解决 1、首先我们找到【028】这条记录的提交 hash&#xff0c;右…

瑞芯微第二代8nm高性能AIOT平台 RK3576 详细介绍

RK3576处理器 RK3576瑞芯微第二代8nm高性能AIOT平台&#xff0c;它集成了独立的6TOPS&#xff08;Tera Operations Per Second&#xff0c;每秒万亿次操作&#xff09;NPU&#xff08;神经网络处理单元&#xff09;&#xff0c;用于处理人工智能相关的任务。此外&#xff0c;R…

teknoparrot命令行启动游戏

官方github cd 到teknoparrot解压目录 cd /d E:\mn\TeknoParrot2_cp1\GameProfiles启动游戏 TeknoParrotUi.exe --profile游戏配置文件游戏配置文件位置/UserProfiles,如果UserProfiles文件夹里没有那就在/GameProfiles,在配置文件里将游戏路径加入之间,或者打开模拟器设置 …

基于ACM32 MCU的两轮车充电桩方案,打造高效安全的电池管理

随着城市化进程的加快、人们生活水平的提高和节能环保理念的普及&#xff0c;越来越多的人选择了电动车作为代步工具&#xff0c;而两轮电动车的出行半径较短&#xff0c;需要频繁充电&#xff0c;因此在城市中设置两轮车充电桩就非常有必要了。城市中的充电桩不仅能解决两轮车…

python+django+vue房屋租赁系统 8gwmf

房屋租赁系统在设计与实施时&#xff0c;采取了模块性的设计理念&#xff0c;把相似的系统的功能整合到一个模组中&#xff0c;以增强内部的功能&#xff0c;减少各组件之间的联系&#xff0c;从而达到减少相互影响的目的。如房源信息、预约信息、求租信息模块等[12]。 管理员后…

springcloud:3.7测试线程池服务隔离

服务提供者【test-provider8001】 Openfeign远程调用服务提供者搭建 文章地址http://t.csdnimg.cn/06iz8 相关接口 测试远程调用&#xff1a;http://localhost:8001/payment/index 服务消费者【test-consumer-resilience4j8004】 Openfeign远程调用消费者搭建 文章地址http://t…

[Redis]——数据一致性,先操作数据库,还是先更新缓存?

目录 一、操作缓存和数据库时有三个问题需要考虑&#xff1a; 1.删除缓存还是更新缓存&#xff1f; 2.如何保证缓存与数据库的操作同时成功或失效 3.先操作缓存还是先操作数据库&#xff08;多线程并发问题&#xff09; 二、 缓存更新的最佳策略 一、操作缓存和数据库时有…

深度学习-多层神经网络

文章目录 多层深度神经网络一.黑箱&#xff1a;深层神经网络的不可解释性二.多元神经网络&#xff1a; 层与 h ( z ) h(z) h(z)三.激活函数 多层深度神经网络 从单层到多层是神经网络发展史上的重大变化&#xff0c;层的增加彻底将神经网络的性能提升到了另一个高度&#xff0…