高并发场景分析之redis+lua防重校验

 更新时间:2023年07月10日 10:13:34   作者:想养一只萨摩耶~  
这篇文章主要介绍了高并发场景分析之redis+lua防重校验,本文通过示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

高并发场景:redis+lua防重校验

大家平时在做有并发量下单的项目时,代码层面基本上就分为这么几个步骤:参数校验--->防重校验--->库存校验扣减--->下单成功--->支付

最近公司有个商城项目说要30分钟达到1亿的并发量。当时听到突然猛了一下。真是牛逼克拉斯呀。

不过该说不说还是得开搞,所谓的并发无非就是要想办法减少io的操作,尽量少查表,其余配置方面的问题就看公司舍不舍得花钱了。

其中防重校验这一部分选用了redis集合lua来做,来防止多次提交。

注意:真实下单操作是分为了订单前置操作 (前置校验和生成防重令牌)和提交订单两个接口来写的,这里为了测试简单合并了

@RestController
@RequestMapping("/lua")
public class TestLuaController {
    @Autowired
    private StringRedisTemplate redisTemplate;
    private static final String ORDER_CHECK_TOKEN = "order_check_token";
    private static final String ORDER_TOKEN_DEFAULT_VALUE = "value";
    /**
     * 场景:最近公司有高并发场景,涉及到用令牌防重(防止有人多次提交订单)
     *     可以使用redis执行lua脚本 比较key值令牌是否存在,如果存在即删除
     */
    @RequestMapping("/checkTempToken")
    public Long luaExecute(String checkToken){
        //模拟提交订单生成的防重令牌
        redisTemplate.opsForValue().set(ORDER_CHECK_TOKEN + checkToken,ORDER_TOKEN_DEFAULT_VALUE,60, TimeUnit.SECONDS);
        String script = "if redis.call(\"get\",KEYS[1]) == ARGV[1]\n" +
                "then\n" +
                "    return redis.call(\"del\",KEYS[1])\n" +
                "else\n" +
                "    return 0\n" +
                "end";
//执行redis脚本操作的函数
        Long execute = redisTemplate.execute(new DefaultRedisScript<>(script, Long.class), Arrays.asList(ORDER_CHECK_TOKEN + checkToken), ORDER_TOKEN_DEFAULT_VALUE);
        System.out.println(execute);
        return execute;
    }
}

结果:

redis+lua语言去重

1)redis

redis是一种键值对的单线程架构模型,所以它是线程安全的,也是分布式缓存常用的解决方案。

2)lua

lua是基于c语言的一种脚本语言,它可以很轻便地被使用在嵌入式方面。我们不会去重写redis,但是我们可以去使用lua来扩展redis的功能。而redis也内置了对lua支持的模块。

3)redis+lua是我司基于分布式告警去重的一种解决方案,要达到的目的:堵住10是s内的重复告警,主要应用的场景是同一个告警,在不通的客户端同时推送了一条告警数据,此时要堵住

一条数据。

直接上代码吧

@Component
public class RedisLua {
    @Autowired
    private RedisTemplate<String,Object> redisTemplate;
    private DefaultRedisScript<Boolean> script;
    private static final String KEY_PREX = "alertInfo_";
    @PostConstruct
    private void init(){
        script = new DefaultRedisScript<Boolean>();
        script.setResultType(Boolean.class);
        script.setScriptSource(new ResourceScriptSource(new
                ClassPathResource("lua/alert.lua")));//lua脚本文件
    }public Boolean blockRepetition(String ruleId,String status,String ip,Object...args){
        List<String> keys = new ArrayList<>();
        keys.add(KEY_PREX + ip+ruleId+status);//key包括前缀+客户端ip+告警规则id+状态
        return redisTemplate.execute(script, keys, args);
    }
}

下面是lua脚本

--[[ ARGV1表示redis生效时间,key表示存储redis的key值]]
local alert = redis.call('exists',KEYS[1]);
if alert
 then
    return false
 else
    redis.call('set',KEYS[1],ngx.time())
    redis.call('expire',KEYS[1],ARGV[1])
    return true
end

该方案主要用于微服务集群中,采用分布式锁防和redis集群确保数据唯一。

使用脚本的好处如下:

1.减少网络开销:本来5次网络请求的操作,可以用一个请求完成,原先5次请求的逻辑放在redis服务器上完成。使用脚本,减少了网络往返时延。

2.原子操作:Redis会将整个脚本作为一个整体执行,中间不会被其他命令插入。

3.复用:客户端发送的脚本会永久存储在Redis中,意味着其他客户端可以复用这一脚本而不需要使用代码完成同样的逻辑。

到此这篇关于高并发场景分析之redis+lua防重校验的文章就介绍到这了,更多相关redis+lua防重内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • redis集群的三种部署之主从复制、哨兵机制、cluster集群详解

    redis集群的三种部署之主从复制、哨兵机制、cluster集群详解

    本文介绍了Redis的主要特点,包括高性能、数据持久化、分布式特性、丰富的数据结构、高可用性、开源免费以及可扩展性等七大特点,文章还详细介绍了三种Redis集群部署方式:主从复制、哨兵机制和Cluster集群,并通过实验演示了每种方式的具体配置和操作步骤
    2026-05-05
  • Redis7.0部署集群的实现步骤

    Redis7.0部署集群的实现步骤

    本文主要介绍了Redis7.0部署集群的实现步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-06-06
  • Redis RESP 协议实现实例详解

    Redis RESP 协议实现实例详解

    这篇文章主要为大家介绍了Redis RESP 协议实现实例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-09-09
  • Redis8.0.3编译化安装的实现

    Redis8.0.3编译化安装的实现

    本文主要介绍了Redis8.0.3编译化安装的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2025-08-08
  • Redis实现锁续期的项目实践

    Redis实现锁续期的项目实践

    本文介绍了使用Redis实现分布式锁的续期,包括使用Lua脚本、Redlock算法和Redisson客户端等方法,具有一定的参考价值,感兴趣的可以了解一下
    2024-12-12
  • Redis的安全机制详细介绍及配置方法

    Redis的安全机制详细介绍及配置方法

    本文介绍Redis安全机制的配置方法,包括绑定IP地址、设置密码、保护模式、禁用危险命令、防火墙限制、TLS加密、客户端连接限制、最大内存使用和日志审计等,通过合理配置这些安全机制,可以有效地保护Redis实例免受未授权访问和其他潜在的安全威胁,感兴趣的朋友一起看看吧
    2025-11-11
  • Windows环境下Redis Cluster环境搭建(图文)

    Windows环境下Redis Cluster环境搭建(图文)

    这篇文章主要介绍了Windows环境下Redis Cluster环境搭建(图文),小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-07-07
  • Redis发布订阅和实现.NET客户端详解

    Redis发布订阅和实现.NET客户端详解

    发布订阅在应用级其作用是为了减少依赖关系,通常也叫观察者模式。主要是把耦合点单独抽离出来作为第三方,隔离易变化的发送方和接收方。下面这篇文章主要给大家介绍了关于Redis发布订阅和实现.NET客户端的相关资料,需要的朋友可以参考下
    2017-03-03
  • Redis定时任务原理的实现

    Redis定时任务原理的实现

    本文主要是基于 redis 6.2 源码进行分析定时事件的数据结构和常见操作,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-03-03
  • Redis报错“NOAUTH Authentication required”两种解决方案

    Redis报错“NOAUTH Authentication required”两种解决方案

    Redis提供了一个命令行工具redis-cli,它允许你直接连接到Redis服务器,如果你知道Redis服务器的密码,你可以在连接时直接提供它,本文给大家介绍连接了Redis报错“NOAUTH Authentication required”两种解决方案
    2024-05-05

最新评论