Java 面试知识点【背诵版 240题 约7w字】 (47)

有序集合的典型使用场景就是排行榜系统,例如用户上传了一个视频并获得了赞,可以使用 zadd 和 zincrby。如果需要将用户从榜单删除,可以使用 zrem。如果要展示获取赞数最多的十个用户,可以使用 zrange。

键和数据库管理 5 Q1:如何对键重命名? rename key newkey

如果 rename 前键已经存在,那么它的值也会被覆盖。为了防止强行覆盖,Redis 提供了 renamenx 命令,确保只有 newkey 不存在时才被覆盖。由于重命名键期间会执行 del 命令删除旧的键,如果键对应值比较大会存在阻塞的可能。

Q2:如何设置键过期?

expire key seconds:键在 seconds 秒后过期。

如果过期时间为负值,键会被立即删除,和 del 命令一样。persist 命令可以将键的过期时间清除。

对于字符串类型键,执行 set 命令会去掉过期时间,set 命令对应的函数 setKey 最后执行了 removeExpire 函数去掉了过期时间。setex 命令作为 set + expire 的组合,不单是原子执行并且减少了一次网络通信的时间。

Q3:如何进行键迁移?

move
move 命令用于在 Redis 内部进行数据迁移,move key db 把指定的键从源数据库移动到目标数据库中。

dump + restore
可以实现在不同的 Redis 实例之间进行数据迁移,分为两步:
① dump key ,在源 Redis 上,dump 命令会将键值序列化,格式采用 RDB 格式。
② restore key ttl value,在目标 Redis 上,restore 命令将序列化的值进行复原,ttl 代表过期时间, ttl = 0 则没有过期时间。
整个迁移并非原子性的,而是通过客户端分步完成,并且需要两个客户端。

migrate
实际上 migrate 命令就是将 dump、restore、del 三个命令进行组合,从而简化操作流程。migrate 具有原子性,支持多个键的迁移,有效提高了迁移效率。实现过程和 dump + restore 类似,有三点不同:
① 整个过程是原子执行,不需要在多个 Redis 实例开启客户端。
② 数据传输直接在源 Redis 和目标 Redis 完成。
③ 目标 Redis 完成 restore 后会发送 OK 给源 Redis,源 Redis 接收后根据 migrate 对应选项来决定是否在源 Redis 上删除对应键。

Q4:如何切换数据库?

select dbIndex,Redis 中默认配置有 16 个数据库,例如 select 0 将切换到第一个数据库,数据库之间的数据是隔离的。

Q5:如何清除数据库?

用于清除数据库,flushdb 只清除当前数据库,flushall 会清除所有数据库。如果当前数据库键值数量比较多,flushdb/flushall 存在阻塞 Redis 的可能性。

持久化 9 Q1:RDB 持久化的原理?

RDB 持久化是把当前进程数据生成快照保存到硬盘的过程,触发 RDB 持久化过程分为手动触发和自动触发。

手动触发分别对应 save 和 bgsave 命令:

save:阻塞当前 Redis 服务器,直到 RDB 过程完成为止,对于内存比较大的实例会造成长时间阻塞,线上环境不建议使用。

bgasve:Redis 进程执行 fork 操作创建子进程,RDB 持久化过程由子进程负责,完成后自动结束。阻塞只发生在 fork 阶段,一般时间很短。bgsave 是针对 save 阻塞问题做的优化,因此 Redis 内部所有涉及 RDB 的操作都采用 bgsave 的方式,而 save 方式已经废弃。

除了手动触发外,Redis 内部还存在自动触发 RDB 的持久化机制,例如:

使用 save 相关配置,如 save m n,表示 m 秒内数据集存在 n 次修改时,自动触发 bgsave。

如果从节点执行全量复制操作,主节点自动执行 bgsave 生成 RDB 文件并发送给从节点。

执行 debug reload 命令重新加载 Redis 时也会自动触发 save 操作。

默认情况下执行 shutdown 命令时,如果没有开启 AOF 持久化功能则自动执行 bgsave。

Q2:bgsave 的原理?

① 执行 bgsave 命令,Redis 父进程判断当前是否存在正在执行的子进程,如 RDB/AOF 子进程,如果存在 bgsave 命令直接返回。

② 父进程执行 fork 操作创建子进程,fork 操作过程中父进程会阻塞。

③ 父进程 fork 完成后,bgsave 命令返回并不再阻塞父进程,可以继续响应其他命令。

④ 子进程创建 RDB 文件,根据父进程内存生成临时快照文件,完成后对原有文件进行原子替换。

⑤ 进程发送信号给父进程表示完成,父进程更新统计信息。

Q3:RDB 持久化的优点?

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zwpgxs.html