热Key问题简介以及解决方案(一看就会,简单,明了)

1.前言

现在大多数互联网系统都用到了缓存Redis,的确Redis很好用,很多时候可以避免流量直接打到数据库,且最高QPS也能支持10S以上,但是随着时代变迁,系统经受了越来越大的挑战,Redis集群的抗并发能力的确很强,但是如果只是一个单一的key,所有请求都请求的话,那很可能包含这台key的物理机会无法承受这么高流量的冲击,导致宕机,这也就是我们说的热key问题。

2.解决方案

对于热key的问题我们首先就是要将他的流量分散开,通过多个点去分担机器的压力,作为基本思路。

  • 方案1:JVM缓存吗,也叫本地缓存。

  • 这样的一个集群内所有机器都可以去分担这个流量,假设有200台机器,那么每台机器都可以去做一个本地缓存,每个请求进来后,每台机器如果有本地缓存的话,就可以不用走到redis中,从而可以直接获得结果,至于本地缓存方法很多,晚上捞一个就可以了。

  • 方案2:随机的Redis Key 。

  • 比如通过得知Redis集群的分片数量,去设置这个key值,例如key+N,每次N为0-N的一个随机数,每个key内存的值都是一样的,只是变成了多个key,请求进来的时候,也是通过随机后的key去缓存内取,这样可以将redis集群的key分散到不同的机器上,不至于让单一一个物理机宕机。

3.注意事项

由于缓存与缓存之间没有及时同步,建议放的内容短期内变化不要太大且过期时间设置短一些,这样如果对于不同用户的页面展示也要有好一些。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在分布式系统中,多个节点可能同时尝试修改同一个 key 的值,这导致数据的不一致性和冲突。Redis 通过使用乐观锁来解决这个问题。 乐观锁是一种基于版本号的锁机制。当一个节点要修改某个 key 的值时,它先读取该 key 的版本号,然后修改该 key 的值,并把版本号加一。如果在这个过程中,其他节点也尝试修改该 key 的值,它们也先读取该 key 的版本号,然后尝试修改该 key 的值,但是由于版本号已经被修改了,它们的修改请求就被拒绝。这样就保证了同一时间只有一个节点能够修改该 key 的值,避免了数据的冲突和不一致性。 在 Redis 中,可以使用 WATCH 和 MULTI 命令来实现乐观锁。WATCH 命令监视一个或多个 key,如果这些 key 在执行 MULTI 命令之前被修改了,那么 EXEC 命令就失败。这时候应该重新执行整个事务。 示例代码: ``` WATCH key val = GET key val = val + 1 MULTI SET key val EXEC ``` 在这个代码中,我们先使用 WATCH 命令监视 key。然后使用 GET 命令获取 key 的值,执行逻辑处理后,再使用 MULTI 命令开启一个事务,将修改后的值设置回 key 中。如果在这个过程中,其他节点修改了 key 的值,那么 EXEC 命令就失败,这时候应该重新执行整个事务。 除了乐观锁外,Redis 还支持悲观锁,可以使用 SETNX 和 GETSET 命令来实现。SETNX 命令可以原子性地设置一个 key 的值,只有当该 key 不存在时才执行设置操作。GETSET 命令可以原子性地获取一个 key 的值,并设置一个新的值。这两个命令都可以用来实现悲观锁。但是,悲观锁带来更多的性能开销,因为它需要不断地检查锁是否被占用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值