用高并发技巧解决redis热key问题

这篇文章我将介绍工作中处理热key问题的常用手段,可能介绍的不是很全,毕竟不同的业务场景可能有不同的解决方案,但是相信通过这部分的介绍能提供一个热key问题的思路。

热key问题,简单来说就是对某一资源的访问量过高问题,再简单一点来说就是对某个资源访问的qps过高,而解决访问量高的问题通常我们使用分布式缓存,最常见的就是redis,这个资源对应redis的一个key简称热key。热key在开发中是非常常见的,比如各种app的榜单,活动页面上的一些资源。

虽然redis号称单节点能扛住10Wqps,但是开发中肯定不能这样去估计,毕竟安全第一,比如5000似乎就可能就可以作为上限。如果超过5000该怎么处理呢?下面将提供几种常见的解决方案。

冗余写/随机读

假设在做活动,活动总金额为amount,用户每次完成任务会得到一笔奖金,每天结算一次,在页面会展示剩余金额restAmount。我们将剩余金额存到redis中,{key: pool, value: restAmount}

由于每天统一结算,所以写的qps不会很高,毕竟我们能自己控制流量,比如用户完成后发个延迟结算消息到mq,然后由消费者来处理计算剩余金额最后更新到redis中。

但是在页面的读的qps是很高的。显然奖池pool就是个热key。

既然单节点扛不住,那么显然可以

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 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、付费专栏及课程。

余额充值