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

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


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

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

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

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

Redis 数据类型的使用场景

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

  • 38
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

这河里吗l

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值