Java后端面试题(redis相关2)(day8)

目录

在百万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主从同步机制


步骤如下:(全量-增量)

  1. 从服务器向主服务器发送同步命令 sync
  2. 主服务器接收到 同步命令 后,会执行 bgsave 命令,在后台生成一个 rdb 文件,并使用一个缓冲区记录从现在开始执行的所有写命令;
  3. 当主服务器执行完 bgsave 命令后,主服务器会将 bgsave 命令生成的 rdb 文件发送给从服务器;
  4. 从服务器接收到这个 rdb 文件,然后加载到内存 ;之后主服务器会把刚刚在缓存区的命令同步过来,从服务器就会执行这些命令(两边就一致了,全量)。
  5. 以上处理完之后,之后主数据库每执行一个写命令,都会将写命令发送给从数据库(增量

Redis集群模式有哪些?


Redis提供了多种集群模式以适应不同场景下的 高可用性水平扩展需求 。以下是Redis集群模式:

  1. 主从复制(Master-Slave)模式
    在此模式下,有一个主节点负责处理写入请求,而从节点则复制主节点的数据并提供读取服务。
    • 优点:实现简单,能实现数据冗余,通过读写分离提高系统性能。
    • 缺点:需要手动进行故障转移,无法自动处理主节点故障;不支持自动的数据分区(sharding),难以做到水平扩展。
  2. 哨兵(Sentinel)模式
    Sentinel是Redis提供的一个高可用性解决方案,它能监控主从节点状态,并在主节点出现故障时自动完成故障转移。
    • 优点:解决了主从模式下手动故障转移的问题,提供了自动化监控和故障恢复机制。
    • 缺点:虽然比主从模式增加了自动化,但仍不支持自动的数据分区,且随着节点数量增加,管理和配置的复杂性也会增大。
  3. Redis Cluster模式
    Redis Cluster是官方正式支持的分布式解决方案,它采用了数据分片(sharding)技术,将数据分散在多个节点上。
    • 优点:真正实现了分布式存储,每个节点都可以处理读写请求,具备良好的水平扩展能力;内置了数据自动分割、故障检测与转移功能。
    • 缺点:相比其他模式更复杂,需要更多的网络资源和配置管理;客户端需要支持集群特性;跨slot的数据操作可能涉及多个节点,有一定复杂度。

Redis缓存穿透,缓存击穿,缓存雪崩


  1. 缓存穿透: 缓存和数据库中都不存在要请求的数据 (解决方法:黑名单、布隆过滤器
  2. 缓存击穿:一个或多个热点的key失效了,缓存中没有但数据库中有的数据,这时大量的并发请求直接到达数据库 (解决方法:提前预热
  3. 缓存雪崩:大量key同时失效,查询数据量巨大,引起数据库压力过大甚至down机 (解决方法:避免大量的key同一时间失效,错峰

布隆过滤器


布隆过滤器(Bloom Filter)是一种概率型数据结构,它主要用于检测一个集合中是否包含某个元素,特别适用于大数据量的情况下进行快速查找

布隆过滤器的主要特点包括空间效率高和查询速度快,但也存在一定的误报

布隆过滤器由两个主要部分组成:

  • 位数组:一个很长的二进制向量,初始时所有位都被设为0。
  • 哈希函数:一组独立的哈希函数,用于将元素映射到位数组中的位置

原理:

  • 插入元素

    当一个元素被加入布隆过滤器时,通过多个哈希函数计算该元素对应到位数组中的多个位置,并将这些位置的位设为1。

  • 查询元素

    当查询一个元素是否存在于布隆过滤器时,同样使用相同的哈希函数计算该元素对应到位数组中的位置。

    如果所有这些位置上的位都是1,则认为该元素可能存在于集合中。

    如果任何一个位置上的位是0,则确定该元素不在集合中。

结论:

布隆过滤器说某个元素存在,小概率会误判。布隆过滤器说某个元素不在,那么这个元素一定不在。

数据库和缓存的一致性


当涉及到数据更新:数据库和缓存更新,就容易出现缓存(Redis)和数据库(MySQL)间的数据一致性问题。

常见更新策略

  1. 先删缓存,再更新数据库
  2. 先更新数据库,再删除缓存
  3. 普通双删: 删缓存->更新数据库->再删除缓存
  4. 延迟双删: 删缓存->更新数据库->延迟3-5秒再删除缓存

不管是先写MySQL数据库,再删除Redis缓存;还是先删除缓存,再写库,都有可能出现数据不一致的情况

相关推荐
笑鸿的学习笔记23 分钟前
工具笔记之生成图表和可视化的标记语言Mermaid
笔记
大霞上仙43 分钟前
jmeter学习(7)beanshell
学习·jmeter
大霞上仙44 分钟前
jmeter学习(1)线程组与发送请求
java·学习·jmeter
望森FPGA1 小时前
HDLBits中文版,标准参考答案 |2.5 More Verilog Features | 更多Verilog 要点
学习·fpga开发
kissSimple1 小时前
UE行为树编辑器图文笔记
笔记·ue5·编辑器·unreal engine·unreal engine 5
l1x1n01 小时前
DOS 命令学习笔记
笔记·学习·web安全
qq_51583806 彩雷王1 小时前
1004-05,使用workflow对象创建http任务,redis任务
redis·网络协议·http
winds~2 小时前
自动驾驶-问题笔记-待解决
人工智能·笔记·自动驾驶
Wang's Blog2 小时前
Redis: Sentinel节点管理,故障迁移一致性以及TILT模式
redis·sentinel
道爷我悟了2 小时前
Vue入门-指令学习-v-on
javascript·vue.js·学习