什么是灰度发布、金丝雀部署以及蓝绿部署?回答重点灰度发布、金丝雀部署和蓝绿部署是三种常见的软件发布策略,它们用于在系统升级时降低风险,确保在新版本上线过程中服务的稳定性和可控性。
灰度发布灰度发布是一种渐进式的发布方式,它通过将新版本逐步推送给部分用户进行试用,逐步扩大使用范围,直到新版本完全替换旧版本。其目的是通过小范围的用户测试,验证新版本的稳定性,降低发布新版本的风险。
实现方式:通...
Sentinel 与 Hystrix 的区别是什么?回答重点Hystrix 注重线程隔离以及服务保护,其主要是针对单个服务的服务调用,而 Sentinel 支持的粒度更小一点,其可以细化到服务的一个接口、一段代码等,并且其支持自定义流量控制规则,其可以针对整个系统的服务进行流量的监控和保护,两者的主要区别在于 Hystrix 是以服务保护为切入点,而 Sentinel 是以流量保护作为切入点...
Sentinel 是怎么实现限流的?回答重点首先需要定义具体需要限流的资源,然后指定一定的规则(基于QPS(每秒查询数)、线程数等维度),限制资源的访问频次。
然后根据一定的限流算法(固定窗口、滑动窗口、令牌桶和漏桶),对指定的资源进行访问的流量控制。
具体流程如下:
当一个请求进入系统时,Sentinel 会首先对请求进行统计(如当前的 QPS、并发数)
接着 Sentinel 检查配置...
Redis 主从复制的实现原理是什么?回答重点Redis 的主从复制是指一个 Redis 实例(主节点)可以将数据复制到一个或多个从节点(从节点),从节点从主节点获取数据并保持同步。
复制流程:
开始同步:从节点通过向主节点发送 PSYNC 命令发起同步。
全量复制:如果是第一次连接或之前的连接失效,从节点会请求全量复制,主节点将当前数据快照(RDB文件)发送给从节点。
增量复制:全量复制...
Redis 的订阅发布功能是什么?你了解吗?回答重点Redis 的订阅发布功能(Publish/Subscribe,简称 Pub/Sub),是一种消息通信机制,用于在不同客户端之间实现消息的实时传递和广播。使用 Pub/Sub 模型,客户端可以订阅一个或多个频道,当有其他客户端向这些频道发布消息时,所有订阅了该频道的客户端都会立即收到消息。
主要功能包括:
发...
Redis 集群会出现脑裂问题吗?回答重点Redis 集群存在脑裂问题的风险,特别是在网络分区的情况下,可能会导致同一集群内出现多个主节点,导致数据不一致。
扩展知识什么是脑裂脑裂是指在分布式系统中,由于网络分区或其他问题导致系统中的多个节点(特别是主节点)误以为自己是唯一的主节点。这种情况会导致多个主节点同时提供写入服务,从而引起数据不一致。
分布式系统就像一个团队在干活,如果发生了脑裂,...
Redis 集群的实现原理是什么?回答重点Redis 集群(Redis cluster)是通过多个 Redis 实例组成的,每个实例存储部分的数据(即每个实例之间的数据是不重复的)。
具体是采用哈希槽(Hash Slot)机制来分配数据,将整个键空间划分为 16384 个槽(slots)。每个 Redis 实例负责一定范围的哈希槽,数据的 key 经过哈希函数计算后对 16384 取余即可定...
分布式锁在未完成逻辑前过期怎么办?回答重点若锁在未完成逻辑前就过期,此时可能会产生数据不一致的问题。因为锁过期了,此时如果再出现一个客户端争抢锁,即可拿到锁然后同时进行业务操作,这等于锁失效了。
此时可以在逻辑执行过程中定期续期锁,确保锁在处理过程中不会过期。
扩展知识看门狗机制业界出了一个看门狗机制来防止这种情况的产生。
理论很简单,在抢到锁之后,后台会有一个任务,定时向 redis...
Redis 中如何实现分布式锁?回答重点在 Redis 中实现分布式锁的常见方法是通过set ex nx 命令 + lua 脚本组合使用。确保多个客户端不会获得同一个资源锁的同时,也保证了安全解锁和意外情况下锁的自动释放。
扩展知识理解 Redis 实现的分布式锁如果基于 Redis 来实现分布锁,需要利用 set ex nx 命令 + lua 脚本。
1)加锁:SET lock_key u...
Redis 的 Red Lock 是什么?你了解吗?回答重点Red Lock,又称为红锁,是一种分布式锁的实现方案,旨在解决在分布式环境中使用 Redis 实现分布式锁时的安全性问题。
一般情况下,我们在生产环境会使用主从+哨兵方式来部署 Redis。
如果我们正在使用 redis 分布式锁,此时发生了主从切换,但从节点上不一定已经同步了主节点的锁信息。
所以新的主节点上可能没有锁的信息。此...
Redis 实现分布式锁时可能遇到的问题有哪些?回答重点
业务未执行完,锁已到期
单点故障问题
主从问题不同步问题
网络分区问题
时钟漂移问题
锁的可重入性问题
误释放锁问题
扩展知识业务未执行完,锁已到期为了避免持有锁的客户端崩溃或因网络问题断开连接时,锁无法被正常释放,需要给锁设置过期时间。
那么就有可能出现业务还在执行,锁已到期的情况。
可以设置一种续约机制(Redisson 中的看...
Redis 中的缓存击穿、缓存穿透和缓存雪崩是什么?回答重点缓存击穿:指某个热点数据在缓存中失效,导致大量请求直接访问数据库。此时,由于瞬间的高并发,可能导致数据库崩溃。
缓存穿透:指查询一个不存在的数据,缓存中没有相应的记录,每次请求都会去数据库查询,造成数据库负担加重。
缓存雪崩:指多个缓存数据在同一时间过期,导致大量请求同时访问数据库,从而造成数据库瞬间负载激增。
解决方案缓存击穿:
...
Redis String 类型的底层实现是什么?(SDS)回答重点Redis 中的 String 类型底层实现主要基于 SDS(Simple Dynamic String 简单动态字符串)结构,并结合 int、embstr、raw 等不同的编码方式进行优化存储。
扩展知识C 语言字符串的缺陷Redis 为什么没有使用 C 标准库提供的字符串,而是实现了一种动态字符串?因为 C 语言的字符串本...
如何使用 Redis 快速实现排行榜?回答重点使用 Redis 实现排行榜的方式主要利用 Sorted Set(有序集合),它可以高效地存储、更新、以及获取排名数据。
实现排行榜的主要步骤:
1)使用 Sorted Set 存储分数和成员
使用 Redis 的 ZADD 命令,将用户和对应的分数添加到有序集合中。例如:ZADD leaderboard 1000 user1,将用户 user...
Redis 中如何保证缓存与数据库的数据一致性?回答重点缓存和数据库的同步可以通过以下几种方式:
1)先更新缓存,再更新数据库
2)先更新数据库存,再更新缓存
3)先删除缓存,再更新数据库,后续等查询把数据库的数据回种到缓存中
4)先更新数据库,再删除缓存,后续等查询把数据库的数据回种到缓存中
5)缓存双删策略。更新数据库之前,删除一次缓存;更新完数据库后,再进行一次延迟删除
6)使用 Bi...
如何使用 Redis 快速实现布隆过滤器?回答重点
布隆过滤器是一种高效的概率数据结构,常用于检测一个元素是否在一个集合中,可以有效减少数据库的查询次数,解决缓存穿透等问题。
可以通过使用 位图(Bitmap) 或使用 Redis 模块 RedisBloom。
1)使用位图实现布隆过滤器:
使用 Redis 的位图结构 SETBIT 和 GETBIT 操作来实现布隆过滤器。位图本质上是一...
如何使用 Redis 统计大量用户唯一访问量(UV)?回答重点Redis 中 HyperLogLog 结构,可以快速实现网页 UV 、PV 等统计场景。它是一种基数估算算法的概率性数据结构,可以用极少的内存统计海量用户唯一访问量的近似值。
Set 也可以实现,用于精确统计唯一用户访问量,但是但当用户数非常大时,内存开销较高。
扩展知识HyperLogLog 使用介绍HyperLogLog...
Redis 中的 Geo 数据结构是什么?回答重点Redis 中的 Geo(Geolocation 的简写形式,代表地理坐标) 数据结构主要用于地理位置信息的存储。通过这个结构,可以方便地进行地理位置的存储、检索、以及计算地理距离等操作。Geo 数据结构底层使用了 Sorted Set,并且结合了 Geohash 编码算法来对地理位置进行处理。
它是 Redis 2.2 版本后新增的数据类...
你在项目中使用的 Redis 客户端是什么?回答重点常见在项目中使用的客户端有以下三种:
Jedis 适用于简单的同步操作和单线程环境。
Lettuce 适用于高并发、高性能和多线程环境,尤其是需要异步和响应式编程的场景。
Redisson 适用于复杂的分布式系统,提供丰富的分布式对象和服务,简化开发。
JedisJedis 是一款比较经典的 Java 客户端了,里面提供了比较全面的 R...
Redis 字符串类型的最大值大小是多少?回答重点Redis 字符串能存储的最大容量是 512 MB 的数据,可以查看官方文档:
无论是网络传输、内存分配还是字符串操作,大字符串都会增加 Redis 服务器的负载。
且过大的字符串在 GET、SET、APPEND、STRLEN 等操作都会导致性能瓶颈。
所以官方给字符串的大小做了限制,防止单个键值对占用过多的内存,影响整体性能和稳定性。
...
Redis 性能瓶颈时如何处理?回答重点如果 Redis 无法承受当前的负载的话,可以考虑从以下几个解决方法去解决:
首先想到的是扩容,比如增加 Redis 的配置,容纳更多的内存等。
如果超过单机配置了,那么可以上 redis 主从,通过从服务分担读取数据的压力,利用哨兵自动进行故障转移。
还可以利用 redis 集群进行数据分片,比如 Redis Cluster。
也可以增加本地内存,通...
Redis 中 EMBSTR 对象的阈值设置为何为 44?其调整历史是什么?为什么 EMBSTR 的阈值大小是 44 个字节?这个问题有几个关键点:
1)Redis 使用的是 jemalloc 作为内存分配器。
2)jemalloc 是以 64 字节作为内存单位进行内存分配的,如果超过了 64 字节,即超过了一个内存单元,使用的就是 raw 编码,反之使用的就是 EMBSTR 编码。
3)核...
Redis 主从复制的常见拓扑结构有哪些?回答重点Redis 主从的几种常见拓扑结构如下(忽略哨兵):
1)一主多从:
这是最基本的拓扑结构,包含一个主节点和多个从节点。所有写操作都在主节点上执行,而读操作可以在从节点上进行,以提高读取速度和负载均衡。
2)树状主从结构(级联):
从节点也可以作为其他从节点的主节点。这样形成了一个层次结构,主节点负责写操作,而从节点负责读操作,并将...
Redis 中原生批处理命令(MSET、MGET)与 Pipeline 的区别是什么?回答重点原生批处理命令(MSET、MGET) 和 Pipeline 都可以用于一次性处理多个命令,但它们在实现方式和应用场景上有所不同:
1)MSET / MGET(原生批处理命令):
MSET 和 MGET 是 Redis 提供的原生批处理命令,用于批量设置和获取多个键值。
它们是 单个命令,...
Redis 复制延迟的常见原因有哪些?回答重点
Redis 的复制延迟是指从节点同步主节点数据时可能出现时间延迟。在读写分离场景,这个延迟会导致明明写入了数据,但是去从节点查的时候没查到。
可能原因如下:
1)网络原因
可能是带宽不足,或者网络抖动导致同步的延迟。
不过一般内网情况下不会产生这个问题。
2)主节点负载过高
主节点接收到大量的写操作,在处理客户端请求的同时,还需向从节点发送复...
Redis 事务与关系型数据库事务的主要区别是什么?回答重点Redis 的事务跟严格意义上的关系型数据库事务不一样,先复习下数据库事务 ACID 的定义:
原子性(Atomicity):事务中的所有操作要么全部成功,要么全部失败,且可以回滚到事务开始前的状态。
一致性(Consistency):事务执行前后,数据库必须保持一致的状态。
隔离性(Isolation):事务的执行是隔离的,事务...
如何在 Redis 中实现队列和栈数据结构?回答重点可以通过 List 类型 来实现 队列 和 栈 :
实现队列(FIFO):
队列是一种 先进先出(FIFO) 的数据结构。在 Redis 中,可以使用 LPUSH 和 RPOP 命令组合来实现队列。
LPUSH 向列表的左侧推入元素,而 RPOP 从列表的右侧弹出元素,这样可以保证最先进入的元素最先被弹出。
实现栈(LIFO):
栈是...
Redis 中的 Ziplist 和 Quicklist 数据结构的特点是什么?回答重点Ziplist:
简单、紧凑、连续存储,适用于小数据量场景,但对大量数据或频繁的修改操作不太友好。
适合小数据量场景,例如短列表、小哈希表等,因为它的内存紧凑,可以大幅减少内存使用
Quicklist:
通过将链表和 Ziplist 结合,既实现了链表的灵活操作,又能节省内存,在 Redis 3.2...
Redis Cluster 模式与 Sentinel 模式的区别是什么?回答重点1)Redis Cluster 是 Redis 集群,提供自动分片功能,将数据自动分布在多个节点上,支持自动故障转移。如果一个节点失败,集群会自动重新配置和平衡,不需要外部介入,因为它内置了哨兵逻辑。
2)Sentinel 是哨兵,主要用于管理多个 Redis 服务器实例来提高数据的高可用性。当主节点宕机,哨兵会...
Redis 的 ListPack 数据结构是什么?回答重点ListPack 是 Redis 内部的一种数据结构,用于高效存储短小的字符串或整数集合。它是一种紧凑型的序列化数据结构,旨在减少内存占用和提升性能。为了尽可能紧凑地存储数据,因此它没有使用 Redis 常见的对象模型,而是直接以字节序列的形式存储数据。
ListPack 是 Redis 6.0 引入的新数据类型,在 List、Has...