Redis知识点总结

2023-05-16

一、什么是Redis

Redis是一个使用C语言编写的、基于内存的且可持久化的key-value数据库。
Redis有以下特点:
1、性能高。 Redis 读数据速度能达到 110000 次/s,写数据速度是 81000 次/s ;而MySQL的读数据速度为5k/s,写数据速度为3k/s。
2、数据结构丰富。Redis支持string、 list,set,zset,hash等数据结构的存储。
3、原子性。Redis的所有操作是支持原子性的,要么成功,要么失败。
4、持久化存储。Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候再次加载进行使用。在这里插入图片描述

二、Redis的五种常用数据结构

1、string

Redis使用C语言开发,但C没有提供字符串类型,只能使用指针或数组的形式表示,所以redis设计了一个简单的动态字符串SDS(Simple Dynamic String)作为底层实现。

定义一个SDS结构体,如下:
struct sdshdr{
int len; //buf中已经占有字符串的长度(表示字符串的实际长度)。
int free; //buf中未使用的字符串的长度。
char buf[]; //buf缓冲区。
};

Redis的SDS与C语言字符串的区别:
1、字符串长度计数方式不同。C语言对字符串长度的统计,采用从头遍历到末尾的方式,直到发现空字符,时间复杂度为O(n)。而SDS本身就保存字符串长度的信息,获取长度的时间复杂度是O(1)。
2、缓冲区溢出。C语言不记录字符串长度,在字符串拼接时,如果没有提前计算好内存,会造成内存溢出。而SDS存有free,在字符串拼接时,若长度够就直接执行,若不够就进行扩容,不会出现内存泄露。
3、修改字符串时内存重分配次数不同。C语言每次对字符串拼接都会重新分配内存,开销大;而SDS会分配多余的free空间,避免连续添加字符串带来的内存分配开销。
4、二进制安全性。C语言通过字符串结尾的空字符’\0’来判断字符串的长度,但图片、压缩文件等二进制数据,经常会穿插’\0’在字符串中间,就会长度识别错误。SDS保存了字符串的长度,不会出现这个问题。

应用场景:redis对于key-value的操作效率很高,可以直接用作计数器。

参考链接:Redis为什么快?。

2、list(列表)

字符串列表,按照插入顺序排序,可以在列表的头部和尾部添加元素。底层实现是一个双向链表,支持反向查找和遍历,但带来了额外的内存开销。删除效率高。

应用场景:如微博的关注列表、粉丝列表。

3、set(无序集合)

string类型的无序集合,不允许重复的元素,底层实现是哈希表,添加、删除、查找的时间复杂度均为O(1)。
set与list类似,都可以存储多个字符串,而set通过哈希表来保证存储的string是各不相同的。
应用场景:存储不能重复的元素,如:用户名不能重复。

4、zset(有序集合)

与set类似,也是string类型的集合,有序的且不允许重复的元素
底层实现:内部使用HashMap和跳跃表(SkipList)来保证数据的存储和有序,HashMap里放的是成员到score(优先级)的映射,而跳跃表里存放的是所有的成员,排序依据是HashMap里存的score,使用跳跃表的结构可以获得比较高的查找效率,并且在实现上比较简单。
应用场景:范围查找、排行榜等。

5、hash(哈希)

key对应的值是一个hashmap,每个hash中存储field及对应的value,其关系如下图所示:
在这里插入图片描述
hash的优点就是根据key+field直接操作其中一个value,而不用重复存储全部数据。
应用场景:存储部分变更的数据,如:用户数据等。

参考链接:
redis五种数据类型及其常见操作。
redis的五种数据结构原理分析。

三、Redis缓存穿透、缓存击穿、缓存雪崩

1、缓存穿透

key对应的数据源并不存在,每次针对此key的请求在缓存中获取不到,请求都会打数据源,这样的请求过多就会压垮数据库。

解决方案:采用布隆过滤器,将所有可能存在的数据哈希到一个足够大的bitmap中,一个一定不存在的数据就会被bitmap拦截掉,从而减小了对底层存储系统的查询压力。

2、缓存击穿

key对应的数据源存在,但在redis中过期,若有针对该key的大量请求并发过来,就会从后端DB加载数据并回设到缓存,从而造成数据库压力过大而崩溃。

解决方案:
①设置key永不过期。最安全可靠,但会一直占有内存且无法获取最新数据。
②加互斥锁。在读取数据为NULL的时候,将尝试获取锁,若成功就重新从数据库加载数据并回设缓存,若失败就睡眠一定时间(保证数据回设缓存已经完成)重新从缓存中获取数据。代码参考:缓存击穿解决代码。

3、缓存雪崩

当缓存服务器重启或大量缓存集中在某一个时间段失效,这样在失效的时候也会给数据库带来很大的压力。缓存雪崩是针对很多个key,而缓存击穿是针对某一个key来说的。

解决方案:
①将缓存过期时间设置为一个随机值,避免缓存在同一时间过期;
②使用双缓存策略,设置原始缓存和备用缓存,原缓存失效时,访问备用缓存,备用缓存的失效时间设置得长一些。直到原始缓存在后台更新完成后,才会返回新缓存。

四、Redis持久化存储

redis是内存数据库,一旦重启后所有数据都会丢失,因此,需要将redis中的数据做持久化存储到磁盘。redis的持久化存储有以下两种方式:

RDB(Redis Data Base):

按照一定的时间周期执行快照,将内存中的数据保存到硬盘中。RDB是redis默认的持久化方式。
在这里插入图片描述
RDB的优点:
①适合冷备份。RDB是按时间周期存储,可以快速恢复之前某个时间段的数据。
②性能最大化。在同步数据的时候fork一个子进程去持久化,主进程继续处理命令。
③RDB数据恢复时的速度比AOF更高。

缺点:
①数据安全性低。RDB是间隔一段时间做持久化,如果这段时间redis发生故障,会发生数据丢失。
②RDB在生成数据快照时,若文件很大,客户端会暂停几毫米甚至几秒,若此时正在进行秒杀操作,性能会受到影响。

AOF(Append Only File):

将redis执行的每次写命令记录到单独的日志文件中,当redis重启时会从持久化的日志文件中恢复数据。
在这里插入图片描述
AOF的优点:
①数据安全性高。AOF每进行一次命令操作就会异步将数据记录到AOF中一次,若数据丢失,也只会丢失这一次的数据。
②rewrite模式。如用flushall命令误操作清空了所有数据,在后台没开始重写AOF文件之前,可以拷贝AOF日志文件,并删除其中的flushall命令。

缺点:
①同样的数据,AOF文件比RDB文件更大,恢复速度更慢;

RDB与AOF混合持久化

若单独使用RDB,可能会丢失很多数据;若单独使用AOF,数据恢复没有RDB快。因此,Redis4.0之后提供了混合持久化方式,也就是:采用RDB快照以一定频率执行保存数据,而在两次快照之间,使用AOF日志记录这期间的所有命令操作。

两种持久化存储方式如何选择

①如果你的业务场景需要很高的性能,或者宕机之后能够尽快的恢复,而对数据完整性的要求不是那么高,那么可以采用RDB持久化的方式。
②如果你的业务场景对数据完整性的要求很高,那么可以采用AOF持久化方式,而至于采用哪种回写策略,则取决于你对数据完整性的要求程度。
③如果你的业务场景既要兼顾性能,又注重数据完整性,那么可以采用混合持久化的方式。
④如果你对数据丢失无所谓,追求性能最大化的情况下,甚至可以禁用持久化

此处参考:如何选择合适的持久化方式?。

五、过期key的删除策略

Redis是key-value型数据库,可以设置key的过期时间。在Redis中的过期策略有以下三种:
①定时删除: 每个设置过期时间的key都需要创建一个定时器,到过期时间就会立即清除。
优点:保证内存被尽快释放;
缺点:若过期key很多,会需要占用大量CPU资源去处理过期数据,从而影响读取缓存的响应时间。
②惰性删除: 只有当访问这个key的时候,才会判断key是否过期,过期就删除。
优点:节省CPU资源;
缺点:若出现大量过期的key没有被访问,会占用大量内存;
③定期删除: 每隔一段时间,扫描一定数量设置了过期时间的key,并清除其中过期的key。
定期删除的性能介于定时删除和惰性删除之间。在内存占用方面,定期删除不如定时删除好;在CPU占用方面,定期删除不如惰性删除好。

为啥不扫描全部设置了过期时间的key呢?
假如Redis里面所有的key都有过期时间,都扫描一遍?那太恐怖了,而且我们线上基本上也都是会设置一定的过期时间的。全扫描跟你去查数据库不带where条件不走索引全表扫描一样,100s一次,Redis累都累死了。

Redis采用的key过期策略:惰性删除+定期删除。

六、内存淘汰策略

redis内存数据集大小上升到一定大小的时候,导致用于缓存的内存不足,就会施行数据淘汰策略。惰性删除+定期删除可能会残留大量的过期key,从而导致内存数据太大。

全局的键空间选择性移除
noeviction:当内存不足以容纳新写入数据时,新写入操作会报错。
allkeys-lru:当内存不足以容纳新写入数据时,在键空间中,移除最近最少使用的key。(这个是最常用的)
allkeys-random:当内存不足以容纳新写入数据时,在键空间中,随机移除某个key。

设置过期时间的键空间选择性移除
volatile-lru:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,移除最近最少使用的key。
volatile-random:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,随机移除某个key。
volatile-ttl:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,有更早过期时间的key优先移除。

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

Redis知识点总结 的相关文章

  • ubuntu文件系统结构与磁盘管理

    一 根目录 xff1a Linux下 就是根目录 所有的目录都是由根目录衍生出来的 二 ubuntu 文件系统结构 xff1a 三 绝对路径和相对路径 xff1a 绝对路径 xff1a 从根目录 算起的路径 相对路径 xff1a 相对于目前
  • Framebuffer应用编程

    一 Framebuffer介绍 在Linux系统中通过Framebuffer xff08 帧缓冲 xff09 驱动程序来控制LCD Framebuffer就是一块内存 xff0c 里面保存着一帧图像 Framebuffer中保存着一帧图像的
  • Java编辑提示错误: 编码 GBK 的不可映射字符 (0x80)

    在DOS界面运行编译Java文件时提示错误 xff1a 编码 GBK 的不可映射字符 0x80 理解 xff1a java程序在编译的时候 xff0c 需要使用JDK开发工具包中的JAVAC EXE命令 xff0c 而JDK开发工具包是国际
  • makefile教程

    Makefile是一种用于构建软件项目的自动化工具 xff0c 通过定义一系列规则和依赖关系 xff0c 可以自动化构建 编译 测试和安装软件项目 在本篇教程中 xff0c 我将介绍如何编写一个简单的Makefile xff0c 并解释Ma
  • 原来制作数据可视化大屏这么简单,这三步就能完成

    不知道大家在对数据进行可视化处理的时候 xff0c 有没有碰到过以上问题 xff1f 身为一位经常需要整理数据 可视化处理的数据人 xff0c 我真的心有体会 随着越来越多的头部企业启动数据大屏展示公司的年度 战绩 xff0c 以数据大屏为
  • VirtualBox主机ping不通虚拟机

    问题 xff1a 虚拟机可以ping通主机 xff0c 主机无法ping通虚拟机 1 检查虚拟机是否配置好NAT网络连接 xff0c 从而能够ping通外网 2 配置主机ping虚拟机 xff0c 创建桥接网卡 3 检查虚拟机是否出现新建桥
  • MATLAB“在当前文件夹或MATLAB路径中未找到文件“的小“坑”

    更新 xff1a 似乎找到了官方依据 另外 xff0c 这个问题在MATLAB2020中似乎已经得到了修复 MATLAB文件夹的相关问题 新手使用matlab会遇到文件夹的问题 xff1a 第一 xff0c 新建一个脚本 xff0c Ctr
  • Ubuntu18.04下PX4+gazebo+QGC实现无人机在仿真环境下的房屋巡视

    前言 xff1a 老师给我布置了在仿真环境下模拟带摄像头的无人机在仿真环境下的巡视任务 xff0c 在完成任务的过程中 xff0c 遇到了很多问题 xff0c 查阅了许多博主的资料 xff0c 有些关键环节只是被一带而过 xff0c 导致安
  • 双系统下ubuntu18.04装拓展显示屏血泪史

    1 背景 xff1a 买了块新显示器 xff0c 想在ubuntu18 04下使用 xff0c 得装驱动 xff0c 刚开始按网上的一个教程 xff0c 直接把内核装坏了 xff0c 后来重装过系统才最终完成拓展屏的功能实现 xff0c 特
  • ROS工作空间、功能包创建,编译相关的C++/python程序详解

    有关工作空间的结构 xff1a WorkSpace 自定义的工作空间 build xff1a 编译空间 xff0c 用于存放CMake和catkin的缓存信息 配置信息和其他中间文件 devel xff1a 开发空间 xff0c 用于存放编
  • VScode配置ROS环境下Debug调试

    参考 xff1a VScode debug ROS cpp程序设置 断点调试 ABC Orange的博客 CSDN博客 poll failed with error interrupted system call Get Started w
  • C++速成(封装、继承和多态)

    前前言 xff1a 如果有时间 xff0c 搜一个完整的教程看 xff0c 用到啥学啥 xff0c 这样可能可以省更多的时间 61 61 前言 xff1a C 43 43 的命名规范 C 43 43 命名规范 ajioy的博客 CSDN博客
  • 神经网络与深度学习课程总结二

    深度学习平台介绍 1 1PyTorch是一个Python的深度学习库 它最初由Facebook人工智能研 究小组开发 xff0c 而优步的Pyro软件则用于概率编程 1 1 1PyTorch基本使用 基本概念 张量 xff08 Tensor
  • 神经网络与深度学习课程总结三

    一 数据集与评价指标 算法评估 xff1a P R曲线 mAP计算 二 目标检测与YOLO 目标检测问题 xff1a 目标检测是在给定的图片中精确找到物体所在位置 并标注出物体的类别 物体的尺寸变化范围很大 摆放物体的角度 姿态不定 而且可
  • 神经网络与深度学习课程总结四

    一 数据处理基础 1 1特征编码 xff1a 第1列表示年龄 xff0c 是一个数值特征 第2列表示性别 xff0c 是一个只有一位 xff08 0 xff0c 1 xff09 的特征 0 gt Male 1 gt Female 第3列表示
  • 高大上的数据可视化图表,只需6步就能完成

    一份高质量的数据可视化图表 xff0c 能够让你清晰 全面地传达出数据信息 xff0c 成为你工作 学习 竞赛的助推器 xff01 因此 xff0c 一款功能强大的可视化软件显得尤为重要 xff01 最近博主在用的百度 Sugar BI x
  • 从零开始的MySQL学习,完全备份、增量备份和备份恢复

    文章目录 一 数据备份的重要性二 数据库备份的分类从物理与逻辑的角度从数据库的备份策略角度 三 完全备份完全备份的优点完全备份的缺点 四 mysqldump备份库备份单个库备份多个库备份所有库备份表 五 备份恢复source命令恢复mysq
  • 【错误归纳】rsync远程同步:报错password file must not be other-accessible

    实验场景 xff1a rsync远程同步 故障现象 xff1a 做rsync远程同步时 xff0c 当时在发起端输入了以下命令 调用了免密方式同步文件 rsync span class token operator span az span
  • Linux就该这么学,GlusterFS分布式原理和架构

    文章目录 一 GlusterFS概述GlusterFS的简介GlusterFS的特点GlusterFS的相关用语模块化堆栈式架构 二 GlusterFS工作原理GlusterFS工作流程弹性hash算法 三 GlusterFS的卷类型分布式
  • 【错误归纳】创建GlusterFS卷:报错Mount failed. Please check the log file for more details

    实验场景 xff1a 创建GlusterFS复制卷 故障现象 xff1a 创建GlusterFS复制卷 客户端挂载时出错 root 64 client mount glusterfs node1 rep vol hyc rep vol Mo

随机推荐

  • 【归纳总结】MySQL5.6与5.7区别

    文章目录 一 编译安装区别下载软件带boost的mysql源码安装不带boost的mysql源码安装 二 初识化时的区别三 功能和特性的区别 一 编译安装区别 Mysql5 7版本更新后有很多变化 xff0c 比如json等 xff0c 连
  • 今天也来点Docker,端口映射与容器互联

    文章目录 一 端口映射1 1 概述1 2 随机端口1 3 映射指定端口 二 容器互联 一 端口映射 1 1 概述 在启动容器的时候 xff0c 如果不指定对应的参数 xff0c 在容器外部是无法通过网络来访问容器内部的网络应用和服务的 当容
  • 今天也来点Docker,Consul服务(自动发现的Docker架构)

    文章目录 一 Consul 理论概述1 1 简介1 2 使用场景1 3 优势1 4 consul 端口 二 基于Docker的Consul服务搭建2 1 部署环境2 2 部署Consul服务2 3 容器服务自动加入nginx集群2 4 验证
  • 【错误归纳】yum安装docker-ce报错

    实验场景 xff1a yum安装docker ce 故障现象 xff1a root 64 docker2 yum repos d yum config manager add repo https mirrors aliyun com do
  • 今天也来点Docker,Docker-TLS加密通讯

    这里写目录标题 一 TLS加密通讯的概述二 TLS加密通讯的部署2 1 搭建环境2 2 部署过程2 3 验证加密通讯 一 TLS加密通讯的概述 用TLS加密通讯原因 xff1a 为了防止链路劫持 会话劫持等问题导致 Docker 通信时被中
  • Nginx+Tomcat动静分离的部署

    文章目录 一 动静分离的原理二 动静分离的优势三 项目部署3 1 项目环境3 2 nginx 服务器部署3 3 Tomcat 服务器部署3 4 客户端验证服务器状态3 5 动静分离配置3 6 验证动态配置 一 动静分离的原理 服务端接收来自
  • 数据门户是什么?

    数据门户可以通过配置导航菜单 xff0c 自由组合报表 屏 数据填报 外部链接等资源 xff0c 形成 个可通过 定义地址统一访问的资源 数据门户可 便用户对多个关联 进 集中查看 其主要应 用场景为 制作主题性数据 网站或主题性报表 xf
  • 踏入OpenStack大门,Nova计算服务讲解

    文章目录 一 Nova计算服务概述1 1 Nova简介1 2 Nova系统架构1 3 Nova 部署 Cell 二 Nova组件详细介绍2 1 API xff08 通信接口 xff09 2 2 Scheduler xff08 调度器 xff
  • 踏入OpenStack大门,Nova项目部署

    文章目录 一 Nova组件部署环境二 控制节点Nova服务配置2 1 创建nova数据库 xff0c 并执行授权操作2 2 管理Nova用户及服务2 2 1 创建nova用户2 2 2 创建nova服务2 2 3 给Nova服务关联endp
  • 【错误归纳】nova-status upgrade check 检查下cell 发现未发现计算节点

    实验场景 xff1a 部署openstack xff0c 验证计算节点服务 故障现象 xff1a 查看计算节点列表正常 span class token punctuation span root 64 ct span class toke
  • 试用AI写作软件AI-WRITER.COM:重写(rewrite)功能测试简短报告

    试用AI WRITER COM xff1a 重写 rewrite 功能测试 试用网站连接https ai writer com 1 操作页面简介 xff1a 2 选定重写文案 xff1a 我直接使用官网后台定制关键词后 xff0c 自动推荐
  • 树莓派4B更新内核后,wlan0消失的问题解决方法

    更新升级Linux内核后 xff0c 树莓派4B的WIFI功能不可以使用了 此时运行ifconfig无法找到wlan0 解决方法 xff1a insmod lib modules x xx xx kernel net rfkill rfki
  • 树莓派4B更新内核后,wlan0消失的问题解决方法2

    上一篇文章介绍了通过insmod加载无线网卡驱动的方法找回wlan0 但是每次启动后都需要手动运行很不方便 下面介绍这个一劳永逸的方法 1 进入 lib modules lt kernel ver gt 目录 xff0c 运行sudo de
  • AT-AWP:Adversarial weight perturbation helps robust generalization

    本文提出一种简单而有效的对抗权重扰动 AWP 来明确规范化权重损失图的平滑度 xff0c 在对抗训练框架中形成双重扰动机制 输入扰动和权值扰动 大量实验表明 xff0c AWP确实使权重损失图更加平缓 xff0c 并且可以很容易地融入各种现
  • 过一遍|Promise面试题(会持续补充的)

    Promise一直是面试被问的重点 xff0c 根据各种面经记录Promise在面试中经常问道的问题 xff0c 同时会增加一些前瞻性和拓展性的问题 xff0c 适合我这种临时抱佛脚的人 前期储备 事件循环 xff08 event loop
  • 枚举的简单demo

    枚举 间接的表示一些固定的值 xff0c 关键字 enum Demo span class token keyword public span span class token keyword enum span GenderEnum sp
  • 基于C++的简单HTTP服务器实现

    基于C 43 43 的简单HTTP服务器实现 一个Web Server就是一个服务器软件 xff08 程序 xff09 xff0c 或者是运行这个服务器软件的硬件 xff08 计算机 xff09 其主要功能是通过HTTP协议与客户端 xff
  • 数据血缘是什么?数据血缘都解决哪些问题

    数据血缘 xff0c 即对Sugar BI中各资源涉及的数据流经路径进 跟踪 xff0c 类似于追踪数据的 缘关系 其可针对数据向下做影响分析或向上做溯源分析 xff0c 有助于 户管理资源和排查问题 具体为 xff1a 影响分析 xff1
  • 抢位|AI 时代下程序员的硬核技能

    ChatGPT 占领了几乎全部媒体的近日头条 xff0c 也引发了不少人思考 AI 时代下自己不可替代的工作价值 AI 时代程序员的硬核技能是什么 xff1f 如何拥有这一硬核技能 xff1f Tubi 研发副总裁陈天将在2023 4 16
  • Redis知识点总结

    一 什么是Redis Redis是一个使用C语言编写的 基于内存的且可持久化的key value数据库 Redis有以下特点 xff1a 1 性能高 Redis 读数据速度能达到 110000 次 s 写数据速度是 81000 次 s xf