Redis组件介绍(三)
写在前面今天来继续学习 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
[*]查找范围:
[*]不指定范围:BITPOS key bit
[*]指定开始位置:BITPOS key bit start
[*]指定开始和结束位置:BITPOS key bit start end
[*]BITOP
[*]说明: 对一个或多个保存二进制位的字符串进行位操作,并将结果保存到 destkey。
[*]操作类型:
[*]AND: BITOP AND destkey key
[*]OR: BITOP OR destkey key
[*]XOR: BITOP XOR destkey key
[*]NOT: BITOP NOT destkey key
[*]BITCOUNT
[*]说明: 统计指定区间内值为 1 的个数。
[*]语法: BITCOUNT key
[*]区间:
[*]正方向: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 连接依赖:
<dependency>
<groupId>redis.clients</groupId>
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
[*]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 返回增加后的值。
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
页:
[1]