redis
文章平均质量分 75
Nathaniel333
源码爱好者/java八股文总结者/AI爱好者
展开
-
面试专栏:布隆过滤器
布隆过滤器(Bloom Filter)是一种高效的数据结构,用于判断一个元素是否存在于一个集合中。它利用位数组和多个哈希函数来实现快速的成员查询。布隆过滤器的核心思想是用一个位数组(通常用二进制位表示)来表示一个集合,初始时所有位都置为0。然后,对于每个要加入集合的元素,通过多个哈希函数计算出多个哈希值,然后将位数组中对应的位置置为1。判断一个元素是否存在于集合时,同样使用多个哈希函数计算出对应的哈希值,然后检查位数组中对应的位置是否都为1,如果有任意一个位置为0,则说明该元素不存在于集合中;原创 2024-02-26 07:19:22 · 1121 阅读 · 0 评论 -
面试专栏:Redis集群
刚刚我们讲了,Redis 的每个节点上,都保存了所有槽和节点的映射关系表,客户端可以访问任意一个节点,再通过重定向命令,找到数据所在的那个节点。比如说,集群加入了新节点,或者某个主节点宕机了,新的主节点被选举出来,这些情况下,都需要更新集群每一个节点上的映射关系表。所谓流言,就是八卦,比如说,我们上学的时候,班上谁和谁偷偷好上了,搞对象,那用不了一天,全班同学都知道了。这个也很好理解,比如说,换成某两个特别出名的明星搞对象,即使是全国人民都很八卦,但要想让全国每一个人都知道这个消息,还是需要很长的时间。原创 2024-02-26 07:16:07 · 1586 阅读 · 0 评论 -
面试专栏:RDB和AOF
格式:RDB是二进制格式,紧凑但不可读;AOF是纯文本格式,可读但通常体积更大。内容:RDB包含了某个时刻的数据快照,而AOF包含了达到当前状态所需执行的所有命令。恢复速度:RDB文件可以更快地被加载恢复,因为它是直接将数据状态读入内存;而AOF恢复速度较慢,因为需要重新执行文件中的所有命令。数据安全性:AOF可以提供更高的数据安全性,因为它能够更频繁地记录数据变化。选择哪种持久化方式(或同时使用两种方式)取决于具体的业务需求,包括对数据安全性的需求、恢复速度的要求以及对系统性能的影响。原创 2024-02-25 22:09:04 · 850 阅读 · 0 评论 -
面试专栏:缓存数据库一致性
为了满足用户对一趟列车不同站点不同座位类型的余量查询需求,我们采取了一种优化方案。。然而,在用户创建订单并完成支付时,我们需要同时从数据库和缓存中扣减相应的列车站点余票。这种设计不仅提高了查询效率,也保证了数据的一致性,确保订单操作的准确性。在这个业务场景中的缓存与数据库一致性如何保证?原创 2024-02-24 16:00:21 · 897 阅读 · 0 评论 -
面试专栏:分布式锁
这一版的代码相当于我们添加锁标志位时,同时为每个客户端设置了 uuid 作为锁标志位的 val,解锁时需要判断锁的 val 是否和自己客户端的相同,辨别成功才会释放锁。如果线上真的发生上述问题,就可能会造成线上数据和业务的运行异常,更甚者可能存在线程一将线程二的锁释放掉之后,线程三获取到锁,然后线程二执行完将线程三的锁释放。就出现了,它的作用就是 线程1 业务还没有执行完,时间就过了,线程1 还想持有锁的话,就会启动一个watch dog后台线程,不断的延长锁key的生存时间。原创 2024-02-23 08:02:16 · 906 阅读 · 0 评论 -
面试专栏:Redis缓存问题简答
Redis中的缓存击穿、缓存穿透和缓存雪崩是三种不同的缓存问题:缓存击穿:缓存穿透:缓存雪崩:原创 2023-11-27 19:49:46 · 320 阅读 · 0 评论 -
面试专栏:Redis解决秒杀问题
用Redis实现商品秒杀业务的基本思路是利用Redis的高性能和原子操作特性来处理高并发的请求。:如果需要处理用户取消订单或支付超时的情况,可以相应地增加Redis中的库存。:秒杀成功后,可以将成功的记录异步地写入数据库,进行持久化存储。操作是原子的,它可以保证即使在高并发环境下也不会发生超卖现象。:在秒杀开始前,将商品的库存数量预加载到Redis中。:当用户尝试秒杀时,使用Redis的原子减操作(如。原创 2023-11-27 19:17:21 · 368 阅读 · 0 评论 -
面试专栏:缓存与数据库一致性
缓存和数据库的一致性问题指的是在使用缓存来提高数据读取性能的同时,确保缓存中的数据反映了数据库中的最新状态。原创 2023-11-27 11:28:50 · 294 阅读 · 0 评论 -
面试专栏:Redisson和RedLock实现分布式锁
底层原理:加锁解锁步骤:Redisson的“看门狗”(Watchdog)机制是指在Redisson的分布式锁实现中,用于防止客户端在持有锁的过程中由于各种原因(如崩溃或网络问题)而无法正常释放锁,导致其他客户端无法获取锁的情况。自动续租:故障检测:默认行为:底层原理:加锁解锁步骤:RedLock算法本身并不提供内置的“看门狗”机制。RedLock的主要策略是在多个独立的Redis实例上实现锁,以提高容错性和安全性。在RedLock算法中,客户端负责锁的获取和释放,以及处理锁的续租。 总体来说,Redisso原创 2023-11-26 15:31:06 · 401 阅读 · 0 评论 -
面试专栏:一致性哈希简述
一致性哈希(Consistent Hashing)是一种分布式哈希方案,广泛用于分布式系统中以提高可扩展性和负载均衡。一致性哈希最初是为了解决网络服务中的缓存命中率问题而提出的,后来在许多其他领域,如分布式存储、负载均衡等也得到了广泛应用。原创 2023-11-25 08:14:19 · 346 阅读 · 0 评论 -
面试专栏:Redis事务简述
Redis事务是一种将多个命令打包然后顺序执行的机制。它通过一系列命令(MULTIEXECDISCARDWATCH)来实现,但与传统的数据库事务有一些显著的不同之处。原创 2023-11-25 08:09:45 · 340 阅读 · 0 评论 -
面试专栏:redis的Lua脚本
Redis的Lua脚本是一种强大的功能,允许在Redis服务器上执行复杂的操作。Lua是一种轻量级的编程语言,适用于嵌入到其他应用程序中。在Redis中,Lua脚本用于处理需要多个命令并且希望在单个操作中执行的场景,这对于维护事务的一致性和原子性非常有用。原创 2023-11-25 08:06:21 · 355 阅读 · 0 评论 -
面试专栏:redis数据类型
字符串(String):哈希表(Hash):列表(List):集合(Set):有序集合(Sorted Set):位图(Bitmap):HyperLogLog:地理空间索引(GeoSpatial):Stream:原创 2023-11-24 16:23:59 · 357 阅读 · 0 评论 -
面试专栏:bitmap处理大量手机号专题
使用 Bitmap 是一种有效的方法来处理大量数据的手机号查询问题,特别是当你需要进行快速的集合运算,比如并集、交集和差集操作时。Bitmap 是一种内存效率高、执行速度快的数据结构,通常用于处理大规模数据的布尔值集合。总的来说,Bitmap 是一种强大的工具,特别适用于处理大规模数据集合的存在性和集合运算问题。:Bitmap 需要足够大的内存来存储位数组,因此在处理大规模数据时可能需要大量内存。:Bitmap 适用于整数范围的数据集合,如果要处理非整数数据,需要进行合适的映射。原创 2023-11-24 14:44:41 · 489 阅读 · 0 评论 -
Redis大key优化专题
即通过hash的方式来存储每一天用户订单次数。那么key = order_20181010, field = order_id, value = 10。那么如果一天有百万千万甚至上亿订单的时候,key后面的值是很多,存储空间也很大,造成所谓的大key。Redis大key会对Redis的性能、稳定性、可靠性和数据备份与恢复产生不良影响,因此需要采取相应的措施来避免和解决Redis大key问题。原创 2023-10-15 09:32:46 · 45 阅读 · 0 评论 -
RedLock专题
在Redis的分布式环境中,我们假设有N个Redis Master。这些节点。原创 2023-10-15 06:59:10 · 25 阅读 · 0 评论 -
Redis Stream专题
最近在看redis这方面的知识,发现在redis5中产生了一种新的数据类型Stream,它和kafka的设计有些类似,可以当作一个简单的消息队列来使用。转载 2023-10-12 10:44:20 · 24 阅读 · 0 评论 -
RedissonLock专题
当我们在设计分布式锁的时候,我们应该考虑分布式锁至少要满足的一些条件,同时考虑如何高效的设计分布式锁,这里我认为以下几点是必须要考虑的。原创 2023-10-12 10:40:18 · 27 阅读 · 0 评论 -
I/O多路复用专题
IO 多路复用是一种同步IO模型,实现一个线程可以监视多个文件句柄;一旦某个文件句柄就绪,就能够通知应用程序进行相应的读写操作;没有文件句柄就绪就会阻塞应用程序,交出CPU。多路是指网络连接,复用指的是同一个线程。转载 2023-09-27 16:03:01 · 33 阅读 · 0 评论 -
Redis集群通信专题
跟集中式不同,不是将集群元数据(节点信息,故障,等等)集中存储在某个节点上,而是互相之间不断通信,保持整个集群所有节点的数据是完整的。 维护集群的元数据常用两种方法,一种是集中式,另一种叫做gossip。 集中式:好处在于,元数据的更新和读取,时效性非常好,一旦元数据出现了变更,立即就更新到集中式的存储中,其他节点读取的时候立即就可以感知到;不好在于,所有的元数据的跟新压力全部集中在一个地方,可能会导致元数据的存储有压力。转载 2023-09-26 08:33:46 · 194 阅读 · 0 评论 -
一致性哈希专题
随着业务的扩展,流量的剧增,单体项目逐渐划分为分布式系统。对于经常使用的数据,我们可以使用Redis作为缓存机制,减少数据层的压力。因此,重构后的系统架构如下图所示:优化最简单的策略就是,例如,有三台Redis,对于每次的访问都可以通过计算hash来求得hash值。如公式 h=hash(key)%3,我们把Redis编号设置成0,1,2来保存对应hash计算出来的值,h的值等于Redis对应的编号。但是hash算法也会面临容错性和扩展性的问题。容错性是指当系统中的某个服务出现问题时,不能影响其他系统。转载 2023-09-26 08:21:35 · 31 阅读 · 0 评论 -
Redis整数集合专题
而我们的整数集合(intset)可以做到使用较少的内存空间却达到和字典一样效率的实现,但也是前提的,集合中只能包含整型数据并且数量不能太多。整数集合最多能存多少个元素在 redis 中也是有体现的。也就是超过 512 个元素,或者向集合中添加了字符串或其他数据结构,redis 会将整数集合向字典结构进行转换。转载 2023-09-25 13:27:11 · 17 阅读 · 0 评论 -
Redis压缩列表专题
ziplist 为了节省内存,采用了紧凑的连续存储。所以在修改操作下并不能像一般的链表那么容易,需要从新分配新的内存,然后复制到新的空间。ziplist 是一个双向链表,可以在时间复杂度为O(1)从下头部、尾部进行pop或push。可能会出现连锁更新现象。其实使用中并没有直接操作这种数据结构,但是可以设置何种情况下使用它。可以在 Redis 的配置文件中进行设置。hash-max-ziplist-entries:hash 类型元素数量超过指定数据后时候。使用 hash 存储, 否则使用压缩表。转载 2023-09-25 10:30:17 · 19 阅读 · 0 评论 -
跳表数据结构专题
跳表的空间复杂度分析并不难,如果一个链表有 n 个结点,如果每两个结点抽取出一个结点建立索引的话,那么第一级索引的结点数大约就是 n/2,第二级索引的结点数大约为 n/4,以此类推第 m 级索引的节点数大约为 n/(2^m),我们可以看出来这是一个等比数列。当然,因为我们举的这个例子数据量很小,所以效率提升的不是特别明显,如果数据量非常大的时候,我们多建立几层索引,效率提升的将会非常的明显,感兴趣的可以自己试一下,这里我们就不举例子了。前面我们已经讲过了,链表的查询的时间复杂度为 O(n),那跳表的呢?转载 2023-09-25 08:13:07 · 22 阅读 · 0 评论 -
Redis SDS专题
当 SDS 字符串缩短时, 空余出来的空间并不会直接释放,而是会被保留,等待下次再次使用,字符串缩短操作需要更新 sdshdr 头中的 Len 字段以及alloced buffer中的\0字符的位置,如下源码截图,在更新字符串长度的过程中并没有涉及到内存的重分配策略,只是简单的修改sdshdr 头中的 Len 字段。从上面 SDS 的结构可以看出,SDS 除了存储 String 的内容外,还需要额外的内存空间记录数据长度、空间使用等信息,这个就导致了 SDS 的一个比较大的缺点:占内存。转载 2023-09-25 07:59:43 · 32 阅读 · 0 评论 -
Redis Rehash专题
(1)删除和查找:在进行渐进式rehash的过程中,字典会同时使用ht[0]和ht[1]两个哈希表,所以在渐进式rehash进行期间,字典的删除、查找、更新等操作会在两个哈希表上进行。比如说,要在字典里面查找一个键的话,程序会先在ht[0]里面进行查找,如果没找到的话,就会继续到ht[1]里面进行查找,诸如此类。(2)新增数据:在渐进式 rehash 执行期间,新添加到字典的键值对一律会被保存到ht[1]里面,而ht[0]则不再进行任何添加操作。转载 2023-09-24 23:19:29 · 29 阅读 · 0 评论 -
Redis数据类型底层专题(2)
跳跃表(skiplist)是一种有序数据结构,它通过在每个节点中维持多个指向其他节点的指针,从而达到快速查找访问节点的目的。3、分值和成员:跳跃表中的所有节点都按分值从小到大排序(按照这个进行排序的,也就是平衡二叉树(搜索树的)的节点大小)。当一个列表键只有少量列表项,并且每个列表项要么就是小整数,要么就是长度比较短的字符串,那么Redis 就会使用压缩列表来做列表键的底层实现。在同一个跳跃表中,多个节点可以包含相同的分值,但每个节点的对象必须是唯一的。每个跳跃表节点的层高都是1至32之间的随机数。原创 2023-09-21 11:04:32 · 26 阅读 · 0 评论 -
Redis数据类型底层专题(1)
(1)读写性能高--100000次/s以上的读速度,80000次/s以上的写速度;(2)K-V,value支持的数据类型很多:字符串(String),队列(List),哈希(Hash),集合(Sets),有序集合(Sorted Sets)5种不同的数据类型。(3)原子性,Redis的所有操作都是单线程原子性的。(4)特性丰富--支持订阅-发布模式,通知、设置key过期等特性。(5)在Redis3.0 版本引入了Redis集群,可用于分布式部署。Redis是由C语言编写的。原创 2023-09-21 10:59:50 · 44 阅读 · 0 评论 -
Reactor模型专题
Reactor 模型其核心是围绕事件驱动模型一方面监听并处理IO事件。另一方面将这些处理好的事件分发业务线程处理。而几种 Reactor 模型的演进,不过是在这几个阶段中优化升级、层层递进。我们再重点回顾多线程模式(多线程模式和主从多线程模式将负责数据传输处理的 IOHandler 处理器的执行放入独立的线程池中。这样,业务处理线程与负责新连接监听的反应器线程就能相互隔离,避免服务器的连接监听受到阻塞。如果服务器为多核的 CPU,可以将反应器线程拆分为多个子反应器(SubReactor)线程;原创 2023-09-20 09:45:11 · 29 阅读 · 0 评论 -
RedLock专题
在Redis的分布式环境中,我们假设有N个Redis Master。这些节点完全互相独立,不存在主从复制或者其他集群协调机制(这句话非常重要,如果没有理解这句话,也就无法理解RedLock。并且由这句话我们可以得出,RedLock依赖的环境不能是一个由N主N从组成的Cluster集群模式,因为Cluster模式下的各个Master并不完全独立,而是存在Gossip协调机制的)。接下来,我们假设有3个完全相互独立的Redis Master单机节点,所以我们需要在3台机器上面运行这些实例。原创 2023-09-04 16:17:08 · 26 阅读 · 0 评论 -
Redisson专题
Redisson的宗旨是促进使用者对Redis的关注分离(Separation of Concern),从而让使用者能够将精力更集中地放在处理业务逻辑上。但是两者也都点到为止,只给了你操作Redis数据库的脚手架,而Redisson则是基于Redis、Lua和Netty建立起了成熟的分布式解决方案,甚至redis官方都推荐的一种工具集。一个基于Redis实现的分布式工具,有基本分布式对象和高级又抽象的分布式服务,为每个试图再造分布式轮子的程序员带来了大部分分布式问题的解决办法。原创 2023-09-04 16:11:55 · 21 阅读 · 0 评论 -
Redis分布式锁专题
redLock算法虽然是需要多个实例,但是这些实例都是独自部署的,没有主从关系。RedLock作者指出,之所以要用独立的,是避免了redis异步复制造成的锁丢失,比如:主节点没来的及把。版本,并且官网(set命令页),也早早就说明了“SETNX, SETEX, PSETEX可能在未来的版本中,会弃用并。锁只是它的冰山一角,并且从它的wiki页面看到,对主从,哨兵,集群等模式都支持,当然了,单节点模式肯定是支持的。这只是举个例子,实际上并不应该等每个节点那么长时间,就像官网所说的那样,假设有效期是10。原创 2023-08-26 17:51:56 · 34 阅读 · 0 评论 -
Redis作消息队列专题
是指利用的进行与平台无关的,并基于来进行分布式系统的集成。通过提供和模型,它可以在下提供等等功能,其作为中的一个重要组件,有着举足轻重的地位。原创 2023-08-26 17:00:54 · 49 阅读 · 0 评论 -
布隆过滤器专题
把要查询的值先过布隆过滤器,判断是否存在,存在就走redis缓存,不存在就直接返回,并且配合缓存空值,可以有效解决缓存穿透问题,虽然存在一定误差,但是在业务范围内允许接受。误判率是指布隆过滤器判断某个值存在,而实际不存在的概率,有概率存在这样的 key,它们内容不同,但多次 Hash 后的 Hash 值都相同。对于布隆过滤器判断不存在的值,则100%不存在,如果这个 key 存在,那它每次 Hash 后对应的 Hash 值位置肯定是 1,而不会是 0。当过滤器说某个元素不存在时,此元素一定不存在。原创 2023-08-19 16:49:48 · 36 阅读 · 0 评论 -
Redis面试相关
去具体节点找key,如果key不在这个节点上,则会返回moved指令,加上新的节点与slot映射关系,客户端同时刷新。,缓存集中失效,无数请求绕开缓存直达数据库。使用zset,member是任务描述,score是执行时间,然后用定时器去扫描,一旦有执行时间小于或等于当前时间的任务,就立刻执行。(2)缓存穿透:查询一条数据库和缓存都没有的数据,就会一直查询数据库,DB压力增大,解决方式:缓存空对象,布隆过滤器。有五种,分别是String,list,hash,set,zset(有序集合)原创 2023-08-09 17:43:37 · 19 阅读 · 0 评论