redis练习题

本文概述了Redis Stream在消息队列中的应用,介绍了mem_fragmentation_ratio指标,详细解析了Redis的全量和增量复制机制,以及发布订阅机制的工作原理。此外,讨论了哨兵机制在主从切换过程中的关键步骤。主从集群中的复制缓冲区和积压缓冲区的作用及其对同步的影响也被深入剖析。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.stream介绍:
stream主要用于消息队列,redis本身是有一个发布订阅 (pub/sub)来实现消息队列的,但是由于无法将消息持久化,如果出现宕机等情况就会导致数据丢失。
而Redis Stream提供消息的持久化和主备复制功能,可以让任何客户端访问任何时刻数据,并且能够记住每一个客户端的访问位置,还能保证消息不丢失。
在这里插入图片描述
同一条消息在同一消费组内只能被一个消费者读取消费。

2.info memory命令:
mem_fragmentation_ratio代表内存碎片率:used_memory_rss/ used_memory
一般来说1-1.5之间比较健康。

3.RDB机制:
全量复制
redis提供两种命令来生成全量的rdb文件:
1.save:在主线程中执行,会阻塞主线程
2.bgsave:创建一个子线程,专门用来写入RDB文件,避免主线程阻塞。在这里插入图片描述
其实现原理:主线程会fork一个子线程,并且复制一份数据对应的映射页给子线程,子线程可以通过映射页访问主线程的原始数据。然后子线程生成快照数据。但是如果此时有请求想修改数据怎么办呢?
通过写时复制技术:即当请求需要对键值对c进行操作的时候,主线程会把新数据或者修改后的数据写入到一个新的物理内存地址上(键值对c‘),并修改主线程自己的内存页映射。所以子线程读到的类似于原始数据的一个副本。

增量复制
指做了一次全量快照后,后续的快照只对修改的数据进行快照记录。但是由于我们需要对数据修改进行记录,这就需要额外的开销。在这里插入图片描述

4.redis的发布订阅机制:
redis的发布订阅机制包含三个部分:发布者 订阅者 Channel
在这里插入图片描述
发布者和订阅者都是Redis客户端,Channel则为Redis服务器端,发布者将消息发送到某个的频道,订阅了这个频道的订阅者就能接收到这条消息。Redis的这种发布订阅机制与基于主题的发布订阅类似,Channel相当于主题。

5.在使用哨兵机制对发生故障的主从集群进行主从切换时,会涉及:
主库被判定为主观下线—> 主库被判定为客观下线 —> 选举哨兵Leader —> 确定新主库 —> 主从库实际切换

6.Redis 的主从集群可以提升数据可靠性,主节点在和从节点进行数据同步时,会使用两个缓冲区:复制缓冲区和复制积压缓冲区。这两个缓冲区的作用各是什么?会对 Redis 主从同步产生什么影响吗?
复制缓冲区:主节点开始和一个从节点进行全量同步时,会为从节点创建一个输出缓冲区,这个缓冲区就是复制缓冲区。当主节点向从节点发送RDB文件的时候,如果主节点接收到写命令就会将它们暂时存放到复制缓冲区,等到RDB传输完成后,主节点再把复制缓冲区中的写命令发送给从节点,进行同步。

对主从同步的影响:如果主库传输RDB文件以及从库加载RDB文件的时间较长,同时主库接收的写命令较多,就会导致复制缓冲区被写满而溢出。一旦溢出,主库就会关闭和从库的连接,并重新开始全量传输。所以,我们可以通过调整 client-output-buffer-limit slave 这个配置项,来增加复制缓冲区的大小,以免复制缓冲区溢出。

复制积压缓冲区:主节点和从节点进行常规同步时,会把写命令也暂存到复制积压缓冲区,如果从节点和主节点发生网络断连,等从节点再次连接后,可以从复制积压缓冲区中同步尚未复制的命令操作。

### Redis 练习题及答案 以下是一些关于 Redis练习题及答案,涵盖 Redis 的核心功能和使用场景: 1. **Redis 支持哪些数据类型?** - Redis 支持多种数据类型,包括字符串(String)、哈希(Hash)、列表(List)、集合(Set)以及有序集合(Sorted Set)。这些数据类型使得 Redis 在处理复杂数据结构更加灵活[^2]。 2. **如何连接到本地的 Redis 服务器?** - 使用 Jedis 库可以轻松连接到 Redis 服务器。例如: ```java Jedis jedis = new Jedis("127.0.0.1", 6379); ``` 这段代码通过指定 IP 地址和端口号来连接到本地运行的 Redis 服务器[^3]。 3. **如何将查询结果存储到 Redis 中?** - 假设有一个数据库查询结果集 `ResultSet`,可以通过以下方式将其存储到 Redis 中: ```java while (rs.next()) { String userId = rs.getString("id"); String userName = rs.getString("name"); int userAge = rs.getInt("age"); // 存储学生姓名 jedis.hset("student:" + userId, "name", userName); // 存储学生年龄 jedis.hset("student:" + userId, "age", String.valueOf(userAge)); // 将学生 ID 和年龄存入有序集合,按年龄排序 jedis.zadd("studentsByAge", userAge, userId); } ``` 上述代码展示了如何将学生的姓名、年龄等信息存储到 Redis 的哈希和有序集合中[^3]。 4. **Redis 的持久化机制有哪些?** - Redis 提供两种主要的持久化方式:RDB(快照)和 AOF(Append-Only File)。RDB 是在指定的间间隔内生成数据的快照,而 AOF 则记录每次写操作的日志,以便在重启后恢复数据[^2]。 5. **Redis 的速度为什么比 Memcached 快?** - Redis 的速度更快是因为它不仅支持简单的键值对存储,还支持丰富的数据类型和更复杂的操作。此外,Redis 的持久化能力使其在数据可靠性方面更具优势[^2]。 --- ### Redis 学习教程推荐 以下是几个 Redis 的学习资源推荐,帮助用户更好地掌握 Redis使用: 1. **官方文档** - Redis 官方文档是最权威的学习资源之一,涵盖了从基础概念到高级功能的所有内容。地址为 [https://redis.io/documentation](https://redis.io/documentation)。 2. **《Redis 设计与实现》** - 这本书深入分析了 Redis 的内部工作机制,适合希望了解 Redis 核心原理的开发者。 3. **在线课程** - 平台如 Coursera、Udemy 和 B站 提供了许多 Redis 的入门和进阶课程,适合不同水平的学习者。 4. **Python 练习笔记** - 如果你使用 Python,可以参考类似“Python练习笔记之Redis练习题及答案”的资料,结合实际项目进行练习。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值