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 - 1
	unsigned 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.mfbz.cn/a/784276.html

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

相关文章

【智能算法改进】多策略改进的蜣螂优化算法

目录 1.算法原理2.改进点3.结果展示4.参考文献5.代码获取 1.算法原理 【智能算法】蜣螂优化算法&#xff08;DBO&#xff09;原理及实现 2.改进点 混沌反向学习初始化 采用 Pwlcm 分段混沌映射&#xff0c;由于 Pwlcm 在其定义区间上具有均匀的密度函数&#xff0c;在特定的…

1.从入门到环境搭建及程序基础

目录 1.1 C督学营开营 1 老师介绍 2 学习常见问题 3 如何学习课程 1.2 程序员职业发展方向 1 前端 2 后端 3 网络安全 1.3 Windows 的 CLion 开发环境安装 1 C 语言的由来 2 安装 MinGW 编译器 3 安装 CLion 开发环境 4 运行&试用 CLion 5 新建项目​ ​6 激…

基于LangChain的RAG开发教程(二)

v1.0官方文档&#xff1a;https://python.langchain.com/v0.1/docs/get_started/introduction/ 最新文档&#xff1a;https://python.langchain.com/v0.2/docs/introduction/ LangChain是一个能够利用大语言模型&#xff08;LLM&#xff0c;Large Language Model&#xff09;能…

家里猫咪浮毛太多怎么办?值得买的猫毛空气净化器推荐

作为一位拥有5年铲屎经验的铲屎官&#xff0c;我知道许多新手铲屎官可能听说过宠物空气净化器&#xff0c;但了解得不多。事实上&#xff0c;宠物空气净化器确实是养猫家庭必备的小家电之一。它的大面积进风口可以有效吸附空气中的微小浮毛和皮屑&#xff0c;专门的除臭技术能有…

15个最佳WooCommerce商城网站及其主要功能

正在寻找的WooCommerce商城网站来激发灵感&#xff1f; 在动态的在线购物世界中&#xff0c;WooCommerce 就像企业的超级英雄。它帮助他们轻松创建强大而可靠的在线商店&#xff0c;并与WordPress顺畅协作。 从创新的产品展示到简化的结账流程&#xff0c;每个特色网站都拥有…

Linux--线程(概念篇)

目录 1.背景知识 再谈地址空间&#xff1a; 关于页表&#xff08;32bit机器上&#xff09; 2.线程的概念和Linux中线程的实现 概念部分&#xff1a; 代码部分&#xff1a; 问题&#xff1a; 3.关于线程的有点与缺点 4.进程VS线程 1.背景知识 再谈地址空间&#xff1a…

【TB作品】51单片机 Proteus仿真00016 乒乓球游戏机

课题任务 本课题任务 (联机乒乓球游戏)如下图所示: 同步显示 oo 8个LED ooooo oo ooooo 8个LED 单片机 单片机 按键 主机 从机 按键 设计题目:两机联机乒乓球游戏 图1课题任务示意图 具体说明: 共有两个单片机,每个单片机接8个LED和1 个按键,两个单片机使用串口连接。 (2)单片机…

视频号矩阵管理系统:短视频内容营销的智能助手

随着短视频行业的蓬勃发展&#xff0c;视频号矩阵管理系统应运而生&#xff0c;为内容创作者和品牌提供了一站式的短视频管理和营销解决方案。本文将深入探讨视频号矩阵管理系统的核心功能&#xff0c;以及它如何助力用户在短视频营销领域取得成功。 视频号矩阵管理系统概述 …

C++语言相关的常见面试题目(一)

1. const关键字的作用 答&#xff1a; 省流&#xff1a;&#xff08;1&#xff09;定义变量&#xff0c;主要为了防止修改 (2) 修饰函数参数&#xff1a;防止在函数内被改变 &#xff08;3&#xff09;修饰函数的返回值 &#xff08;4&#xff09;修饰类中的成员函数 2. Sta…

怎样卸载电脑上自带的游戏?

卸载电脑上自带的游戏通常是一个简单的过程&#xff0c;以下是几种常见的方法&#xff0c;您可以根据自己的操作系统版本选择相应的步骤进行操作&#xff1a; 方法一&#xff1a;通过“设置”应用卸载&#xff08;适用于Windows 10和Windows 11&#xff09; 1. 点击开始菜单&…

fastjson-1.2.24漏洞复现

文章目录 0x01 前言0x02 环境0x03漏洞复现环境准备 0x04 漏洞分析利用链源码分析 0x05 总结0x06 可能遇到的坑 0x01 前言 影响版本 fastjson < 1.2.24 本文出于学习fastjson漏洞的目的&#xff0c;为了能更好的复现漏洞&#xff0c;需要有以下前置知识。 springbootfastj…

nginx配置反向代理-CSDN

客户需求 1、实现通过域名访问税金的发票服务&#xff08;路径格式要求&#xff1a;https://www.xxx.com&#xff09; nginx的部署 前提 1、客户在局域网内已实现通过https://ip:port/stms访问税金平台 2、客户已获取https的SSL证书 3、客户申请的外网ip和域名已绑定 部署…

LeetCode——第 405 场周赛

题目 找出加密后的字符串 给你一个字符串 s 和一个整数 k。请你使用以下算法加密字符串&#xff1a; 对于字符串 s 中的每个字符 c&#xff0c;用字符串中 c 后面的第 k 个字符替换 c&#xff08;以循环方式&#xff09;。 返回加密后的字符串。 示例 1&#xff1a; 输入&…

Visual Studio Code 教程 VsCode安装Live Server以服务形式打开html

搜索Live Server 插件,然后安装 选一个html文件&#xff0c;右键点击 Open with live server,然后就自动弹出来了

最优化方法 运筹学【】

1.无约束 常用公式 线搜索准则&#xff1a;求步长 精确线搜索&#xff08;argmin&#xff09; 最速下降&#xff1a;sd&#xff1a;线性收敛 2.算法 SD dk&#xff1a;付梯度-g newton dk&#xff1a;Gkd-g 二阶收敛&#xff0c;步长为1 阻尼牛顿&#xff1a;步长用先搜…

数据分析与挖掘实战案例-电商产品评论数据情感分析

数据分析与挖掘实战案例-电商产品评论数据情感分析 文章目录 数据分析与挖掘实战案例-电商产品评论数据情感分析1. 背景与挖掘目标2. 分析方法与过程2.1 评论预处理1. 评论去重2. 数据清洗 2.2 评论分词1. 分词、词性标注、去除停用词2. 提取含名词的评论3. 绘制词云查看分词效…

Linux dig命令常见用法

Linux dig命令常见用法 一、dig安装二、dig用法 DIG命令(Domain Information Groper命令)是常用的域名查询工具&#xff0c;通过此命令&#xff0c;你可以实现域名查询和域名问题的定位&#xff0c;对于网络管理员和在域名系统(DNS)领域工作的小伙伴来说&#xff0c;它是一个非…

Linux中的粘滞位及mysql日期函数

只要用户具有目录的写权限, 用户就可以删除目录中的文件, 而不论这个用户是否有这个文件的写 权限. 为了解决这个不科学的问题, Linux引入了粘滞位的概念. 粘滞位 当一个目录被设置为"粘滞位"(用chmod t),则该目录下的文件只能由 一、超级管理员删除 二、该目录…

汇川CodeSysPLC教程 Modbus变量编址

线圈&#xff1a;位变量&#xff0c;只有两种状态0和1。汇川PLC中包含Q区及SM区等变量。 寄存器&#xff1a;16位&#xff08;字&#xff09;变量&#xff0c;本PLC中包含M区及SD区等变量 说明&#xff1a; 汇川HMI的专用协议使用不同功能码&#xff1a;在访问SM时&#xff0c…

基于Java+SpringMvc+Vue技术的实验室管理系统设计与实现(6000字以上论文参考)

博主介绍&#xff1a;硕士研究生&#xff0c;专注于信息化技术领域开发与管理&#xff0c;会使用java、标准c/c等开发语言&#xff0c;以及毕业项目实战✌ 从事基于java BS架构、CS架构、c/c 编程工作近16年&#xff0c;拥有近12年的管理工作经验&#xff0c;拥有较丰富的技术架…