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缓存;还是先删除缓存,再写库,都有可能出现数据不一致的情况

相关推荐
金星娃儿15 分钟前
MATLAB基础知识笔记——(矩阵的运算)
笔记·matlab·矩阵
一只特立独行的程序猿17 分钟前
关于GCC内联汇编(也可以叫内嵌汇编)的简单学习
汇编·学习·gcc
虾球xz22 分钟前
游戏引擎学习第10天
学习·游戏引擎
Chef_Chen25 分钟前
从0开始学习机器学习--Day25--SVM作业
学习·机器学习·支持向量机
L_cl33 分钟前
Python学习从0到1 day28 Python 高阶技巧 ⑧ 递归
学习
vortex51 小时前
Vim 编辑器学习笔记
学习·编辑器·vim
源于花海1 小时前
论文学习(四) | 基于数据驱动的锂离子电池健康状态估计和剩余使用寿命预测
论文阅读·人工智能·学习·论文笔记
心怀梦想的咸鱼1 小时前
Ue5 umg学习(一)
学习·ue5
楚疏笃1 小时前
鸿蒙学习生态应用开发能力全景图-开发者支持平台(5)
学习·华为·harmonyos
4v1d1 小时前
边缘计算的学习
人工智能·学习·边缘计算