当前位置: 首页 > news >正文

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

目录

  • 在百万keys的Redis里面,如何模糊查找某几个key?
  • Redis 数据类型的使用场景
  • Redis主从同步机制
  • Redis集群模式有哪些?
  • Redis缓存穿透,缓存击穿,缓存雪崩
  • 布隆过滤器
  • 数据库和缓存的一致性

在百万keys的Redis里面,如何模糊查找某几个key?


在 Redis 中进行模糊查找 keys 通常使用 KEYS 命令或者 SCAN 命令配合模式匹配。

但是需要注意的是,KEYS 命令在大数据量的情况下可能会导致性能问题,因为它会阻塞服务器并消耗大量资源

因此,在生产环境中,推荐使用 SCAN 命令来实现类似的功能

SCAN 命令并不能保证每次返回相同数量的 keys,它只是尽量接近 COUNT 参数指定的数量。

Redis 数据类型的使用场景

数据类型使用场景
StringSession会话
业务缓存
分布式锁
计数器
限流
全局唯一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缓存;还是先删除缓存,再写库,都有可能出现数据不一致的情况

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Linux---系统安全
  • 【博主推荐】HTML5新闻,博客,官网网站源码文章瀑布流+详情页面
  • Kotlin IntelliJ IDEA 环境搭建
  • Unity | AmplifyShaderEditor插件基础(第二集:模版说明)
  • VSCode 都有哪些值得推荐的插件
  • RxJava在Android中的应用
  • dataX从orcal数据库抽取数据插入gbase 8a数据库 与 OceanBase数据库
  • MySQL-MVCC举例说明
  • 单库平滑迁移至分库分表架构方案
  • 数字营销中的人工智能 --- 完整指南 (By Hubspot)
  • 从0开始搭建vue + flask 旅游景点数据分析系统(九):旅游景点管理之增删改查
  • @Async 异步注解使用
  • 基于YOLOv10深度学习的草莓成熟度检测与识别系统【python源码+Pyqt5界面+数据集+训练代码】目标检测、人工智能
  • C# VideoCapture 多路视频播放
  • uniapp粘贴板地址识别 address-parse插件的使用
  • Apache的基本使用
  • css布局,左右固定中间自适应实现
  • flask接收请求并推入栈
  • HTML5新特性总结
  • magento 货币换算
  • Promise面试题2实现异步串行执行
  • python 学习笔记 - Queue Pipes,进程间通讯
  • Redis 中的布隆过滤器
  • Shadow DOM 内部构造及如何构建独立组件
  • Spring Cloud(3) - 服务治理: Spring Cloud Eureka
  • 闭包,sync使用细节
  • 给初学者:JavaScript 中数组操作注意点
  • 利用jquery编写加法运算验证码
  • 面试题:给你个id,去拿到name,多叉树遍历
  • 如何胜任知名企业的商业数据分析师?
  • 什么是Javascript函数节流?
  • 消息队列系列二(IOT中消息队列的应用)
  • 学习笔记TF060:图像语音结合,看图说话
  • PostgreSQL 快速给指定表每个字段创建索引 - 1
  • ​ 全球云科技基础设施:亚马逊云科技的海外服务器网络如何演进
  • # SpringBoot 如何让指定的Bean先加载
  • # Swust 12th acm 邀请赛# [ A ] A+B problem [题解]
  • #Ubuntu(修改root信息)
  • (1)(1.8) MSP(MultiWii 串行协议)(4.1 版)
  • (4)通过调用hadoop的java api实现本地文件上传到hadoop文件系统上
  • (Redis使用系列) SpringBoot 中对应2.0.x版本的Redis配置 一
  • (二)c52学习之旅-简单了解单片机
  • (淘宝无限适配)手机端rem布局详解(转载非原创)
  • .NET 4 并行(多核)“.NET研究”编程系列之二 从Task开始
  • .net 7和core版 SignalR
  • .net framework 4.0中如何 输出 form 的name属性。
  • .net 无限分类
  • .net6 webapi log4net完整配置使用流程
  • .NET企业级应用架构设计系列之技术选型
  • .Net通用分页类(存储过程分页版,可以选择页码的显示样式,且有中英选择)
  • .考试倒计时43天!来提分啦!
  • @ModelAttribute注解使用
  • [ 蓝桥杯Web真题 ]-Markdown 文档解析
  • [CF494C]Helping People
  • [CF543A]/[CF544C]Writing Code