Redis存储原理与数据模型

Redis存储结构

存储转换

  • redis-value编码
    • string
      • int:字符串长度小于等于20切能转成整数
      • raw:字符串长度大于44
      • embstr:字符串长度小于等于44
    • list
      • quicklist(双向链表)
      • ziplist(压缩链表)
    • hash
      • dict(字典):节点数量大于512或者字符串长度大于64
      • ziplist(压缩链表):节点数量小于等于512且字符串长度小于等于64
    • set
      • intset(整数数组):元素都为整数且节点数量小于等于512
      • dict(字典):元素有一个不是整数或者数量大于512
    • zset
      • skiplist(跳表):数量大于128或者有一个字符串长度大于64
      • ziplist(压缩列表):子节点数量小于等于128且字符串长度小于等于64

字典实现

redis中的KV组织是通过字典实现的;hash结构当节点超过512个或者单个字符串长度大于64时,hash结构采用字典实现。

数据结构

typedef struct dictEntry {void *key;union {void *val;uint64_t u64;int64_t s64;double d;} v;struct dictEntry *next;
} dictEntry;typedef struct dictht {dictEntry **table;unsigned long size; // 数组长度unsigned long sizemask; // size - 1unsigned long used; // 当前数组中包含的元素
} dictht;typedef struct dict {dictType *type;void *privdata;dictht ht[2];long rehashidx; /* rehashing not in progress if rehashidx == -1 */int16_t pauserehash; /* If >0 rehashing is paused (<0 indicates coding error) 用于安全遍历*/ 
} dict;
  • 字符串经过hash函数运算得到64位整数;
  • 相同字符串多次通过hash函数得到相同的64位整数;
  • 整数对2^n取余可以转化为位运算;
  • 抽屉原理 n+1个苹果放在 n 个抽屉中,苹果最多的那个抽屉至少有 2 个苹果;64位整数远大于数组的长度,比如数组长 度为 4,那么 1、5、9、1+4n 都是映射到1号位数组;所以 大概率会发生冲突;

冲突

  • 负载因子:负载因子=used/sizeused是数字元素个数,size是数组长度;负载因子越小,冲突越小;负载因子越大,冲突越大;redis的负载因子是1

扩容

  • 如果负载因子>1,则会发生扩容;扩容的规则是翻倍;
  • 如果正在fork(在rdb、aof复写以及rdb-aof混用的情况下)时,会阻止扩容;但是此时若负载因子>5,索引效率会大大下降,则马上扩容;这里涉及到写时复制原理

缩容

  • 如果负载因子 < 0.1,则会发生缩容;缩容的规则是恰好包含 used 的 ;
  • 恰好的理解:假如此时数组存储元素个数为 9,恰好包含该元素 的就是 ,也就是 16;

渐进式rehash

当hashtable中的元素过多的时候,不能一次性rehash到th[1];这样会长期占用redis,其他命令得不到相应;所以需要使用渐进式rehash;

rehash步骤

ht[0]中的元素重新hash成64位整数,再对ht[1]长度进行取余,从而映射到ht[1];

渐进式规则

  1. 分治的思想,将rehash分到之后的每步增删改查的操作当中;
  2. 再定时器中,最大执行一毫秒rehash;每次步长100个数组槽位;
  3. rehash阶段,不会发生扩容和缩容。

scan

scan cursor [MATCH pattern] [COUNT count] [TYPE type]

  • 采用高位进位加法的遍历顺序,rehash 后的槽位在遍历顺序上 是相邻的;
  • 遍历目标是:不重复,不遗漏 ;
  • 会出现一种重复的情况:在 scan 过程当中,发生两次缩容的时候,会发生数据重复;

expire机制

expire key seconds
pexpire key milliseconds
ttl key
pttl key

惰性删除

分布在每一个命令操作时检查key是否过期;若过期删除key,再进行命令操作;

定时删除

在定时器中检查库中指定个数(25)个key;

#define ACTIVE_EXPIRE_CYCLE_KEYS_PER_LOOP 20 /* Keys for each DB loop.
/* Keys for each DB loop. *//*The default effort is 1, and the maximum configurable effort is 10. */config_keys_per_loop = 
ACTIVE_EXPIRE_CYCLE_KEYS_LOOP + ACTIVE_EXPIRE_CYCLE_KEYS_LOOP/4*effort,
int activeExpireCycleTryExpire(redisDb *db, dictEntry *de, long long now);

大KEY

在 redis 实例中形成了很大的对象,比如一个很大的 hash 或很 大的 zset,这样的对象在扩容的时候,会一次性申请更大的一块 内存,这会导致卡顿;如果这个大 key 被删除,内存会一次性 回收,卡顿现象会再次产生;
如果观察到redis内存大起大落,极有可能是大key导致的;

# 每隔0.1秒,执行100条scan命令
redis-cli -h 127.0.0.1 --bigkeys -i 0.1

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

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

相关文章

意得辑ABSJU202优惠15%啦,新用户注册直减哦

不得不说&#xff0c;还得是意得辑&#xff0c;钱不白花&#xff0c;润色的挺好~ 第一篇SCI终于成功见刊&#xff01;&#xff01;&#xff01; 都来接accept&#xff01;&#xff01;&#xff01;谢谢accept小狗&#xff0c;接accept 求求accept小狗&#xff0c;真的想要双证毕…

站常用金属材料检测试题

一、单选题 1.正火采用的哪一种冷却方式( ) A.风冷 B.炉冷 C.油冷 D.空冷 参考答案:D 2.哪个合金属于弹簧钢?( ) A.20Cr B.9SiCr C.65Mn D.W18Cr4V 参考答案:C 3.T8A是什么工具钢?( ) A.碳素工具钢 B

OS-HACKNOS-2.1

确定靶机IP地址 扫描靶机开放端口信息 目录扫描 访问后发现个邮箱地址 尝试爆破二级目录 确定为wordpress站 利用wpscan进行漏洞扫描 #扫描所有插件 wpscan --url http://192.168.0.2/tsweb -e ap 发现存在漏洞插件 cat /usr/share/exploitdb/exploits/php/webapps/46537.txt…

关于QFontMetrics的使用时机

QFontMetrics 是一个非常有用的类&#xff0c;用于测量字体的各种属性&#xff0c;如文本的宽度、高度以及字符的尺寸等。它在 Qt 中的许多场景下都非常有用&#xff0c;特别 是在需要精确控制文本布局和绘制的情况下。以下是一些 QFontMetrics 最常用的时机&#xff1a; 1. …

location匹配和rewrite重定向

目录 location 匹配 location匹配的分类和优先级 优先级细分 实际网站中的使用规则 1.用精确匹配来实现网站的首页 访问网站的首页 &#xff08; /&#xff09; 2.用正则匹配来实现静态请求的页面和图片 匹配静态页面 访问图片或者指定的后缀名 3.用一般匹配转发.php…

树状数组

树状数组 树状数组的核心思想&#xff1a;分治。将数组以二叉树的形式进行维护区间之和。 设 a a a为原数组&#xff0c; t r e e tree tree为树状数组。 t r e e tree tree数组用于存储树上该结点下严格直连的子节点之和(例&#xff1a; t [ 1 ] a [ 1 ] , t [ 2 ] t [ 1 …

SQL面试题练习 —— 连续签到领金币

目录 1 题目2 建表语句3 题解 题目来源&#xff1a;百度。 1 题目 有用户签到记录表&#xff0c;t_coin_signin&#xff0c;记录用户当天是否完成签到&#xff0c;请计算出每个用户的每个月获得的金币数量&#xff1b; 签到领金币规则如下&#xff1a; 用户签到获得1金币&…

LinearLayout的测量流程

在日常开发中我们常常使用LinearLayout作为布局Group&#xff0c;本文从其源码实现出发分析测量流程。大家可以带着问题进入下面的分析流程&#xff0c;看看是否能找到答案。 垂直测量 View的测量入口方法是onmeasure方法。LinearLayout的onMeasure方法根据其方向而做不同的处…

使用C++实现ATM系统,谈谈思路及代码实现

&#x1f3c6;本文收录于「Bug调优」专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收藏&&…

Android 注解的语法原理和使用方法

Android 注解的语法原理和使用方法 关于我 在 Android 开发中&#xff0c;注解&#xff08;Annotation&#xff09;是一种强大的工具&#xff0c;用于在代码中添加元数据。注解可以简化代码、提高可读性、减少样板代码&#xff0c;并且在一定程度上增强编译时的类型检查。本文…

JavaScript: 动态语言的魔法

JavaScript 是一种非常流行的编程语言&#xff0c;用于构建网站和网络应用程序。它是一种动态类型语言&#xff0c;这意味着您可以在代码运行时改变变量的类型。这篇文章将带您了解 JavaScript 的魔力&#xff0c;并展示一些基本概念和技巧。 1. 变量和数据类型 在 JavaScrip…

为什么需要重写equals和如何重写equals

首先先看Java中的 &#xff0c;比较的两个对象的地址值。 如果是基本数据类型&#xff0c;那么就是比较的是值。 如果是引用数据类型&#xff0c;比较的就是地址. object类中的equals方法也是用的&#xff1b; 所以要比较两个对象的大小&#xff0c;去调用默认的equals方法…

前端传到后端的data数组中有些属性值为空

将前端输入框中的值全部放入data中传入后端&#xff0c;但是在后端查看发现后端接收到的数据有些属性值为空。 第一种情况&#xff1a;只有第一个属性为空&#xff0c;其余属性接收正常 可能原因&#xff1a;后端用来接收的 比如前端发送数据&#xff1a; 实际上前端发送的数…

[图解]SysML和EA建模住宅安全系统-13-时间图

1 00:00:00,480 --> 00:00:02,280 首先&#xff0c;我们来看&#xff0c;图画在哪里 2 00:00:02,290 --> 00:00:04,380 这个图 3 00:00:04,390 --> 00:00:06,180 你看&#xff0c;它是描述&#xff0c;刚才讲的 4 00:00:06,190 --> 00:00:09,010 描述这个活动 …

两年经验前端带你重学前端框架必会的ajax+node.js+webpack+git等技术 Day2

前端框架必会的&#xff08;ajaxnode.jswebpackgit&#xff09;个人学习心得作业及bug记录 Day2 你好,我是Qiuner. 为帮助别人少走弯路和记录自己编程学习过程而写博客 这是我的 github https://github.com/Qiuner ⭐️ ​ gitee https://gitee.com/Qiuner &#x1f339; 如果本…

昇思25天打卡营-mindspore-ML- Day14-VisionTransformer图像分类

今天学习了Vision Transformer图像分类&#xff0c;这是一种基于Transformer模型的图像分类方法&#xff0c;它不依赖卷积操作&#xff0c;而是通过自注意力机制捕捉图像块之间的空间关系&#xff0c;从而实现图像分类。 基本原理&#xff1a; 图像分块: 将原始图像划分为多个…

C# Modbus

应用程序配置的保存 1 右键应用设置 → 属性 → 添加键值对和用户范围&#xff0c;应用程序和用户范围 2 获取配置参数:Properties.Settings.Default.参数名 3 修改修改参数 roperties.Settings.Default["A"] 10 最后调用 save进行保存 1.什么是modbus? 包含的内容…

Java基础---复习01

main方法 一个程序有且只有一个main方法&#xff0c;main方法是java程序的唯一入口。 修饰符 修饰类修饰方法修饰域public都可以访问都可以访问private私有类只能本类只能本类protected子类可以继承、访问&#xff0c;同包下的类也可以访问子类可以继承、访问&#xff0c;同…

mmdetection中的Spatial-Transform-Decoupling项目部署,debug记录

1.安装环境 在这之前&#xff0c;因为是新的服务器&#xff0c;很多包没有安装 安装conda&#xff0c;在root/anaconda/bin 巴拉巴拉 vim~/bash.rc 按ESC 按&#xff1a;wq 删除是Delete sudo apt install libnccl22.7.8-1cuda11.0 libnccl-dev2.7.8-1cuda11.0bug1&#xff1…

基于单片机的空调控制器的设计

摘 要 &#xff1a; 以单片机为核心的空调控制器因其体积小 、 成本低 、 功能强 、 简便易行而得到广泛应用 。 本设计通过 &#xff21;&#xff34;&#xff18;&#xff19;&#xff33;&#xff15;&#xff12; 控制&#xff24;&#xff33;&#xff11;&#xff18;&a…