redis7知识点总结

2023-11-10

1. redis单线程为啥会这么快

  1. 基于内存操作,一条命令几十纳秒
  2. 单线程,减少线程切换
  3. 使用io多路复用技术
  4. 使用高效的数据存储结构,链表和数组

2. redis数据类型和底层存储结构

参考: Redis的五种数据结构的底层实现原理

type数据类型,对应的是value五种数据类型。
字符串:REDIS_STRING;
哈希:REDIS_HASH;
列表:REDIS_LIST;
集合:REDIS_SET;
有序集合:REDIS_ZSET
encoding类型如下图
在这里插入图片描述
String类型的编码方式,即encoding有三种:int、embstr、raw。
value的值是整数,encoding为int,没有对应底层数据结构;
value长度小于32,encoding为embstr,长度大于,32编码为raw,embstr和raw都使用SDS数据结构存储。

2.1 string类型

By default, a single Redis string can be a maximum of 512 MB.

2.1.1 SDS

参考: Redis 源码解读——sds
在这里插入图片描述
sds优势

  1. 提升性能,sds直接使用len字段获取长度,时间复杂度是o(1), c语言中获取字符串长度是遍历,直到遇到‘\0’,时间复杂度是o(n)
  2. 保证二进制安全,sds遇到‘\0’不会结束,c语言字符串遇到‘\0’结束
  3. 减少内存再分配次数, sds修改字符串不一定会重新分配内存,采用的是空间与分配和惰性空间释放策略来避免内存再分配,len小于1M,会分配2len(str)的空间,修改时,空间够则不进行分配,不够则再分配2len(总str), 修改后字符串长度大于1M,则再分配1m的未使用空间, 当c语言修改字符串,会进行内存再分配策略
    参考: redis字符串实现,空间与分配,sds和c区别
  4. 兼容c函数, 用于字符串比较,strcmp(sds_str->buf, buf),buf属性为一个字符数组,,最后一个保存空字符’\0’,空字符不算进len中
  5. 杜绝缓冲区溢出
    在这里插入图片描述
    参考:理解Redis设计与实现(一):简单动态字符串(SDS)

2.2 hash类型

listpack 和hash表

2.3 list类型

在这里插入图片描述
quicklist

2.4 set类型(集合)

intset和哈希表
参考: Redis之intset(整数集合)

2.5 zset类型(有序集合)

listpack和skiplist

2.6 ziplist压缩列表

是经过特殊编码的可以存储字符串或整数的双向链表
参考 : Redis Ziplist(压缩列表)
在这里插入图片描述

  • zlbytes:记录整个ziplist的大小。
  • zltail:ziplist开始指针与最后一个entry之间的偏移量,通过该偏移量可以获得最后一个entry。
  • zllen:entry数量。
  • entry:存储具体数据的节点。
  • zlend:ziplist结尾标识。
    ziplist会导致级联更新,降低性能

2.7 listpack

与ziplist类似
在这里插入图片描述

2.8 quicklist-快速列表

在这里插入图片描述

  • -2 表示zlbytes 最大8k
    在这里插入图片描述
typedef struct quicklist {
    quicklistNode *head;
    quicklistNode *tail;
    unsigned long count;        /* total count of all entries in all listpacks */
    unsigned long len;          /* number of quicklistNodes */
    signed int fill : QL_FILL_BITS;       /* fill factor for individual nodes */
    unsigned int compress : QL_COMP_BITS; /* depth of end nodes not to compress;0=off */
    unsigned int bookmark_count: QL_BM_BITS;
    quicklistBookmark bookmarks[];
} quicklist;
  1. 检索(遍历 zlen 的和 与index比较)
  2. 插入数据, 先检索,再插入,插入数据时需要判断插入数据的大小
    在这里插入图片描述
  3. 删除元素
    如果删除后ziplist 没有元素,则需要吧该ziplist也从链表中移除

2.9 skiplist 跳表

在这里插入图片描述
在这里插入图片描述

优点:查询快
缺点:节点增或删除之后需要更新层级结构,采用随机化的层级结构解决此问题

参考Redis源码解析:数据结构详解-skiplist

3. redis高可用方案(集群策略)

  1. 主从集群-1主多从
  2. 主从+哨兵
  3. 多主多从模式

参考:4 种 Redis 集群方案介绍 + 优缺点对比

4. redis淘汰key算法

LRU(least recently used) 和LFU(least frequently used)

5. redis过期key删除策略

惰性过期-只有访问到了才回去检查是否过期,过期则删掉
定期过期- 隔一定时间扫描一定数量的key,删除过期的

6. redis分布式锁

7. redis数据持久化

rdb和aof

8. redis如何配置key的过期时间,实现原理

expire
setex
惰性过期-只有访问到了才回去检查是否过期,过期则删掉
定期过期- 隔一定时间扫描一定数量的key,删除过期的, 平衡执行频率和执行时长,会遍历每个database(默认16个), 检查当前数据库中执行的key(默认20个), 随机抽查key, 过期就删除

9. redis主从复制原理

10. redis高并发问题

redis高并发问题以及解决方案

11. 热点数据缓存重建问题

双重检测锁
分布式锁(针对不同的key设置不同的锁)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

redis7知识点总结 的相关文章

  • 无法启动redis.service:单元redis-server.service被屏蔽

    我在 ubuntu 16 04 上安装了 Redis 服务器 但是当我尝试使用启动redis服务时 sudo systemctl start redis 我收到消息 Failed to start redis service Unit re
  • Lua中按字符分割字符串

    我有像这样的字符串 ABC DEF 我需要将它们分开 字符并将两个部分分别分配给一个变量 在 Ruby 中 我会这样做 a b ABC DEF split 显然Lua没有这么简单的方法 经过一番挖掘后 我找不到一种简短的方法来实现我所追求的
  • 2 个具有共享 Redis 依赖的 Helm Chart

    目前 我有 2 个 Helm Charts Chart A 和 Chart B Chart A 和 Chart B 对 Redis 实例具有相同的依赖关系 如Chart yaml file dependencies name redis v
  • Laravel 所有会话 ID 与 Redis 驱动程序

    在我的应用程序中 我希望允许某些用户能够注销除他 她之外的所有其他用户 当会话驱动程序设置为文件时 我已经完成了此功能 但现在我使用 redis 作为会话驱动程序 并且我无法找到任何方法来列出所有当前会话 就像我在文件时所做的那样司机 问题
  • 如何将“.csv”数据文件导入Redis数据库

    如何将 csv 数据文件导入 Redis 数据库 csv 文件中包含 id 时间 纬度 经度 列 您能否向我建议导入 CSV 文件并能够执行空间查询的最佳方法 这是一个非常广泛的问题 因为我们不知道您想要什么数据结构 您期望什么查询等等 为
  • 如何使用 Redis 自动删除与模式匹配的键

    在我的 Redis DB 中 我有很多prefix
  • 在 Spring 4 中干掉通用的 RedisTemplate

    我读到你可以拥有 Autowired从 Spring 4 开始泛型 这太棒了 我有一个摘要RedisService我想参加的课程 Autowired一个通用的 RestTemplate 如下所示 public abstract class
  • 如何使用redis发布/订阅

    目前我正在使用node js和redis来构建应用程序 我使用redis的原因是因为发布 订阅功能 该应用程序只是在用户进入用户或离开房间时通知经理 function publishMsg channel mssage redisClien
  • Spring Data Redis 覆盖默认序列化器

    我正在尝试创建一个RedisTemplatebean 将具有更新的值序列化器来序列化对象JSONredis 中的格式 Configuration class RedisConfig Bean name redisTemplate Prima
  • 超出 Redis 连接/缓冲区大小限制

    在对我们的应用程序服务器进行压力测试时 我们从 Redis 中得到以下异常 ServiceStack Redis RedisException 无法连接到 redis host 6379 处的 redis 实例 gt System Net
  • 使用环境变量在 redis.conf 中设置动态路径

    我有一个环境变量MY HOME其中有一个目录的路径 home abc 现在 我有一个redis conf文件 我需要像这样设置这个路径 redis conf pidfile MY HOME local var pids redis pid
  • 将文件传递给活动作业/后台作业

    我通过标准文件输入接收请求参数中的文件 def create file params file upload Upload create file file filename img png end 但是 对于大型上传 我想在后台作业中执行
  • Redis 在键过期时更新排序集

    我有一个 Redis 服务器 其中包含一组键值对和一个排序集 提供这些键值对的键的索引 键值对可以进入 已完成 状态 此时需要在 1 小时后删除它们 这可以通过在键上设置到期时间来简单地实现 但从排序集中清除它们似乎更成问题 我可以有一个过
  • 批量将Dictionary中的数据设置到Redis中

    我正在使用 StackExchange Redis DB 插入键值对字典Batch如下 private static StackExchange Redis IDatabase database public void SetAll
  • Redis 是否使用用户名进行身份验证?

    我已经在我的环境中设置了Redis 并且只看到了通过密码授权的部分 有没有办法也设置用户名 还是只能通过密码验证 Redis 6 上有 ACL 这些都有一个用户名 查看https redis io topics acl https redi
  • redis能完全取代mysql吗?

    简单的问题 我是否可以使用 redis 而不是 mysql 来处理各种 Web 应用程序 社交网络 地理位置服务等 IT 领域没有什么是不可能的 但有些事情可能会变得极其复杂 将键值存储用于全文搜索之类的事情可能会非常痛苦 另外 据我所知
  • JedisPoolConfig 不可分配给 GenericObjectPoolConfig

    我有一个基于 Spring 的 Java Web 应用程序托管在 Heroku 上 我正在尝试使用 Redis 实现来利用 Spring 缓存抽象 当服务器启动时 我收到一条错误消息 Type redis clients jedis Jed
  • Redis AOF fsync(始终)与 LSM 树

    我对日志结构化合并树 LSM 树 的理解是 它利用了附加到磁盘非常快 因为它不需要查找 这一事实 只需将更新附加到预写日志并返回到客户端即可 我的理解是 这仍然提供了立即的持久性 同时仍然非常快 我不认为 Redis 使用 LSM 树 它似
  • 具有匹配模式的 ioredis 密钥

    我想用键匹配模式 LOGIN 搜索 Redis 数据库 我在我的应用程序中使用 ioredis 昨天我搜索了整个网络 我得到了一些执行这项工作的选项 如下所示 KEYS 扫描流 Issue import Redis from ioredis
  • Redis 客户端忽略其上设置的配置选项并尝试连接到默认 IP 127.0.01

    在AWS中 我使用ElastiCache Redis服务器并使用节点作为后端和 promise redis 包 这就是我尝试连接到我的 redis 服务器端点的方法 client redis createClient host my red

随机推荐

  • Spring注解式注入依赖bean优先级

    使用注解的方式注入bean实例 在两年前的开发中 还经常看到 Resource注解 这个注解是基于JSR250标准的 现在基本很少看到使用了 取而代之的是 Autowired注解 也是官方推荐的 随着spring boot的出现 很多开发小
  • Windows7访问Samba,总是提示 未知的用户名或错误密码

    这个问题纠结了好几天 在网上也查了好些资料都没有解决 现在终于解决了 必须要分享出来 环境配置 PC1 Linux Mint 19 2 在此电脑上配置Samba服务 我为了方便 是通过Mint的一个Samba插件配置的 PC2 Win7 6
  • 民安智库(北京第三方窗口测评)开展汽车消费者焦点小组座谈会调查

    民安智库近日开展了一场汽车消费者焦点小组座谈会 旨在深入了解目标消费者对汽车功能的需求和消费习惯 为汽车企业提供有针对性的解决方案 在焦点小组座谈会中 民安智库公司 第三方市容环境指数测评 邀请了一群具有代表性的汽车消费者作为参与者 他们来
  • 【计算机毕业设计】231论文投稿系统

    一 系统截图 需要演示视频可以私聊 本文介绍了论文投稿系统的开发全过程 通过分析企业对于论文投稿系统的需求 创建了一个计算机管理论文投稿系统的方案 文章介绍了论文投稿系统的系统分析部分 包括可行性分析等 系统设计部分主要介绍了系统功能设计和
  • 4-2 张量的数据运算

    张量数学运算主要有 标量运算 向量运算 矩阵运算 以及使用非常强大而灵活的爱因斯坦求和函数torch einsum 重难点 进行任意维的张量运算 此外还会介绍张量运算的广播机制 一 标量运算 操作的张量至少是0维 张量的数学运算符可以分为标
  • Java基础-继承

    子类继承父类后构造器的特点 子类中所有的构造器默认都会先访问父类中的无参的构造器 再执行自己 为什么 子类在初始化的时候 有可能会使用到父类中的数据 如果父类没有完成初始化 子类将无法使用父类的数据 子类初始化之前 一定要调用父类构造器先完
  • Topaz Video Enhance AI 2.3.0 for Mac专业级AI视频增强软件,详细图文安装教程。

    Topaz Video Enhance AI 2 3 0 for Mac是世界一流的AI视频质量增强软件 站长亲测有效 使用突破性的 AI 技术进行令人惊叹的视频放大 Topaz Video Enhance AI 接受了数千个视频的训练并结
  • IDEA常用插件介绍

    前言 插件名为笔者自用的IDEA2019 3 5所能搜索到的 若新版IDEA未能搜索到 可用括号内的插件名替代 一 Lombok 新版IDEA自带 Lombok能通过注解的方式 在编译时自动为属性生成构造器 getter setter eq
  • LeetCode-替换空格

    创建一个新的string 一边遍历原字符串的每一个字符 一边往新的字符串中写入 遇到空格替换为 20即可 class Solution public string replaceSpaces string str string res fo
  • Map和Set知识点

    目录 1 Map的使用 1 1 Map常用方法 2 Set的使用 2 1 Set常见方法 3 二叉搜索树 BST 4 哈希表 4 1 哈希冲突 4 2 避免哈希冲突 4 2 1 哈希函数的设计 4 2 2 负载因子调节 4 3 解决哈希冲突
  • mysql无法执行二进制文件_kail系统64,mysql64,出现-bash: bin/mysqld: 无法执行二进制文...

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 Linux localhost 3 10 72 1 SMP PREEMPT Thu Jun 16 13 34 40 CST 2016 aarch64 Kali GNU Linux Rolling
  • Ubuntu16.04 安装 ipython详细步骤

    ipython是一个不错的交互工具 调试Python代码很方便 安装ipython sudo apt get install ipython3 sudo pip install ipython 安装Qt console 工具 sudo pi
  • 【基于python+flask的车流量分析预测可视化-哔哩哔哩】 https://b23.tv/2q6251I

    基于python flask的车流量分析预测可视化 哔哩哔哩 https b23 tv 2q6251I https b23 tv 2q6251I
  • C++和C 混合编译链接时报错CMake Error: Cannot determine link language for target

    CMake Error Cannot determine link language for target 解决办法 project demo LANGUAGES C CXX CMake Error Cannot determine lin
  • 关于2的补码

    from http www ruanyifeng com blog 2009 08 twos complement html 问一个基本的问题 负数在计算机中如何表示 举例来说 8在计算机中表示为二进制的1000 那么 8怎么表示呢 很容易
  • torch 1.13.0 对应的torchvision版本

    torch最新的stable版本是1 13 0 奈何官网也没有说对应的torchvision版本是啥 如果想要whl下载的话 就非常麻烦 结论 torch 1 13 0对应torchvision 0 14 0 推导过程如下 首先看官网的 p
  • layer_factory.hpp:81] Check failed: registry.count(type) == 1 (0 vs. 1) Unknown layer type: Python

    这个问题我查了很多博客 里面很多都相近 但是不能用 首先这个问题的意思是 python层这个名字无法识别 然后给出了可以是别的例子 而这个层在trainval和text的prototxt中都有 解决方法 在caffe文件夹下找到makefi
  • Python---人生重开模拟器(简版)

    专栏 python 个人主页 HaiFan 专栏简介 本专栏主要更新一些python的基础知识 也会实现一些小游戏和通讯录 学时管理系统之类的 有兴趣的朋友可以关注一下 人生重开模拟器 思维导图 前言 一 设置初始属性 1 游戏标题 2 属
  • 一个useState学会React的主要思想

    正经学徒 佛系记录 不搞事情 皮毛React开发者 一个useState有什么好学的 hook那么多 哪个不比useState难 自身React开发者 学的不是如何使用 而是为什么会这样 直接进入主题 对React文档案例进行分析 可以先给
  • redis7知识点总结

    文章目录 1 redis单线程为啥会这么快 2 redis数据类型和底层存储结构 2 1 string类型 2 1 1 SDS 2 2 hash类型 2 3 list类型 2 4 set类型 集合 2 5 zset类型 有序集合 2 6 z