redis原子命令和 lua 脚本解决并发问题

我们在使用 Redis 时,不可避免地会遇到并发访问的问题,比如说如果多个用户同时下单就会对缓存在 Redis 中的商品库存并发更新。一旦有了并发写操作,数据就会被修改,如果我们没有对并发写请求做好控制,就可能导致数据被改错,影响到业务的正常使用(例如库存数据错误,导致下单异常)

常见的方式有三种

使用单命令原子操作

incr、decr

自增、自减命令 ,把 get、+1 ,set 3 个操作,封装为一个
业务场景:计数器、计时器

setex

设置过期时间 ,把 set expire 命令封装微一个
业务场景:用户缓存、分布式锁

使用 lua 脚本封装复杂命令微原子操作

对于比较复杂的业务逻辑,简单的命令不可以满足,我们可以使用 lua 脚本,把多个命令封装进去执行,redis 会把 lua 脚本作为一个整体执行,执行过程不会被打断

业务场景:限制某个客户端在一定时间范围内的访问次数,比如每分钟点赞次数,爆款商品的购买限流

//获取ip对应的访问次数
current = GET(ip)
//如果超过访问次数超过20次,则报错
IF current != NULL AND current>20 THEN
        ERROR "exceed 20 per second'
ELSE
    //如果访问次数不足20次,增加一次访问计数
    value =INCR(ip)
    //如果是第一次访问,将键值对的过期时间设置为60s后
    IF value == 1 THEN  
        EXPIRE(ip,60)
    END
    //执行其他操作
    DO THINGS
END

这段代码如果存在a 和 b并发访问,a 访问 0 次, 加 1 ,访问0 次,加 1 ,set 过期时间 这一步就会错误,可以使用 lua 脚本放,封装这一块判断

local current
current = redis.call("incr",KEYS[1])
if tonumber(current)== lthen
    redis.call("expire",KEYS[1],60)
end

执行命令

redis-cli --eval lua.script keys ,args

相关推荐

  1. redis原子命令 lua 脚本解决并发问题

    2024-01-09 07:24:02       38 阅读
  2. Redis 开发】分布式锁中的常见问题Lua脚本

    2024-01-09 07:24:02       12 阅读
  3. Redis使用Lua脚本

    2024-01-09 07:24:02       46 阅读
  4. Redis整合Lua脚本

    2024-01-09 07:24:02       42 阅读
  5. Redis系列——Lua脚本redis事务的应用

    2024-01-09 07:24:02       30 阅读
  6. Redis的一些问题解决并发

    2024-01-09 07:24:02       17 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-01-09 07:24:02       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-01-09 07:24:02       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-01-09 07:24:02       19 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-01-09 07:24:02       20 阅读

热门阅读

  1. qt day1

    qt day1

    2024-01-09 07:24:02      37 阅读
  2. 游戏辅助从0到1-C++调用游戏Lua脚本实现辅助

    2024-01-09 07:24:02       53 阅读
  3. spark读sqlserver出现的异常

    2024-01-09 07:24:02       41 阅读
  4. MySql02:增删改查

    2024-01-09 07:24:02       36 阅读
  5. 前端基础面试题

    2024-01-09 07:24:02       24 阅读
  6. pytorch 分布式 Node/Worker/Rank等基础概念

    2024-01-09 07:24:02       42 阅读
  7. nginx.conf 文件配置

    2024-01-09 07:24:02       31 阅读
  8. 服务器超线程的好处

    2024-01-09 07:24:02       37 阅读