首页 > 数据库 >Redis组件介绍(三)

Redis组件介绍(三)

时间:2024-08-30 20:38:35浏览次数:10  
标签:返回 AOF 快照 Redis 介绍 说明 key 组件

写在前面

今天来继续学习 Redis。

Redis 持久化机制

快照 (Snapshot)

特点

快照持久化可以将某一时刻的所有数据写入硬盘,默认开启,保存为 .rdb 文件,也称为 RDB 持久化。

快照生成方式

客户端方式

  1. BGSAVE

    • 使用 BGSAVE 命令创建快照,Redis 会创建一个子进程进行写入,父进程继续处理命令请求。
    • 名词解释: fork 是创建子进程的操作,初期父子进程共享内存,直到写操作发生才会分开。
  2. SAVE

    • 使用 SAVE 命令创建快照,Redis 在快照创建期间会阻塞,不响应其他命令。
    • 注意: SAVE 命令会使 Redis 处于阻塞状态。

服务器配置自动触发

  1. 满足配置自动触发

    • redis.conf 中设置 save 配置选项,Redis 会在满足条件时自动触发 BGSAVE。
    • 设置多个 save 选项时,任意条件满足均会触发 BGSAVE。
  2. 接收客户端 shutdown 指令

    • 执行 shutdown 指令时,Redis 会执行 SAVE 命令,然后关闭服务器。

配置生成快照名称和位置

  1. 修改生成快照名称

    • dbfilename dump.rdb
  2. 修改生成位置

    • dir ./

问题

快照可能导致数据丢失,尤其是在快照后有写操作而断电的情况下。

AOF 只追加日志文件

特点

将所有写命令记录到日志文件中,通过执行日志文件中的命令来恢复数据。

开启 AOF 持久化

redis.conf 中开启:

  • appendonly yes
  • appendfilename "appendonly.aof"

日志追加频率

  1. always 【谨慎使用】

    • 每个写命令都同步写入硬盘,降低 Redis 性能,SSD 用户应慎用。
  2. everysec 【推荐默认】

    • 每秒同步一次 AOF 文件,性能与无持久化时接近,最多丢失一秒数据。
  3. no 【不推荐】

    • 由操作系统决定同步时间,不会影响 Redis 性能,但可能丢失不定数量的数据。

修改同步频率

  • 修改 appendfsynceverysecalwaysno

AOF 文件的重写

AOF 文件会变大,Redis 提供 AOF 重写机制来压缩文件。

触发重写方式

  1. 客户端方式触发

    • 执行 BGREWRITEAOF 命令,不会阻塞 Redis 服务。
  2. 服务器配置自动触发

    • 配置 auto-aof-rewrite-percentageauto-aof-rewrite-min-size 选项。

重写原理

7.0.0之前

从 Redis 7.0.0 开始,使用多部分 AOF 机制,将 AOF 文件拆分为基础文件和增量文件,通过清单文件跟踪。

重写流程

  1. Redis 调用 fork,子进程重写 AOF 文件。
  2. 父进程继续处理客户端请求,将写命令缓存。
  3. 子进程完成重写后,父进程将缓存的写命令写入新文件。
  4. 用新文件替换旧文件。

总结

可以同时使用 AOF 和快照持久化,也可以单独使用,具体选择取决于数据和应用的需求。持久化文件应定期备份。

常见问题

  1. Redis 中持久化方案有几种?

    • 两种方案:RDB 快照持久化和 AOF 文件持久化。
  2. 如何触发 RDB 持久化?几种方式?有什么区别?

    • BGSAVE: 创建子进程进行快照。
    • SAVE: 阻塞当前 Redis 实例,创建快照。
    • shutdown: 服务器关闭时自动执行 SAVE。
    • ctrl+c 或 kill -9: 直接停止进程,触发 SAVE。
  3. AOF 持久化与 RDB 持久化的优缺点?

    • RDB: 启动快,可能丢失数据。
    • AOF: 数据持久性好,启动时性能差,文件变大。推荐结合使用。
  4. Redis 7.0 之前和之后的重写机制?

    • 之前: 父进程将操作放到内存,子进程生成新 AOF 文件。
    • 之后: 使用多部分 AOF 文件,父进程写入新文件,子进程生成基础 AOF 文件和增量文件,原子替换。
  5. 如何不让启动界面占用窗口?

    • redis.conf 中设置 daemonizeyes

位图 (Bitmap)

介绍

位图不是一种真正的数据类型,而是定义在字符串类型中的。一个字符串最多可以存储 512MB 的内容。

  • 位上限: 2^(9(512) + 10(1024) + 10(1024) + 3(8b=1B)) = 2^32b

位操作命令

  1. SETBIT

    • 说明: 设置某一位上的值。
    • 语法: SETBIT key offset valueoffset 为位偏移量,从 0 开始)
  2. GETBIT

    • 说明: 获取某一位上的值。
    • 语法: GETBIT key offset
  3. BITPOS

    • 说明: 返回指定值 (0 或 1) 在指定区间上首次出现的下标。
    • 语法: BITPOS key bit [start] [end]
    • 查找范围:
      • 不指定范围:BITPOS key bit
      • 指定开始位置:BITPOS key bit start
      • 指定开始和结束位置:BITPOS key bit start end
  4. BITOP

    • 说明: 对一个或多个保存二进制位的字符串进行位操作,并将结果保存到 destkey
    • 操作类型:
      • AND: BITOP AND destkey key [key ...]

      • OR: BITOP OR destkey key [key ...]

      • XOR: BITOP XOR destkey key [key ...]

      • NOT: BITOP NOT destkey key

  5. BITCOUNT

    • 说明: 统计指定区间内值为 1 的个数。
    • 语法: BITCOUNT key [start] [end]
    • 区间:
      • 正方向:BITCOUNT key start end(从左向右)
      • 负方向:BITCOUNT key start end(从右向左)

位图应用场景

  1. 网站用户签到的天数统计

    • 用户 ID 为 key,天作为 offset,签到置为 1。
    • 例如,第 366 天签到,数据存储为 000000000000000
  2. 按天统计网站活跃用户

    • 天作为 key,用户 ID 为 offset,活跃用户置为 1。
    • 统计活跃用户数量:例如,50000000 用户分布在 366 天的数据大约为 2GB。
  3. 用户在线状态和人数统计

    • 使用位图记录用户在线状态,可以有效统计当前在线人数和活动情况。

Java 操作 Redis

引入依赖

pom.xml 文件中添加 Jedis 连接依赖:

<dependency>
  <groupId>redis.clients</groupId>
  <artifactId>jedis</artifactId>
  <version>4.3.2</version>
</dependency>

创建 Jedis 对象

public static void main(String[] args) {
    // 1. 创建 Jedis 对象
    Jedis jedis = new Jedis("192.168.xxx.xxx", 7000);
    
    // 2. 选择操作的数据库,默认为 0 号库
    jedis.select(0);
    
    // 3. 执行相关操作
    // ...
    
    // 4. 释放资源
    jedis.close();
}

操作 Key 相关 API

  1. DEL

    • 说明: 删除指定的 key。
    • 返回值: 被删除 key 的数量。
  2. EXISTS

    • 说明: 检查 key 是否存在。
    • 返回值: 存在返回 1,不存在返回 0。
  3. EXPIRE

    • 说明: 为已经存在的 key 设置过期时间。
    • 返回值: 设置成功返回 1,失败返回 0。
    • 扩展:
      • PEXPIRE: 毫秒级别。
      • PEXPIREAT: 指定时间戳。
  4. KEYS

    • 说明: 返回符合模式的 key 列表。
    • 返回值: 符合模式的 key 列表。
  5. MOVE

    • 说明: 将 key 移动到另一个数据库。
    • 返回值: 移动成功返回 1,失败返回 0。
  6. TTL

    • 说明: 获取 key 的剩余生存时间。
    • 返回值:
      • 当 key 不存在时返回 -2。
      • 当 key 存在但没有设置剩余生存时间时返回 -1。
      • 否则,返回剩余生存时间(秒)。
  7. PTTL

    • 说明: 获取 key 的剩余生存时间(毫秒级)。
  8. RANDOMKEY

    • 说明: 返回一个随机的 key。
    • 返回值: 数据库不为空时返回一个 key,空时返回 null
  9. RENAME

    • 说明: 重命名 key。
    • 返回值: 成功返回 OK,失败返回错误信息。
  10. TYPE

    • 说明: 获取 key 的数据类型。
    • 返回值: none (key 不存在)、stringlistsetzsethash

操作 String 相关 API

  1. SET

    • 说明: 设置 key 的值。
  2. GET

    • 说明: 获取 key 的值。
  3. MSET

    • 说明: 批量设置多个 key 的值。
  4. MGET

    • 说明: 批量获取多个 key 的值。
    • 返回值: 字符串列表。
  5. GETSET

    • 说明: 获取 key 的值并设置新值。
    • 示例: GETSET age 24 返回原值,设置新值为 24。
  6. STRLEN

    • 说明: 获取 key 对应字符串的长度。
  7. APPEND

    • 说明: 追加字符串到 key 的值末尾。
    • 返回值: 修改后的长度。
  8. GETRANGE

    • 说明: 获取 key 对应字符串的子串。
    • 示例: GETRANGE key 0 4 返回子串。
  9. SETEX

    • 说明: 设置 key 的值并设置过期时间(秒)。
    • 示例: 10 秒后自动销毁。
  10. PSETEX

    • 说明: 设置 key 的值并设置过期时间(毫秒)。
  11. SETNX

    • 说明: 仅当 key 不存在时设置 key 的值。
    • 返回值: 已存在返回 0,不存在返回 1。
  12. MSETNX

    • 说明: 批量设置多个 key 的值,仅当所有 key 都不存在时成功。
    • 返回值: 仅当所有 key 都不存在时成功。
  13. DECR

    • 说明: 将 key 对应的值减 1。
    • 示例: DECR key 返回减少后的值。
  14. DECRBY

    • 说明: 将 key 对应的值减指定的值。
    • 示例: DECRBY key 2 返回减少后的值。
  15. INCR

    • 说明: 将 key 对应的值加 1。
    • 示例: INCR key 返回增加后的值。
  16. INCRBY

    • 说明: 将 key 对应的值加指定的值。
    • 示例: INCRBY key 2 返回增加后的值。
  17. INCRBYFLOAT

    • 说明: 将 key 对应的值按浮点数增加。
    • 示例: INCRBYFLOAT key 2.5 返回增加后的值。

标签:返回,AOF,快照,Redis,介绍,说明,key,组件
From: https://www.cnblogs.com/cjybigdatablog/p/18389449

相关文章

  • redis概述安装与基本数据类型
    Redis概述安装与基本数据类型1.什么是NoSQLNoSQL(NotOnlySQL),意即不仅仅是SQL,泛指非关系型的数据库。Nosql这个技术门类,早期就有人提出,发展至2009年趋势越发高涨。2.NoSQL的广泛应用随着大数据的兴起,数据量的暴增,数据类型的丰富,传统的关系数据库在应付动态网站,特别......
  • antd vue switch组件怎么把值true、false改为uint32类型的1和0
    背景已知switch组件的checked属性默认是传入true和false的,但是有这样的业务情景,既需要使用的是开关,又需要传入的是整数,那么我们应该如何修改呢?解决方案<a-form-itemlabel="允许失败时保存"><a-switch:checked="switchValue===1"@change="handleSwitchChan......
  • 自我介绍+软工五问
    这个作业属于哪个课程班级链接这个作业要求在哪里作业要求这个作业的目标学习Github和Markdown的初级使用一、自我介绍姓名:潘思言专业:计算机科学与技术邮箱:[email protected]爱好:看闲书、打游戏、睡大觉、存meme、转发陪跑抽奖......
  • 自我介绍+软工5问
    这个作业属于哪个课程计科22级12班这个作业要求在哪里(https://edu.cnblogs.com/campus/gdgy/CSGrade22-12/homework/1321)这个作业的目标使用Markdown排版进行随笔的编写。在GitHub新建一个与自己GitHubID一致的仓库,在仓库根目录的README下写下自己的介绍......
  • 视频云流化过程、好处以及云流化PaaS平台介绍
    一、什么是视频云流化?视频云流化(VideoCloudTranscoding)是一种将视频文件转换为适用于流媒体传输的不同格式和码率的过程。它是云计算和流媒体技术的结合,通过利用云平台的计算和存储资源,将视频内容转码为适应不同网络环境和终端设备的流媒体格式。二、视频云流化的过程通常包......
  • python操作redis的数据类型(超详细!!)
    在Web应用发展的初期,那时关系型数据库受到了较为广泛的关注和应用,原因是因为那时候Web站点基本上访问和并发不高、交互也较少。而在后来,随着访问量的提升,使用关系型数据库的Web站点多多少少都开始在性能上出现了一些瓶颈,而瓶颈的源头一般是在磁盘的I/O上。而随着互联网技术的......
  • Linux驱动(一):环境搭建及介绍
    目录前言一、硬件配置及SDK包1.硬件核心芯片2.瑞芯微原厂SDK包二、环境镜像文件的获取1.镜像文件的组成及启动流程2.获取环境所需的镜像文件2.1uboot.img2.2boot.img2.3rootfs.img2.4整体编译三、镜像文件烧录前言  自用自用自用,晚上睡觉前复盘用。当然,也......
  • 自我介绍+软工5问
    这个作业属于哪个课程软件工程这个作业要求在哪里自我介绍+软工5问这个作业的目标学会markdown语法,学习使用git和github,以及使用博客自我介绍基本信息姓名:陈国金性别:男班级:计算机科学与技术1班爱好:围棋、羽毛球、游泳软工5问1.软件开发有哪些模式,以及这......
  • Yolov5入门介绍(官网文档学习笔记)
    一、yolov5是什么yolov5是yolo的第五次迭代,旨在提供高速、高精度的目标检测模型官方文档:ComprehensiveGuidetoUltralyticsYOLOv5-UltralyticsYOLODocs二、yolov5的优点1、高速、高精度 (例如R-CNN目标检测有两部:先生成候选框再分类)2、基于pytorch搭建,使用于各......
  • redis-热key大key
    BIGKEY作者:w08eBigkey,hotkey傻傻分不清楚什么是大keyRedis中的"大Key"通常指的是一个占用较大内存空间的键(Key)。这可能会对Redis的性能产生负面影响,因为大Key可能导致内存碎片化、删除延迟以及网络传输时间延长等问题。大Key可能出现在不同的场景中,例如:......