当前位置:网站首页>Redis zadd导致的一次线上问题排查和处理
Redis zadd导致的一次线上问题排查和处理
2022-07-02 06:33:00 【程序员柒柒】
背景
最近有用户反馈,主播收了1881数值礼物,头像下数字显示881, 正常来说,应该显示1881的数值。

经过排查,是因为redis zadd在并发情况下导致数据不一致的问题。
问题排查
经过对送礼日志的排查,发现mongodb数据更新正常,但是redis数据异常,查看业务代码后发现了问题。
业务代码如下:

这里的逻辑是先更新 mongodb, 然后对redis数值进行zadd覆盖. 一般情况下没啥问题, 但如果稍微遇到高并发:
- A线程跟B线程同时对mongo进行修改操作, 在数据库层面, B的修改后于A的修改.
- 但在进程中, 线程B先于线程A调用redis修改, 线程A对redis的修改覆盖了B的数值.
- 导致redis中数据维护错误.
问题修复
使用Lua脚本修改redis值,并发情况下不处理覆盖逻辑, 避免旧值覆盖新值,利用mongodb自增保证原子性。 代码如下:

Lua脚本如下:
SAFE_ZADD_SCRIPT = """
local key = KEYS[1]
local field = ARGV[1]
local new_value = tonumber(ARGV[2])
local old_value = redis.call("zscore", key, field)
local res = nil
if (not old_value) or (tonumber(old_value) < new_value)
then
res = redis.call('zadd', key, new_value, field)
end
return res
"""
复制代码为啥不使用zincrby?
zincrby虽然保证不会有并发问题,但是如果key失效或者被清理,会导致排行榜从0开始计数,导致数据错误。
边栏推荐
- Loadbalancer dynamically refreshes Nacos server
- QT qtimer class
- Gocv image reading and display
- Leetcode sword finger offer brush questions - day 22
- Call Stack
- Installing Oracle database 19C RAC on Linux
- Sqli labs Level 2
- Select sort and insert sort
- Oracle修改表空间名称以及数据文件
- Kubedm deploys kubernetes v1.23.5 cluster
猜你喜欢

Minecraft group service opening

Function ‘ngram‘ is not defined

Openshift container platform community okd 4.10.0 deployment

将一串数字顺序后移

Kubedm deploys kubernetes v1.23.5 cluster

队列管理器running状态下无法查看通道

Service de groupe minecraft

CSDN Q & A_ Evaluation

Minecraft air Island service

Luogu greedy part of the backpack line segment covers the queue to receive water
随机推荐
Application of kotlin - higher order function
Judge whether it is Sudoku
Linux二进制安装Oracle Database 19c
Gateway is easy to use
Gocv image cutting and display
C4D quick start tutorial - Chamfer
C nail development: obtain all employee address books and send work notices
Tcp/ip - transport layer
Openshift build image
C# 调用系统声音 嘀~
Don't spend money, spend an hour to build your own blog website
Qunhui NAS configuring iSCSI storage
图像变换,转置
Right click menu of QT
History of Web Technology
Pclpy projection filter -- projection of point cloud to cylinder
gocv图片裁剪并展示
Dip1000 implicitly tagged with fields
队列的基本概念介绍以及典型应用示例
使用递归函数求解字符串的逆置问题