目录
- 在百万keys的Redis里面,如何模糊查找某几个key?
- [Redis 数据类型的使用场景](#Redis 数据类型的使用场景)
- Redis主从同步机制
- Redis集群模式有哪些?
- Redis缓存穿透,缓存击穿,缓存雪崩
- 布隆过滤器
- 数据库和缓存的一致性
在百万keys的Redis里面,如何模糊查找某几个key?
在 Redis 中进行模糊查找 keys
通常使用 KEYS
命令或者 SCAN
命令配合模式匹配。
但是需要注意的是,KEYS
命令在大数据量的情况下可能会导致性能问题,因为它会阻塞服务器并消耗大量资源。
因此,在生产环境中,推荐使用 SCAN
命令来实现类似的功能
SCAN
命令并不能保证每次返回相同数量的 keys
,它只是尽量接近 COUNT
参数指定的数量。
Redis 数据类型的使用场景
数据类型 | 使用场景 |
---|---|
String | Session会话 |
String | 业务缓存 |
String | 分布式锁 |
Int | 计数器 |
Int | 限流 |
Int | 全局唯一Id |
Hash | 电商购物车 |
Bitmap | 用户签到 |
List | 消息队列 |
ZSet | 排行榜 |
Redis主从同步机制
步骤如下:(全量-增量)
- 从服务器向主服务器发送同步命令
sync
; - 主服务器接收到 同步命令 后,会执行
bgsave
命令,在后台生成一个rdb
文件,并使用一个缓冲区记录从现在开始执行的所有写命令; - 当主服务器执行完
bgsave
命令后,主服务器会将bgsave
命令生成的rdb
文件发送给从服务器; - 从服务器接收到这个
rdb
文件,然后加载到内存 ;之后主服务器会把刚刚在缓存区的命令同步过来,从服务器就会执行这些命令(两边就一致了,全量)。 - 以上处理完之后,之后主数据库每执行一个写命令,都会将写命令发送给从数据库(增量)
Redis集群模式有哪些?
Redis提供了多种集群模式以适应不同场景下的 高可用性 和 水平扩展需求 。以下是Redis集群模式:
- 主从复制(Master-Slave)模式 :
在此模式下,有一个主节点负责处理写入请求,而从节点则复制主节点的数据并提供读取服务。- 优点:实现简单,能实现数据冗余,通过读写分离提高系统性能。
- 缺点:需要手动进行故障转移,无法自动处理主节点故障;不支持自动的数据分区(sharding),难以做到水平扩展。
- 哨兵(Sentinel)模式 :
Sentinel是Redis提供的一个高可用性解决方案,它能监控主从节点状态,并在主节点出现故障时自动完成故障转移。- 优点:解决了主从模式下手动故障转移的问题,提供了自动化监控和故障恢复机制。
- 缺点:虽然比主从模式增加了自动化,但仍不支持自动的数据分区,且随着节点数量增加,管理和配置的复杂性也会增大。
- Redis Cluster模式 :
Redis Cluster是官方正式支持的分布式解决方案,它采用了数据分片(sharding)技术,将数据分散在多个节点上。- 优点:真正实现了分布式存储,每个节点都可以处理读写请求,具备良好的水平扩展能力;内置了数据自动分割、故障检测与转移功能。
- 缺点:相比其他模式更复杂,需要更多的网络资源和配置管理;客户端需要支持集群特性;跨slot的数据操作可能涉及多个节点,有一定复杂度。
Redis缓存穿透,缓存击穿,缓存雪崩
- 缓存穿透: 缓存和数据库中都不存在要请求的数据 (解决方法:黑名单、布隆过滤器)
- 缓存击穿:一个或多个热点的key失效了,缓存中没有但数据库中有的数据,这时大量的并发请求直接到达数据库 (解决方法:提前预热)
- 缓存雪崩:大量key同时失效,查询数据量巨大,引起数据库压力过大甚至down机 (解决方法:避免大量的key同一时间失效,错峰)
布隆过滤器
布隆过滤器(Bloom Filter)是一种概率型数据结构,它主要用于检测一个集合中是否包含某个元素,特别适用于大数据量的情况下进行快速查找。
布隆过滤器的主要特点包括空间效率高和查询速度快,但也存在一定的误报
布隆过滤器由两个主要部分组成:
- 位数组:一个很长的二进制向量,初始时所有位都被设为0。
- 哈希函数:一组独立的哈希函数,用于将元素映射到位数组中的位置
原理:
-
插入元素:
当一个元素被加入布隆过滤器时,通过多个哈希函数计算该元素对应到位数组中的多个位置,并将这些位置的位设为1。
-
查询元素:
当查询一个元素是否存在于布隆过滤器时,同样使用相同的哈希函数计算该元素对应到位数组中的位置。
如果所有这些位置上的位都是1,则认为该元素可能存在于集合中。
如果任何一个位置上的位是0,则确定该元素不在集合中。
结论:
布隆过滤器说某个元素存在,小概率会误判。布隆过滤器说某个元素不在,那么这个元素一定不在。
数据库和缓存的一致性
当涉及到数据更新:数据库和缓存更新,就容易出现缓存(Redis)和数据库(MySQL)间的数据一致性问题。
常见更新策略:
- 先删缓存,再更新数据库
- 先更新数据库,再删除缓存
- 普通双删: 删缓存->更新数据库->再删除缓存
- 延迟双删: 删缓存->更新数据库->延迟3-5秒再删除缓存
不管是先写MySQL数据库,再删除Redis缓存;还是先删除缓存,再写库,都有可能出现数据不一致的情况