![](https://img-blog.csdnimg.cn/20201014180756926.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Redis
文章平均质量分 79
Redis 相关总结文档
是个小胖墩儿啊
这个作者很懒,什么都没留下…
展开
-
Redis 八股文
什么是 Redis?Redis 是一个高性能的 key-value 数据库,它是完全开源免费的,而且 Redis 是一个 NoSQL 类型数据库,是为了解决高并发、高扩展、大数据存储等一系列的问题而产生的数据库解决方案,是一个非关系型的数据库。Redis 的特点?Redis 本质上是一个 key-value 类型的内存数据库,很像 memcached,整个数据库统统加载在内存当中进行操作,定期通过异步操作把数据库数据 flush 到磁盘上进行保存。因为是纯内存操作,所以 Redis 的性能非常出色,每原创 2022-04-03 15:23:59 · 929 阅读 · 0 评论 -
Redis 夺命十二问
Redis 是单线程还是多线程?Redis 不同版本之间采用的线程模型是不一样的,在 Redis 4.0 版本之前使用的是单线程模型,在 4.0 版本之后增加了多线程的支持。在 4.0 之前虽然我们说 Redis 是单线程,也只是说它的网络 I/O 线程以及 set/get 操作是由一个线程完成的。但是 Redis 的持久化、集群同步还是使用其他线程来完成。4.0 之后添加了多线程的支持,主要是体现在大数据的异步删除功能上,例如 unlink key、flushdb async、flushall as转载 2022-04-04 18:01:48 · 280 阅读 · 0 评论 -
Redis 缓存击穿、缓存穿透、缓存雪崩的产生原因以及解决思路
转自:https://mp.weixin.qq.com/s/c5CMTs0qZS31XBU4oBJniw大家都知道,计算机的瓶颈之一就是 I/O,为了解决内存与磁盘速度不匹配的问题,就产生了缓存,将一些热点数据放在内存中,随用随取,以降低连接到数据库的请求,避免数据库挂掉。需要注意的是,无论是击穿还是后面谈到的穿透与雪崩,都是在高并发的前提下,缓存中的热点 key 失效了。缓存击穿问题起因,有两个主要原因:key 过期;key 被页面置换淘汰。对于第一个原因是因为在 Redis 中,k转载 2022-04-03 16:46:00 · 689 阅读 · 0 评论 -
内存耗尽后,Redis 会发生什么?
转自:https://mp.weixin.qq.com/s/ybO9vku04m3Fp7yYCry5zg前言作为一台服务器来说,内存并不是无限的,所以总会存在内存耗尽的情况,那么当 Redis 服务器的内存耗尽之后,如果继续执行请求命令,Redis 会如何处理呢?内存回收使用 Redis 服务时,很多情况下某些键值对只会在特定的时间内有效,为了防止这种类型的数据一直占有内存,我们可以给键值对设置有效期。Redis 中可以通过 4 个独立的命令来给一个键设置过期时间:expire key ttl转载 2022-04-03 17:39:17 · 829 阅读 · 0 评论 -
Redis 的布隆过滤器与布谷鸟过滤器
转自:https://mp.weixin.qq.com/s/lgP7syTuM-tZRrWm8FW01A大家都知道,我们业务后端涉及数据库,在客户端请求查询某些数据时,可能会先检查缓存中是否有相关信息,有的话则返回;如果没有的话可能就要去数据库里面查询。这时候有一个问题,如果很多请求是在请求数据库中根本不存在的数据,那么数据库就要频繁地响应这种不必要的 I/O 查询,如果请求量再多一些,数据库的大多数 I/O 都在响应这种毫无意义的请求操作。那么如何将这些请求阻挡在外呢?过滤器由此诞生。布隆过滤器布转载 2022-04-04 16:53:21 · 84 阅读 · 0 评论 -
Redis 重写 AOF 日志期间,主进程可以正常处理命令吗?
触发重写机制后,主进程就会创建重写 AOF 的子进程,此时父子进程共享物理内存,重写子进程只会对这个内存进行只读,重写 AOF 子进程会读取数据库里的所有数据,并逐一把内存数据的键值对转换成一条命令,再将命令记录到重写日志(新的 AOF 文件)。简单来说,两者的虚拟空间不同,但其对应的物理空间是同一个。那么问题来了,重写 AOF 日志过程中,如果主进程修改了已经存在的 key-value,就会触发「写时复制」,此时这个 key-value 数据在子进程的内存数据就和在主进程的内存数据不一致了。原创 2023-08-25 17:59:12 · 887 阅读 · 0 评论 -
Redis 执行 RDB 快照期间,主进程可以正常处理命令吗?
所以 Redis 在使用 bgsave 快照过程中,如果主进程修改了内存数据,不管是否是共享的内存数据,RDB 快照都无法写入主进程刚修改的数据,因为此时主进程的内存数据和子进程的内存数据已经分离了,子进程写入到 RDB 文件的内存数据只能是原本的内存数据(快照的定义)。如果主进程执行写操作,则被修改的数据会复制一份副本,然后 bgsave 子进程会把它的副本数据写入 RDB 文件,在这个过程中,主进程仍然可以直接修改原来的数据。注意,只有在发生修改内存数据的情况时,物理内存才会被复制一份。原创 2023-08-25 18:11:08 · 1173 阅读 · 2 评论 -
Redis 的混合持久化
加载完 RDB 的内容后,才会加载后半部分的 AOF 的内容,这里的内容是 Redis 后台子进程重写 AOF 期间,主进程处理的操作命令,可以使得数据更少的丢失。那就将 RDB 和 AOF 混合使用,这个方法是在 Redis 4.0 提出的,即混合使用 AOF 日志和内存快照,也叫混合持久化。简单来说,使用了混合持久化,AOF 文件的前半部分是 RDB 格式的全量数据,后半部分是 AOF 格式的增量数据。这样做的好处在于,重启 Redis 加载数据时,由于前半部分是 RDB 格式,加载的时候速度会很快。原创 2023-08-25 18:18:30 · 689 阅读 · 0 评论 -
Redis 的主从复制、哨兵模式、集群脑裂
等网络恢复后,旧主节点会降级为从节点,再与新主节点进行同步复制时,由于从节点会清空自己的缓冲区,导致之前客户端写入的数据丢失。这时,哨兵也发现主节点失联,它就认为主节点挂了(但实际上主节点还是正常运行,只是网络出问题了),于是哨兵就会在「从节点」中选举出一个新主节点,这时集群就有两个主节点了 —— 脑裂出现了(相当于出现了两个大脑)。选举 leader 的过程其实也是一个投票的过程,在投票开始前,是哪个哨兵节点判断主节点为「客观下线」,这个哨兵节点就是候选者,所谓的候选者,就是想当 leader 的哨兵。原创 2023-08-25 19:03:07 · 828 阅读 · 0 评论 -
数据库与缓存的数据一致性
此外,「先更新数据库,再删除缓存」的方案,由于是两个操作,前面的所有分析都是建立在这两个操作都能同时执行成功的前提下。但是在两个更新请求并发执行的时候,会出现数据不一致的问题,因为更新数据库和更新缓存这两个操作是独立的,而程序又没有对操作做任何并发控制,那么当两个线程并发更新它们的话,就会因为写入顺序的不同,造成数据的不一致。所以,无论是「先更新数据库,再更新缓存」,还是「先更新缓存,再更新数据库」,这两个方案都存在并发问题,当两个请求并发更新同一条数据的时候,可能会出现缓存和数据库中的数据不一致的现象。转载 2023-09-04 11:32:13 · 85 阅读 · 0 评论 -
浅议 Redis 分布式锁
转自:https://mp.weixin.qq.com/s/RnSokJxYxYDeenOP_JE3fQ首先,让我们先思考下这些问题:为什么需要分布式锁?基于 Redis 如何实现一个分布式锁?Redis 分布式锁真的安全吗?Redis 的 Redlock 有什么问题?一定安全吗?业界争论 Redlock,到底在争论什么?哪种观点是对的?分布式锁到底用 Redis 还是 Zookeeper?实现一个有「容错性」的分布式锁,都需要考虑哪些问题?为什么需要分布式锁?在开始讲分布式锁之转载 2022-04-04 22:30:38 · 34 阅读 · 0 评论 -
Redis 的数据结构
转自:https://xiaolincoding.com/redis/data_struct/data_struct.html#%E9%94%AE%E5%80%BC%E5%AF%B9%E6%95%B0%E6%8D%AE%E5%BA%93%E6%98%AF%E6%80%8E%E4%B9%88%E5%AE%9E%E7%8E%B0%E7%9A%84Redis 为什么那么快?除了因为它是内存数据库,所有的操作都在内存上进行之外,还有一个重要因素,就是它实现的数据结构,使得我们在对数据进行增删查改操作时,Re转载 2022-04-05 15:00:33 · 65 阅读 · 0 评论 -
Redis 的限流操作
一、基于 Redis 的 setnx 操作我们在使用 Redis 分布式锁的时候,都知道是依靠了 setnx 的指令,在 CAS(compare and swap)操作的时候,同时给指定的 key 设置了过期时间(expire),我们限流的主要目的就是为了在单位时间内,有且仅有 N 个数量的请求能够访问代码程序。所以依靠 setnx 可以很轻松的做到这方面的功能。比如我们需要在 10 秒内限定 20 个请求,那么我们在 setnx 的时候就可以设置过期时间 10,当请求的 setnx 数量达到 20 时原创 2022-04-03 15:47:43 · 27 阅读 · 0 评论 -
Redis 跳表
跳表(SkipList,全称跳跃表)是用于有序元素序列快速搜索查找的一个数据结构,跳表是一个随机化的数据结构,实质就是一种可以进行二分查找的有序链表。跳表在原有的有序链表上面增加了多级索引,通过索引来实现快速查找。跳表不仅能提高搜索性能,同时也可以提高插入和删除操作的性能。它在性能上和红黑树,AVL树不相上下,但是跳表的原理非常简单,实现也比红黑树简单很多。回顾链表,链表的痛点就是查询很慢很慢!每次查询都是一种O(n)复杂度的操作,下图这是一个带头结点的链表(头结点相当于一个固定的入口,不存储有意义的值)转载 2021-11-21 17:11:05 · 1606 阅读 · 0 评论 -
Redis 分布式锁的实现方式
一般来说,在对数据进行“加锁”时,程序首先需要通过获取(acquire)锁来得到对数据进行排他性访问的能力,然后才能对数据执行一系列操作,最后还要将锁释放(release)给其他程序。对于能够被多个线程访问的共享内存数据结构(shared-memory data structure)来说,这种“先获取锁,然后执行操作,最后释放锁”的动作非常常见。Redis 使用 WATCH 命令来代替对数据进行加锁,因为 WATCH 只会在数据被其他客户端抢先修改了的情况下才通知执行了这个命令的客户端,而不会阻止其他客户原创 2023-08-21 18:12:05 · 250 阅读 · 0 评论 -
Redis 为什么要分 16 个库?
转自:https://mp.weixin.qq.com/s/MX8Nw6a8XQXM5RaQ9wEyEQ在实际的项目中,Redis 常被用作缓存、分布式锁、消息队列等的解决方案。但是在搭建好 Redis 服务后,Redis 默认会创建 16 个数据库(db0~db15),而在 Redis 集群下却只有一个 db0 数据库,如下图所示:Redis 16 个数据库的由来Redis 是一个类似于字典结构的存储服务器,一个 Redis 实例提供了多个用来存储数据的字典,在客户端可以指定将数据存储于哪个字转载 2022-04-03 16:08:04 · 549 阅读 · 0 评论 -
为什么 Redis 集群设计为 16384 个槽?
为什么 Redis 集群设计为 16384 个槽?原创 2022-09-16 12:37:50 · 470 阅读 · 0 评论