一、redis特性
1、内存数据快,快,很快...
2、工作单线程worker,串行化、原子操作,(IO线程是多线程)- 避免上下文切换
3、IO模型(epoll), 天生支撑高并发
4、kv模型,v具有类型结构
5、具有本地方法,计算向数据移动。(a,b) => 交集
6、 二进制安全,Value最大512M
二、Redis是单线程还是多线程
6.0之前是单线程(IO线程、工作线程、单线程)
6.0之后是多线程:6.0之后IO线程起一个线程池专门处理IO流的操作(读、写),但真正计算的还是工作线程{好处:避免了上下文的切换,减少冲突}
三、Redis 的持久化机制
1、RDB(Redis DataBase)
将数据集中写入磁盘中,也称快照,数据恢复是将快照中的文件直接读取到内存中
单独创建子线程进行持久化,将数据写入一个临时文件中
RDB触发模式:
手动触发:通过手动生成快照
自动触发:通过配置参数的设置触发自动生成快照
优点:1、恢复数据比较快
2、备份的文件就是原始内存数据大小,不会额外增加数据占用
缺点:1、快照恢复有间隔,不能进行实时备份,丢失的数据会比较多
2、开启子线程备份数据,在数据集比较庞大时,fork() 可能会非常耗时,造成服务器在一定时间内停止处理客户端
2、AOF(Append Only File)
客户端写操作命令以日志的方式记录下来
在redis服务器重启时,会加载aof文件中的所有命令,达到数据恢复的目的
AOF触发模式:
手动触发:通过 bgrewriteAOF 命令,重新AOF持久化生成aof文件(触发重写)
自动触发:默认情况下是没有开启AOF(默认使用RDB持久化),需要通过配置文件开启
优点:1、 数据安全性高,不易丢数据
2、AOF文件有序保存了所有写操作,可读性强
缺点:1、AOF方式生成文件体积变大
2、 数据恢复速度比RDB慢
四、在百万keys的Redis里面,如何模糊查找某个(几个)key
可以使用 KEYS
命令或 SCAN
命令配合 MATCH
参数。
KEYS
:是查找所有的 key, 在大型数据集上可能会导致性能问题,因为它查 找某一个 key 时是对全表进行扫描,会阻塞 Redis服务器并可能消耗大量资源 ,尤其是在高并发环境中
SCAN
是通过迭代的方式逐步扫描数据库中的 key,每次只查一部分结果,如果查一部分数据里面没有想要的结果,再接着 cursos (游标)返回的值接着往下查,直到 cursos 返回的结果为 0
五、Redis 的数据类型和它的应用场景
六、Redis 缓存穿透、缓存击穿、缓存雪崩的区别和解决方案
缓存穿透:两边的数据都不存在, (使用布隆过滤器来判断某个数据是否存在,如果布隆过滤器判定数据不存在,则直接返回,不再查询数据库)(黑名单)【如果存在,不一定存在。如果不存在,一定不存在】
缓存击穿:一个或多个热点的key失效了(Redis 有,数据库没有),这时大量的并发请求直接到达数据库。 (提前预热)
缓存雪崩: 指在某一时刻,大量key同时失效,导致大量请求到达数据库,数据库压力骤增。 (错峰)
七、Redis 过期键的删除策略
1、惰性删除:放任键过期不管,但是每次从键空间中获取键时,都检查取得的键是否过期,如果过期的话,就删除该键;如果没有过期,就返回该键。
2、定期删除:每隔一段时间程序就对数据库进行一次检查,删除里面的过期键。至于要删除多少过期键,以及要检查多少个数据库,则由算法决定。
八、Redis 的内存删除策略有哪些
八种淘汰策略
LRU:淘汰最近最少使用的
LFU:淘汰一直使用最少的
淘汰策略名称 | 策略含义 | 白话说法 | |
默认策略 | noeviction 【ɪˈvɪkʃn】:驱逐;驱赶 | 不淘汰数据:写不进去返回错误 | 不删除任意数据,这时如果内存不够时,会直接返回错误。 |
只针对过期的 keys | volatile-lru | 根据 LRU 算法挑选数据淘汰 | 从设置了过期时间的数据集中,选择最近最久未使用的数据释放 |
volatile-lfu | 根据 LFU 算法挑选数据淘汰(4.0及以上用) | 淘汰掉设置了过期时间的key过去被访问次数最少的数据 | |
volatile-random | 随机挑选数据淘汰 | 从设置了过期时间的数据集中,随机挑选数据进行淘汰 | |
volatile-ttl | 挑选越早过期的数据进行删除 | 从设置了过期时间的数据集中,选择马上就要过期的数据进行释放操作 | |
所有keys | allkeys-lru | 根据 LRU 算法挑选数据淘汰 | 从数据集中(包括设置过期时间以及未设置过期时间的数据集中),选择最近最久未使用的数据释放 |
allkeys-random | 随机挑选数据淘汰 | 随机选择一个数据进行释放; | |
allkeys-lfu | LFU 算法挑选数据淘汰(4.0及以上版本可用) | 淘汰掉过去被访问次数最少的一条数据 |
九、Redis 的主从同步机制
步骤如下:(全量-增量)
1、从服务器向主服务器发送同步命令 sync;
2、主服务器接收到同步命令后,会执行 bgsave(后台进程) 命令,在后台生成一个 rdb 文件,并使用一个缓冲区记录从现在开始执行的所有写命令;
3、当主服务器执行完 bgsave 命令后,主服务器会将 bgsave 命令生成的 rdb 文件发送给从服务器;
4、从服务器接收到这个 rdb 文件,然后加载到内存 ;之后主服务器会把刚刚在缓存区的命令同步过来,从服务器就会执行这些命名。(两边就一致了)
5、以上处理完之后,之后主数据库每执行一个写命令,都会将写命令发送给从服务器。
十、如何保证 Redis 和 mysql 数据库数据保持一致性
延迟双删、Canal
延迟双删:在请求数据时线程先删除缓存-->再更新数据库(这时数据库中的数据就是新数据)延迟 3-5 秒 【时间一般要大于SQL执行时间+线程切换执行时间100ms足够】后再删除缓存,这时候的数据就一致了。但不能排除有一些极端情况,在请求查询时事务延迟了 5 秒以上时,缓存的数据还会是会不一致 ,所有延迟双删也不一定能保证缓存及数据一致。
十一、Redis 的集群方式有哪些
- 主从复制(Master-Slave)模式:
-
- 在此模式下,有一个主节点负责处理写入请求,而从节点则复制主节点的数据并提供读取服务。
- 优点:实现简单,能实现数据冗余,通过读写分离提高系统性能。
- 缺点:需要手动进行故障转移,无法自动处理主节点故障;不支持自动的数据分区(sharding),难以做到水平扩展。
- 哨兵(Sentinel)模式:
-
- Sentinel是Redis提供的一个高可用性解决方案,它能监控主从节点状态,并在主节点出现故障时自动完成故障转移。
- 优点:解决了主从模式下手动故障转移的问题,提供了自动化监控和故障恢复机制。【会监控我们所有的节点,如果主服务器挂掉之后它会从从服务器选择一个数据最完整的作为主服务器,】
- 缺点:虽然比主从模式增加了自动化,但仍不支持自动的数据分区,且随着节点数量增加,管理和配置的复杂性也会增大。
- Redis Cluster模式:
-
- Redis Cluster是官方正式支持的分布式解决方案,它采用了数据分片(sharding)技术,将数据分散在多个节点上。
- 优点:真正实现了分布式存储,每个节点都可以处理读写请求,具备良好的水平扩展能力;内置了数据自动分割、故障检测与转移功能。
- 缺点:相比其他模式更复杂,需要更多的网络资源和配置管理;客户端需要支持集群特性;跨slot的数据操作可能涉及多个节点,有一定复杂度。