Redis系列之基础知识

2023-11-12


一、Redis是什么?

是一个基于内存的高性能key-value数据库,可以用来作为数据库、缓存和消息队列。

Redis 与其他 key – value 缓存产品有以下三个特点:

  1. Redis支持数据的持久化,可以将内存中的数据保持在磁盘中,重启的时候可以再次加载进行使用。
  2. Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储。
  3. Redis 支持主从复制,即 master-slave 模式的数据备份。

Redis架构

Redis 主要由有两个程序组成:
Redis 客户端 redis-cli
Redis 服务器 redis-server
客户端、服务器可以位于同一台计算机或两台不同的计算机中。

二、为什么使用Redis

因为传统的关系型数据库如Mysql已经不能适用所有的场景了,比如秒杀的库存扣减,APP首页的访问流量高峰等等,都很容易把数据库打崩,所以引入了缓存中间件。

三、Redis支持的数据类型

五种基本数据类型:

数据类型 Name 实现方式
字符串 String 内部存储默认
列表 List 双向链表
哈希 Hash
集合 Set value永远为null的HashMap
有序集合 Sorted Set 使用HashMap和跳跃表(SkipList)来保证数据的存储和有序,HashMap里放的是成员到score的映射,而跳跃表里存放的是所有的成员

附:跳表本质上是加了索引的有序链表,可参考跳表相关介绍了解

四、Redis支持的特殊数据结构

数据类型 Name 应用场景
超级日志 HyperLogLog 用于做基数统计,HyperLogLog 只会根据输入元素来计算基数,而不会储存输入元素本身
地理信息 Geo 用于存储地理位置信息,并对存储的信息进行操作
订阅/发布 Pub/Sub 用于消息分发,实现消息队列的功能,但消息无法持久化,如果出现网络断开、Redis 宕机等,消息就会被丢弃。
信息流 Stream 5.0 版本新增。主要用于消息队列,提供了消息的持久化和主备复制功能,可以让任何客户端访问任何时刻的数据,并且能记住每一个客户端的访问位置,还能保证消息不丢失。

五、Redis持久化

redis 提供了两种持久化的方式,分别是RDBAOF

RDB:Redis DataBase

将 redis 某一时刻的数据持久化到磁盘中,是一种快照式的持久化方法。
redis 在进行数据持久化的过程中,会先将数据写入到一个临时文件中,待持久化过程都结束了,才会用这个临时文件替换上次持久化好的文件。正是这种特性,让我们可以随时来进行备份,因为快照文件总是完整可用的。
对于 RDB 方式,redis 会单独创建(fork)一个子进程来进行持久化,而主进程是不会进行任何 IO 操作的,这样就确保了 redis 极高的性能。

AOF:Append Only File

将 redis 执行过的所有写指令记录下来,在下次 redis 重新启动时,只要把这些写指令从前到后再重复执行一遍,就可以实现数据恢复了。
默认的 AOF 持久化策略是每秒钟 fsync 一次(fsync 是指把缓存中的写指令记录到磁盘中),因为在这种情况下,redis 仍然可以保持很好的处理性能,即使 redis 故障,也只会丢失最近 1 秒钟的数据。
如果在追加日志时,恰好遇到磁盘空间满、inode 满或断电等情况导致日志写入不完整,也没有关系,redis 提供了 redis-check-aof 工具,可以用来进行日志修复。
因为采用了追加方式,如果不做任何处理的话,AOF 文件会变得越来越大,为此,redis 提供了 AOF 文件重写(rewrite)机制,即当 AOF 文件的大小超过所设定的阈值时,redis 就会启动 AOF 文件的内容压缩,只保留可以恢复数据的最小指令集。举个例子或许更形象,假如我们调用了 100 次 INCR 指令,在 AOF 文件中就要存储 100 条指令,但这明显是很低效的,完全可以把这 100 条指令合并成一条 SET 指令,这就是重写机制的原理。
在进行 AOF 重写时,仍然是采用先写临时文件,全部完成后再替换的流程,所以断电、磁盘满等问题都不会影响 AOF 文件的可用性,

AOF重写原理

在重写即将开始之际,redis 会创建(fork)一个“重写子进程”,这个子进程会首先读取现有的 AOF 文件,并将其包含的指令进行分析压缩并写入到一个临时文件中。
与此同时,主工作进程会将新接收到的写指令一边累积到内存缓冲区中,一边继续写入到原有的 AOF 文件中,这样做是保证原有的 AOF 文件的可用性,避免在重写过程中出现意外。
当“重写子进程”完成重写工作后,它会给父进程发一个信号,父进程收到信号后就会将内存中缓存的写指令追加到新 AOF 文件中。
当追加结束后,redis 就会用新 AOF 文件来代替旧 AOF 文件,之后再有新的写指令,就都会追加到新的 AOF 文件中了。

RDB和AOF比较

RDB适用场景:需要进行大规模数据的恢复,且对于数据恢复的完整性不是非常敏感
AOF适用场景:对于数据恢复的完整性要求高

缺点 Value
RDB 需要定时持久化,风险是可能会丢两次持久之间的数据,量可能很大。
AOF AOF每秒fsync一次指令硬盘,如果硬盘IO慢,会阻塞父进程;风险是会丢失1秒多的数据;在Rewrite过程中,主进程把指令存到mem-buffer中,最后写盘时会阻塞主进程。

RDB 和 AOF 两种方式也可以同时使用,在这种情况下,如果 redis 重启的话,则会优先采用 AOF 方式来进行数据恢复,这是因为 AOF 方式的数据恢复完整度更高。

如果你没有数据持久化的需求,也完全可以关闭 RDB 和 AOF 方式,这样的话,redis 将变成一个纯内存数据库,就像 memcache 一样。


参考文档

redis简述
redis中文教程

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

Redis系列之基础知识 的相关文章

  • 是否可以在 Spring Batch 中结合分区和并行步骤?

    我只是想知道它在 Spring Batch 中可行吗 Step1Step2 流程 gt 流程1 流程2 流程3 Step3 其中每个flow1 gt 划分为 5 个 GridSizeflow2 gt 划分为 5 个 GridSizeflow
  • Spring控制器是线程安全的吗

    我遇到了这个控制器示例 想知道它是否是线程安全的 我特别想知道 gson 实例变量 import org springframework stereotype Controller import org springframework we
  • 如何在 Eclipse 中用阿拉伯语读写

    我在 eclipse 中编写了这段代码来获取一些阿拉伯语单词 然后打印它们 public class getString public static void main String args throws Exception PrintS
  • 无法加载 jar 文件的主类

    我使用 Eclipse IDE 开发了一个应用程序 创建应用程序后 我以 jar 格式导出项目 当我尝试运行此 jar 文件时 出现错误 无法加载主类 请帮忙 当您将项目导出为 jar 时 请参阅此所以问题 https stackoverf
  • 通过 InjectMocks Spy 注入对象

    我需要对一个类运行一系列单元测试 该类具有 Autowired Logger 实现 实现的基本思想是 Mock Logger logger InjectMocks TestedClass tested 但我想保存日志输出功能 Mockito
  • 如何解决 onEditCommit 事件上的类型不匹配错误?

    我在 Fxml 中使用 onEditCommit 事件在用户编辑数据后检索数据 FXML 代码
  • Google Inbox 类似 RecyclerView 项目打开动画

    目前 我正在尝试实现 Google Inbox 例如RecyclerView行为 我对电子邮件打开动画很好奇 我的问题是 该怎么做 我的意思是 他们使用了哪种方法 他们用过吗ItemAnimator dispatchChangeStarti
  • Android - 除了普通 SSL 证书之外还验证自签名证书

    我有一个通过 SSL 调用 Web 服务的 Android 应用程序 在生产中 我们将拥有由受信任的 CA 签名的普通 SSL 证书 但是 我们需要能够支持自签名证书 由我们自己的 CA 签名 我已经成功实施了接受自签名证书的建议解决方案
  • 想要开发像 Facebook 这样的网站 - 处理数百万个请求 - 高性能 [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我想用 Java 开发一个像 Fac
  • @EnableTransactionManagement 的范围是什么?

    我试图了解正确的放置位置 EnableTransactionManagement多个 JavaConfig 上下文的情况下的注释 考虑以下场景 我在 JPAConfig java 和 AppConfig java 中有 JPA 配置以及一组
  • 具有多种值类型的 Java 枚举

    基本上我所做的是为国家编写一个枚举 我希望不仅能够像国家一样访问它们 而且还能够访问它们的缩写以及它们是否是原始殖民地 public enum States MASSACHUSETTS Massachusetts MA true MICHI
  • 打印包含 JBIG2 图像的 PDF

    请推荐一些库 帮助我打印包含 JBIG2 编码图像的 PDF 文件 PDFRenderer PDFBox别帮我 这些库可以打印简单的 PDF 但不能打印包含 JBIG2 图像的 PDF PDFRenderer尝试修复它 根据 PDFRedn
  • 覆盖 MATLAB 默认静态 javaclasspath 的最佳方法

    MATLAB 配置为在搜索用户可修改的动态路径之前搜索其静态 java 类路径 不幸的是 静态路径包含相当多非常旧的公共库 因此如果您尝试使用新版本 您可能最终会加载错误的实现并出现错误 例如 静态路径包含 google collectio
  • 在 AKKA 中,对主管调用 shutdown 是否会停止其监督的所有参与者?

    假设我有一位主管连接了 2 位演员 当我的应用程序关闭时 我想优雅地关闭这些参与者 调用supervisor shutdown 是否会停止所有参与者 还是我仍然需要手动停止我的参与者 gracias 阻止主管 https github co
  • 来自客户端的超时 Web 服务调用

    我正在使用 RestEasy 客户端调用网络服务 一项要求是 如果调用运行时间超过 5 秒 则中止 超时调用 我如何使用 RestEasy 客户端实现这一目标 我只看到服务器端超时 即如果在一定时间内未完成请求 Rest Easy 网络服务
  • struts 教程或示例

    我正在尝试在 Struts 中制作一个登录页面 这个想法是验证用户是否存在等 然后如果有错误 则返回到登录页面 错误显示为红色 典型的登录或任何表单页面验证 我想知道是否有人知道 Struts 中的错误管理教程 我正在专门寻找有关的教程 或
  • Java 编码风格、局部变量与重复方法调用

    我更喜欢使用局部变量而不是多次调用同一方法 I prefer this Vehicle vehicle person getVehicle if vehicle instanceof Car Car car Car vehicle car
  • Java中获取集合的幂集

    的幂集为 1 2 3 is 2 3 2 3 1 2 1 3 1 2 3 1 假设我有一个Set在爪哇中 Set
  • 使用 eclipse IDE 配置 angularjs

    我想开始使用 AngularJs 和 Java Spring 进行开发 我使用 Eclipse 作为 IDE 我想配置我的 Eclipse 以使这些框架无缝工作 我知道我可能要求太多 但相信我 我已经做了很多研究 你们是我最后的选择 任何帮
  • 尝试使用带有有效购买令牌的 Java Google Play Developer API v3 检索应用内购买信息时出现错误请求(无效值)

    当使用 Java Google Play Developer API 版本 3 并请求有效购买令牌的购买信息时 我收到以下异常 API 调用返回 400 Bad Request 响应以及以下消息 code 400 errors domain

随机推荐

  • Ubuntu 16.04安装libuvc

    安装依赖 sudo apt get intall libjpeg dev libusb 1 0 0 dev sudo ldconfig 安装libuvc git clone https github com ktossell libuvc
  • 搜索引擎技术简介

    搜索引擎技术简介 1 系统结构 抓取网页建立索引库在索引库中搜索结果排序主要的数据结构 倒排索引 inverted indexing list 这种数据结构广泛地应用在今天包括Web搜索引擎在内的各种信息检索系统中 其典型的总体结构 如下图
  • 基于MMX指令集的程序设计简介

    基于MMX指令集的程序设计简介 作者 Alex Farber出处 http www codeproject com cpp mmxintro asp MMX技术简介 Intel 公司的MMX 多媒体增强指令集 技术可以大大提高应用程序对二维
  • SpringBoot+Vue全栈开发(图书商城项目回顾)

    参考资料 1天搞定SpringBoot Vue全栈开发 后端 开发框架 SpringBoot Mybatis 开发工具 IDEA Navicat 所有文件 src main java booksystem pom xml Project O
  • Vue项目中怎么配置在src文件下@别名

    方法一 在实际项目中 我们通常可以将src目录设置为 目录 这样引入文件时候可以一目了然而且使用起来非常方便 可以提高我们的开发效率 代表的是src文件夹 这样将来文件过多 找的时候也方便 而且也还有提示 本文介绍如何在实际项目中使用 作为
  • Linux——HTTP协议

    超文本传输协议 HTTP HyperText Transfer Protocol 互联网上应用最为广泛的一种网络协议 所有的WWW文件都必须遵守这个标准 设计HTTP最初的目的是为了提供一种发布和接收HTML页面的方法 之所以叫做超文本 是
  • Golang 几个不错的实用函数库

    文章目录 samber lo thoas go funk duke git lancet elliotchance pie gookit goutil dablelv cyan 大咖好呀 我是恋喵大鲤鱼 Golang 标准库是 Go 语言自
  • pointer-like classes 开放智能指针

    template
  • darktrace 亮点是使用的无监督学习

    https blog csdn net weixin 34337265 article details 86020998 转载于 https www cnblogs com diyunpeng p 11611392 html
  • Numpy计算分母为n-1的修正方差(贝塞尔校正)

    对于一个序列值 import numpy as np arr value np array 1 2 3 通常方法 一般的计算方法计算的方差 0 666666666 计算公式如下 s 2 1
  • 【牛客网华为机试】HJ32 密码截取

    题目 描述 Catcher是MCA国的情报员 他工作时发现敌国会用一些对称的密码进行通信 比如像这些ABBA ABA A 123321 但是他们有时会在开始或结束时加入一些无关的字符以防止别国破解 比如进行下列变化 ABBA gt 12AB
  • css怎样去除表格内边距,CSS语言border-spacing表格边距控制

    在前面我看讲过表格的边框分离与合并 现在就给大家讲下表格分离后如何用CSS语言中的border spacing属性控制表格间的宽度 语法 border spacing px px 说明 border spacing第一个是水平间隔 第二个是
  • C++内存布局和内存分配

    看了很多 收集若干篇 内存布局1 内存布局2 内存分配 内存布局图解析 mmap内存映射 brk内存分配原理 拓展 从内核文件系统看文件的读写过程 栈溢出 一般都是临时变量给的太大超过8MB
  • 初识c语言(上)

    目录 前言 什么是C语言 第一个C语言代码 通用类型 如何定义变量与常量 结束 前言 本篇只对C语言做基础的介绍 对C语言基础有个大概的了解 一 什么是c语言 C语言是门语言 就像人与人之间交流用汉语 英语 法语等等 而C语言是实现人机交流
  • PHP发送邮件(PHPMailer)

    作为PHP入门开发者 常常有这种述求 自己的网站中需要添加一个使用自己的域名作为发件人邮件地址的自动发送邮件的方法 用于诸如给用户发送验证码 通知信息等 比如 我的某个用户注册模块 需要使用register jjonline cn作为邮件发
  • 你真的了解 Synchronized 吗?

    前言 Synchronized想必大家在工作中一定有接触过 它算是Java并发场景下实现多线程安全一种比较直接的操作 有人会说它慢 确实 在JDK1 6之前 它有另一个名称叫做 重量级锁 但是从1 6版本起 它就在不断被优化 现如今已经是很
  • /usr/bin/ld: libx264.a(dct-a.o): relocation R_X86_64_32 against `.rodata‘ can not be used when makin

    最近在编译x264的时候出现了错误 usr bin ld libx264 a dct a o relocation R X86 64 32 against rodata can not be used when making a PIE o
  • package.json详解

    在package json中配置环境变量 scripts dev cross env NODE ENV development platform h5 webpack mode development config webpack conf
  • 【华为诺亚方舟实验室】2022届毕业生招聘--决策(强化学习)推理方向

    深度强化学习实验室 官网 http www neurondance com 论坛 http deeprl neurondance com 来源 华为诺亚方舟实验室官微 诺亚方舟实验室 Noah s Ark Lab 是华为公司从事人工智能基础
  • Redis系列之基础知识

    文章目录 一 Redis是什么 Redis架构 二 为什么使用Redis 三 Redis支持的数据类型 四 Redis支持的特殊数据结构 五 Redis持久化 RDB Redis DataBase AOF Append Only File