1. Redis是什么?它有什么特点?
答:Redis是一个使用C语言编写的开源、高性能、支持多种数据结构的NoSQL数据库。
- 支持多种数据结构,如字符串、哈希表、列表、集合、有序集合等。
- 数据存储在内存中,可以快速读写。
- 支持数据持久化,可以将数据保存到磁盘上。提供了丰富的功能,如发布订阅、事务、 Lua 脚本等。
- 具有高可用性和可扩展性。
2.Redis的常用数据结构有哪些?适合的应用场景?
答:Redis支持五种数据类型:字符串(string)类型、哈希(hash)类型、列表(list)类型、集合(set)类型和有序集合(sorted set或zset)类型。
- 字符串:适合存储简单的值,如计数器、缓存、session ID等。
- 哈希:适合存储对象,如用户信息、文章信息等。
- 列表:适合存储队列、聊天记录等。
- 集合:适合存储标签、好友列表等。
- 有序集合:适合存储排行榜等需要按照分数排序的数据
3. Redis的主从复制是如何实现的?
答:Redis主从复制是通过在从服务器上启动一个Redis进程,连接到主服务器并发送SYNC命令来实现的。
主服务器创建一个快照文件并将其发送到从服务器。然后,主服务器将其所有写操作复制到从服务器。在复制过程中,从服务器连接到主服务器并接收命令,以保证数据不会丢失。
4. Redis如何实现持久化?各自的优缺点是什么?
答:Redis有两种持久化方式:快照
和日志文件
。快照是把当前内存中的数据作为一个副本保存到硬盘中的一个文件中。日志文件则是将写操作写入一个日志文件中,当Redis重启时,会从日志文件中读取并重新构建数据。
- RDB 持久化文件较小,恢复速度快,但可能会有数据丢失。
- AOF 持久化文件较大,恢复速度较慢,但更加可靠,因为它记录了每个写操作。
5. Redis的并发控制是如何实现的?
答:Redis使用单线程模型,每个客户端请求按顺序处理,保证了并发的安全性。此外,Redis采用了异步I/O和非阻塞I/O技术来提高性能。
6. Redis的缓存淘汰策略有哪些?
答:Redis的缓存淘汰策略有四种:
- LRU(最近最少使用)
- LFU(最不常用)
- TTL(生存时间)
- 随机
- 可以通过修改配置文件或设置键的过期时间来使用这些策略。
7. Redis的事务是如何实现的?
答:Redis使用MULTI
、EXEC
和WATCH
命令实现事务。MULTI
命令将客户端的请求推到一个队列中,EXEC
命令执行队列中的所有命令。WATCH
命令可以监听一个或多个键的变化,如果在队列中执行事务期间有被监听的键被其他客户端修改,则事务会被取消。
root@1b9968da8463:/data# redis-cli 127.0.0.1:6379> set name 'Peter' OK 127.0.0.1:6379> multi OK 127.0.0.1:6379> set id '001' QUEUED 127.0.0.1:6379> get id QUEUED 127.0.0.1:6379> set depName 'Dev' QUEUED 127.0.0.1:6379> set age 25 QUEUED 127.0.0.1:6379> exec 1) OK 2) "001" 3) OK 4) OK 127.0.0.1:6379> get age "25"
8. Redis的哨兵是什么?它的作用是什么?
答:Redis哨兵是一个独立的进程,可以监测Redis服务器的健康状态并在主服务器宕机时自动将从服务器升级为主服务器。
9. Redis有哪些常见的使用场景?
答:Redis常见的使用场景包括缓存、消息队列、计数器、排行榜、分布式锁等。
10. Redis如何实现分布式锁?
答:Redis通过SETNX
命令来实现分布式锁,在获取锁之前需要先判断当前锁是否已经被其他客户端占用,如果没有被占用则获取锁,否则等待一定时间后重试。
11.Redis 的过期键删除策略是什么?它是如何处理过期键的?
答:Redis 使用惰性删除和定期删除两种策略处理过期键:
- 惰性删除:当客户端尝试访问一个已经过期的键时,Redis 会立即删除该键并返回空值。这种方式确保在访问时进行删除,但可能会造成一些键在过期后仍然存在一段时间。
- 定期删除:Redis 每隔一段时间(默认是 1 秒)会对一部分过期键进行检查和删除。这种方式通过遍历一部分过期键,将满足条件的键删除,以释放内存。定期删除可以防止过期键堆积带来的内存压力。
12.Redis的并发竞争问题怎么解决?
答:Redis采用单进程单线程模型,不存在多线程竞争的问题。
同时,Redis使用事件驱动模式,通过epoll等技术来支持高并发,可以处理成千上万的并发连接。为了保证数据一致性,Redis提供了原子操作和事务支持,可以避免竞争问题。
13.Redis集群槽位有多少个?
答:Redis集群默认有16384个槽位。
如果某个节点缺少一个槽位,这个节点将无法正常工作,因为每个节点必须拥有完整的槽位范围才能正确处理对应的键。因此,如果某个节点缺少一个槽位,需要将这个节点重启并重新分配槽位,以确保它能够正常工作。
4.Redis数据写入的时候怎么在各节点槽位分配数据的?
答:Redis使用一致性哈希算法来把数据分布到不同的节点上。
具体来说, Redis使用一个虚拟环形哈希空间来表示所有的节点。每个节点在这个空间上会被映射到一个或多个槽位。
在Redis集群中,这些槽位被动态地分配给各个节点。每个槽位代表了数据的一个部分,Redis把数据根据它们的key哈希到对应的槽位上,然后把这些数据存储在槽位所对应的节点上。
当我们向Redis写入数据时,Redis会根据key的哈希值找到对应的槽位,然后把数据写入到对应的节点上。这样就可以保证数据的高可用性和可扩展性。
15.一个Redis集群各槽位与总槽位之间是什么关系
Redis集群将整个数据集分成16384个槽位(slot),每个槽位可以存储一个键值对。集群中每个节点都可以负责多个槽位,而每个槽位只能被一个节点负责。所有节点负责的槽数量之和必须等于16384。