Redis组件介绍(三)

打印 上一主题 下一主题

主题 1318|帖子 1318|积分 3954

写在前面

本日来继续学习 Redis。
Redis 持久化机制

快照 (Snapshot)

特点

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

快照天生方式

客户端方式


  • BGSAVE

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


  • SAVE

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


服务器配置自动触发


  • 满足配置自动触发

    • 在 redis.conf 中设置 save 配置选项,Redis 会在满足条件时自动触发 BGSAVE。
    • 设置多个 save 选项时,任意条件满足均会触发 BGSAVE。


  • 接收客户端 shutdown 指令

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

配置天生快照名称和位置


  • 修改天生快照名称

    • dbfilename dump.rdb

  • 修改天生位置

    • dir ./


题目

快照可能导致数据丢失,尤其是在快照后有写操作而断电的环境下。
AOF 只追加日记文件

特点

将所有写下令记载到日记文件中,通过实行日记文件中的下令来恢复数据。

开启 AOF 持久化

在 redis.conf 中开启:

  • appendonly yes
  • appendfilename "appendonly.aof"

日记追加频率


  • always 【审慎利用】

    • 每个写下令都同步写入硬盘,低落 Redis 性能,SSD 用户应慎用。

  • everysec 【推荐默认】

    • 每秒同步一次 AOF 文件,性能与无持久化时接近,最多丢失一秒数据。

  • no 【不推荐】

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

修改同步频率


  • 修改 appendfsync 为 everysec、always 或 no。

AOF 文件的重写

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


  • 客户端方式触发

    • 实行 BGREWRITEAOF 下令,不会阻塞 Redis 服务。

  • 服务器配置自动触发

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


重写原理

7.0.0之前

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

重写流程


  • Redis 调用 fork,子进程重写 AOF 文件。
  • 父进程继续处理惩罚客户端请求,将写下令缓存。
  • 子进程完成重写后,父进程将缓存的写下令写入新文件。
  • 用新文件替换旧文件。
总结

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


  • Redis 中持久化方案有几种?

    • 两种方案:RDB 快照持久化和 AOF 文件持久化。

  • 怎样触发 RDB 持久化?几种方式?有什么区别?

    • BGSAVE: 创建子进程进行快照。
    • SAVE: 阻塞当前 Redis 实例,创建快照。
    • shutdown: 服务器关闭时自动实行 SAVE。
    • ctrl+c 或 kill -9: 直接制止进程,触发 SAVE。

  • AOF 持久化与 RDB 持久化的优缺点?

    • RDB: 启动快,可能丢失数据。
    • AOF: 数据持久性好,启动时性能差,文件变大。推荐结合利用。

  • Redis 7.0 之前和之后的重写机制?

    • 之前: 父进程将操作放到内存,子进程天生新 AOF 文件。
    • 之后: 利用多部分 AOF 文件,父进程写入新文件,子进程天生基础 AOF 文件和增量文件,原子替换。

  • 怎样不让启动界面占用窗口?

    • 在 redis.conf 中设置 daemonize 为 yes。

位图 (Bitmap)

介绍

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

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


  • SETBIT

    • 阐明: 设置某一位上的值。
    • 语法: SETBIT key offset value (offset 为位偏移量,从 0 开始)

  • GETBIT

    • 阐明: 获取某一位上的值。
    • 语法: GETBIT key offset

  • BITPOS

    • 阐明: 返回指定值 (0 或 1) 在指定区间上首次出现的下标。
    • 语法: BITPOS key bit [start] [end]
    • 查找范围:

      • 不指定范围:BITPOS key bit
      • 指定开始位置:BITPOS key bit start
      • 指定开始和结束位置:BITPOS key bit start end


  • 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



  • BITCOUNT

    • 阐明: 统计指定区间内值为 1 的个数。
    • 语法: BITCOUNT key [start] [end]
    • 区间:

      • 正方向:BITCOUNT key start end(从左向右)
      • 负方向:BITCOUNT key start end(从右向左)



位图应用场景


  • 网站用户签到的天数统计

    • 用户 ID 为 key,天作为 offset,签到置为 1。
    • 例如,第 366 天签到,数据存储为 000000000000000。

  • 按天统计网站活跃用户

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

  • 用户在线状态和人数统计

    • 利用位图记载用户在线状态,可以有用统计当前在线人数和活动环境。

Java 操作 Redis

引入依赖

在 pom.xml 文件中添加 Jedis 毗连依赖:
  1. <dependency>
  2.   <groupId>redis.clients</groupId>
  3.   <artifactId>jedis</artifactId>
  4.   <version>4.3.2</version>
  5. </dependency>
复制代码
创建 Jedis 对象
  1. public static void main(String[] args) {
  2.     // 1. 创建 Jedis 对象
  3.     Jedis jedis = new Jedis("192.168.xxx.xxx", 7000);
  4.    
  5.     // 2. 选择操作的数据库,默认为 0 号库
  6.     jedis.select(0);
  7.    
  8.     // 3. 执行相关操作
  9.     // ...
  10.    
  11.     // 4. 释放资源
  12.     jedis.close();
  13. }
复制代码
操作 Key 相关 API


  • DEL

    • 阐明: 删除指定的 key。
    • 返回值: 被删除 key 的数量。

  • EXISTS

    • 阐明: 检查 key 是否存在。
    • 返回值: 存在返回 1,不存在返回 0。

  • EXPIRE

    • 阐明: 为已经存在的 key 设置逾期时间。
    • 返回值: 设置成功返回 1,失败返回 0。
    • 扩展:

      • PEXPIRE: 毫秒级别。
      • PEXPIREAT: 指定时间戳。


  • KEYS

    • 阐明: 返回符合模式的 key 列表。
    • 返回值: 符合模式的 key 列表。

  • MOVE

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

  • TTL

    • 阐明: 获取 key 的剩余生存时间。
    • 返回值:

      • 当 key 不存在时返回 -2。
      • 当 key 存在但没有设置剩余生存时间时返回 -1。
      • 否则,返回剩余生存时间(秒)。


  • PTTL

    • 阐明: 获取 key 的剩余生存时间(毫秒级)。

  • RANDOMKEY

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

  • RENAME

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

  • TYPE

    • 阐明: 获取 key 的数据范例。
    • 返回值: none (key 不存在)、string、list、set、zset、hash。

操作 String 相关 API


  • SET

    • 阐明: 设置 key 的值。

  • GET

    • 阐明: 获取 key 的值。

  • MSET

    • 阐明: 批量设置多个 key 的值。

  • MGET

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

  • GETSET

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

  • STRLEN

    • 阐明: 获取 key 对应字符串的长度。

  • APPEND

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

  • GETRANGE

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

  • SETEX

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

  • PSETEX

    • 阐明: 设置 key 的值并设置逾期时间(毫秒)。

  • SETNX

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

  • MSETNX

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

  • DECR

    • 阐明: 将 key 对应的值减 1。
    • 示例: DECR key 返回淘汰后的值。

  • DECRBY

    • 阐明: 将 key 对应的值减指定的值。
    • 示例: DECRBY key 2 返回淘汰后的值。

  • INCR

    • 阐明: 将 key 对应的值加 1。
    • 示例: INCR key 返回增长后的值。

  • INCRBY

    • 阐明: 将 key 对应的值加指定的值。
    • 示例: INCRBY key 2 返回增长后的值。

  • INCRBYFLOAT

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


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

正序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

星球的眼睛

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表