1、谈下你对 Redis 的了解?

2、什么是分布式锁?有什么作用?

分布式锁是一种在分布式系统中控制并发访问的机制。它可以确保在多个节点上并发执行的代码段只有一次执行,以避免数据竞争和不一致的结果。

分布式锁通常用于多个进程或多个服务器之间的数据同步和协同工作。在分布式环境中,不同的节点可能同时访问同一资源,例如共享存储或数据库。为了避免并发访问引起的问题,可以使用分布式锁来保证共享资源的独占性。

常见的分布式锁实现方式包括:

  • 基于数据库的实现,如 MySQL,Redis 等;
  • 基于 ZooKeeper 等分布式协调服务的实现;
  • 基于 Redis 的实现的方案。

分布式锁能够优雅地解决在分布式系统中的并发问题,并且在很多场景中都得到了广泛的应用,例如分布式锁可以用于分布式应用程序中的分布式事务、分布式任务队列等场景。

3、分布式锁实现方案有哪些?

4、介绍一下分布式锁实现需要注意的事项?

1)选用合适的锁存储介质:在分布式场景下,锁的存储需要保证高可用性和可靠性,所以可以选择使用 Redis、Zookeeper 等分布式存储介质。

  • 锁的粒度:需要考虑获取锁的粒度,如果粒度过大,系统吞吐量会受到影响,而如果粒度过小,则容易出现死锁等问题。

  • 锁的超时问题:在分布式锁中,需要设置锁的超时时间,确保锁的分配和释放时间不会出现太大的差异,从而导致锁被占用过久而出现死锁等问题。

  • 重入锁的实现:在分布式锁中,需要考虑锁的重入问题,即同一线程多次获取锁的情况,需要保证不出现死锁等问题。

  • 高并发场景下的锁冲突:在高并发场景下,需要考虑多线程同时请求锁导致的锁冲突问题,需要使用合适的算法来解决。常用的算法有乐观锁和悲观锁等。

  • 锁粒度的细化:可以使用分段锁或者分布式锁的方式来对锁进行粒度划分,从而提高系统的吞吐量和性能。

注意以上事项是需要在分布式锁实现过程中需要关注的点,如果能够针对以上点进行实现,那么可以保证分布式锁的高效实现。

5、Redis 怎么实现分布式锁?

  • 客户端请求获取锁时,使用 SET key value NX PX milliseconds 命令来设置一个带过期时间的锁,其中 NX 表示如果 key 不存在则 SET 命令执行,PX 表示过期时间为 milliseconds 毫秒,value 为一个随机值,确保每一个请求获取锁时 value 值都不同。

  • 如果 SET 命令返回 OK,则表示获取到了锁,可以继续执行业务逻辑了。

  • 如果 SET 命令返回 null,则表示锁已经被其他客户端持有,此时需要等待一段时间之后再次请求获取锁。可以使用循环+睡眠等方式进行重试操作。

  • 客户端释放锁时,需要使用 Lua 脚本来保证释放锁的原子性,即同时检查 value 值并删除 key,防止误删除其他客户端加的锁。可以使用 EVAL 命令来执行这个 Lua 脚本。

6、缓存命中率表示什么?

缓存命中率表示在一定时间内,请求中访问到缓存系统中的数据所占的比例。通常情况下,高缓存命中率是良好性能的一个指标,表示缓存系统能够有效地缓存数据,并且能够快速地响应用户请求。

例如,如果有 100 个请求到达系统,其中 80 个请求都能够在缓存系统中找到相应的缓存数据,则缓存命中率为 80%,表示 80%的请求可以从缓存中快速获取数据,而不必访问后端系统。当缓存命中率较低时,需要经常从后端系统中获取数据,处理请求的响应时间更长,因此,缓存命中率的提高可以显著地改善应用程序的性能。

除了缓存命中率,还有其他一些指标可以衡量缓存系统的性能,例如缓存系统的响应时间、缓存数据的有效期等。在实践中,需要综合考虑多个因素来评估缓存系统的性能和可靠性。

7、怎么提高缓存命中率?

8、Redis 中 key 已经过期了,但为什么内存并没有释放?

过期策略(懒惰删除、定期删除、定时删除) Redis 中的内存回收机制是基于惰性删除的,它并不会立即删除过期的 key,而是在客户端取 key 时才检查 key 是否过期,如果过期则删除 key,并返回 nil。因此,即使 key 已经过期,内存并不会立即被释放。

Redis 内存回收的具体流程如下:

  • Redis 定期(默认每秒钟)会遍历所有的 key,检查每个 key 是否过期,如果过期则将 key 标记为过期删除状态。

  • 当客户端访问一个 key 时,Redis 会检查该 key 是否过期,如果过期则删除 key 并返回 nil。

  • 当 Redis 的内存使用达到了阈值时(默认情况下是 maxmemory),Redis 会优先删除过期 key。

  • 当 Redis 再次分配内存时,它会从过期的 key 中清理出一部分内存来。

因此,如果你希望某个 key 过期后立即释放内存,可以在写入这个 key 时设置它的过期时间为 0,这样 key 一旦过期就会立即被删除。

9、你说说 Redis 中的跳表 支持二分查找的多级链表

10、说说你对 Redis 中的 I/O 多路复用模型的理解

11、Redis 是单线程还是多线程?

12、如何保证缓存和数据库的一致性?

13、Redis 实现分布式锁,如果业务超时了,怎么办? set key value ex|px etime|ptime NN|NX

14、在你们项目中,Redis 的持久化机制用的是哪种?

15、MySQL 里有 2000w 数据,redis 中只存 20w 的数据,如何保证 redis 中的数据都是热点数据? 内存淘汰策略 LRU

16、Redis 事务支持隔离性吗?Redis 事务保证原子性吗,支持回滚吗?

17、LRU、LFU 是什么?如何实现?

18、新的主节点是怎样被挑选出来的? 选举

19、Redis 集群中数据如何分区?

20、Redis 部署集群至少需要几个物理节点?

3 个

21、说说集群的伸缩?

22、能说说布隆过滤器吗? 插件,pf.add

23、大 key 问题了解吗?

1)内存占用 2)读取/删除耗时造成

24、大 key 会造成什么问题呢?

25、如何找到大 key?

使用命令 redis-cli –bigkeys ,Redis 会扫描所有的 key,并返回尺寸超过 threshold 的 key 列表,其中 threshold 是一个可选的参数,默认值为 1024 字节。 除了使用 redis-cli 工具,还可以使用 Redis 的客户端库编写一个脚本来检查大 key

26、如何处理大 key?

27、使用 Redis 如何实现异步队列?

28、为什么说 Redis 的性能很好?

29、说说 Redis 的同步机制

30、如何进行缓存降级?

31、Redis 的脑裂问题是怎么解决的?

Redis 脑裂问题指的是由于网络异常或硬件故障等原因,导致 Redis 集群中的一部分节点与其他节点失去连接,形成小集群,而这些小集群各自继续对外提供服务,从而导致数据不一致的问题。

Redis 解决脑裂问题的方式主要有两种:

  • Redis Sentinel

Redis Sentinel 是 Redis 官方提供的高可用性解决方案,它可以对 Redis 主从集群进行监控和自动故障转移。当 Redis 主节点宕机时,Sentinel 会自动将其中一个从节点切换为新的主节点,确保集群的高可用性。当出现脑裂时,Sentinel 会检测到多个主节点存在,并且将其中一个主节点(通常是经过 Sentinel 协商选出的主节点)设置为唯一的主节点,其他主节点都会被降级为从节点,从而避免了数据不一致的问题。

  • Redis Cluster

Redis Cluster 是 Redis 官方提供的分布式解决方案,它采用数据分片和多节点复制的方式来实现高可用性和数据一致性。Redis Cluster 将数据分散存储在多个节点中,并且对每个节点进行多次复制,以保证数据的可靠性和高可用性。当出现脑裂时,Redis Cluster 会自动检测到多个主节点,并通过协商选出一个主节点,其他主节点会被降级为从节点,从而避免了数据不一致的问题。

在实际应用中,需要根据应用场景选择适当的解决方案。如果需要对现有的单节点 Redis 进行高可用性改造,则可以选择 Redis Sentinel;如果需要在分布式环境下保证高可用性和数据一致性,则可以选择 Redis Cluster。

32、Redis 如何实现签到功能?

33、Jedis 与 Redisson 对比有什么优缺点?

34、说说 Redis 哈希槽的概念?

35、Redis 回收进程如何工作的?

36、Redis 持久化数据和缓存怎么做扩容?

37、分布式 Redis 是前期做还是后期规模上来了再做好?为什么?

38、一个 Redis 实例最多能存放多少的 keys?List、 Set、Sorted Set 他们最多能存放多少元素?

39、假如 Redis 里有 1 亿个 key,其中 10w 个 key 是以某已知的前缀开头的,如何将它们全部找出来?

40、Redis 如何实现延时队列 zset

41、什么是 Redis 的 Pipeline?

42、原生批命令(mset,mget)与 Pipeline 区别

43、什么是一致性 Hash 以及解决什么问题? 2^32, 分布式缩扩容问题

44、Cluster 模式的原理?

45、Cluster 的分片机制?

46、Cluster 集群的扩容流程?

47、Cluster 集群收缩流程?

48、客户端如何路由?

49、为什么是 163834 个槽位?

50、集群的故障发现与迁移?