Redis
Q:什么是Redis?它的特点是什么?
A:Redis是一种开源的内存数据存储系统,常用作缓存、数据库和消息代理。它的主要特点包括:
- 高性能:Redis存储在内存中,提供快速的读写操作和低延迟。
- 数据结构多样性:Redis支持多种数据结构,如字符串、哈希、列表、集合和有序集合。
- 持久性:Redis可以将数据持久化到磁盘,以防止数据丢失。
- 高可用性:Redis支持主从复制和集群模式,以提供高可用性和可伸缩性。
- 支持丰富的功能:Redis提供了丰富的功能,如事务、发布订阅、Lua脚本等
Q:Redis支持的数据结构有哪些?请举例说明其用途
A:Redis支持以下数据结构:
- 字符串(String):存储字符串值,常用于缓存、计数器等。
- 哈希(Hash):存储键值对,适用于存储对象或记录的属性。
- 列表(List):存储有序的字符串元素,可用于实现队列、栈等。
- 集合(Set):存储唯一的字符串元素,提供集合操作,如交集、并集等。
- 有序集合(Sorted Set):存储有序的字符串元素,并为每个元素关联一个分数,适用于排行榜、范围查询等。
Q:Redis的持久化机制是什么?有哪两种方式?
A:Redis提供两种持久化方式:
RDB(Redis Database):将Redis数据保存到磁盘的快照文件,可以定期或手动创建。
优点:
- 只有一个文件 dump.rdb,方便持久化。
- 容灾性好,一个文件可以保存到安全的磁盘。
- 性能最大化,fork 子进程来完成写操作,让主进程继续处理命令,所以是 IO 最大化。使用单独子进程来进行持久化,主进程不会进行任何 IO 操作,保证了 Redis的高性能。
- 相对于数据集大时,比 AOF 的启动效率更高。
缺点:
- 数据安全性低。RDB 是间隔一段时间进行持久化,如果持久化之间 Redis 发生故障,会发生数据丢失。所以这种方式更适合数据要求不严谨的时候
AOF(Append-Only File):以追加的方式记录每个写操作到日志文件中,用于恢复数据。
- 优点:
- 数据安全,aof 持久化可以配置 appendfsync 属性,有 always,每进行一次命令操作就记录到 aof 文件中一次。
- 通过 append 模式写文件,即使中途服务器宕机,可以通过 redis-check-aof 工具解决数据一致性问题。
- AOF 机制的 rewrite 模式。AOF 文件没被 rewrite 之前(文件过大时会对命令进行合并重写),可以删除其中的某些命令(比如误操作的 flushall)
- 缺点:
- AOF 文件比 RDB 文件大,且恢复速度慢。
- 数据集大的时候,比 RDB 启动效率低。
- 优点:
Q:Redis的主从复制是什么?有什么作用
A:Redis主从复制是一种机制,通过将主节点的数据复制到一个或多个从节点,以实现数据的冗余和读扩展。主从复制的作用包括:
- 数据备份:从节点可以用作主节点数据的备份,以防止主节点数据的丢失。
- 提高读性能:从节点可以处理读取请求,减轻主节点的负载。
- 故障恢复:如果主节点发生故障,可以将从节点升级为新的主节点
Q:Redis如何处理并发访问和并发写入的问题?
A:Redis是单线程的,通过使用事件驱动的异步IO模型来处理并发访问。Redis的单线程模型可以避免锁竞争和线程上下文切换的开销。此外,Redis还提供了事务和乐观锁等机制来处理并发写入的问题。
Q:Redis的缓存失效策略有哪些?请说明它们的工作原理
A:Redis的缓存失效策略包括:过期时间、LRU(最近最少使用)、LFU(最近最不常用)和随机淘汰。过期时间是通过设置键的过期时间来失效缓存。LRU和LFU是基于访问频率的缓存淘汰策略,LRU淘汰最长时间未被访问的键,而LFU淘汰最不常用的键。随机淘汰是随机选择要淘汰的键。
Q:Redis如何处理并发读写的问题?
A:Redis是单线程的,通过使用事件驱动的异步IO模型来处理并发读写。Redis的单线程模型可以避免锁竞争和线程上下文切换的开销。此外,Redis还提供了乐观锁机制(使用WATCH命令)来处理并发写入的问题
Q: 是否使用过 Redis 集群,集群的原理是什么?
A:
- Redis Sentinal 着眼于高可用, 在 master 宕机时会自动将 slave 提升为master, 继续提供服务。
- 、Redis Cluster 着眼于扩展性, 在单个 redis 内存不足时, 使用 Cluster 进行分片存储。
Q:Redis 常见性能问题和解决方案?
A:(1) Master 最好不要做任何持久化工作,如 RDB 内存快照和 AOF 日志文件
(2) 如果数据比较重要,某个 Slave 开启 AOF 备份数据,策略设置为每秒同步一次
(3) 为了主从复制的速度和连接的稳定性,Master 和 Slave 最好在同一个局域网内
(4) 尽量避免在压力很大的主库上增加从库
(5) 主从复制不要用图状结构,用单向链表结构更为稳定,即:Master <- Slave1 <- Slave2 <- Slave3...
这样的结构方便解决单点故障问题,实现 Slave 对 Master 的替换。如果 Master 挂了,可以立刻启用 Slave1 做 Master,其他不变。
Q:Redis 最适合的场景?
A:会话缓存、全页缓存、队列、排行榜/计数器、发布/订阅、