首页 > 数据库 >springboot使用redis实现计数限流

springboot使用redis实现计数限流

时间:2023-01-06 09:34:16浏览次数:54  
标签:return springboot KEYS redis redisScript lua 限流 call

lua脚本

resources 下创建文件 redis/AccessLimit.lua 内容为:

local limitSecond = tonumber(ARGV[1])
local limitMaxCount = tonumber(ARGV[2])


local num = tonumber(redis.call('get', KEYS[1]) or '-1')

if num == -1 then
    redis.call('incr', KEYS[1])
    redis.call('expire', KEYS[1], limitSecond)
    return 1
else
    if num >= limitMaxCount then
        return 0
    else
        redis.call('incr', KEYS[1])
        return 1
    end
end

API测试

@RestController
public class TestController {
    
    @Autowired
    private StringRedisTemplate stringRedisTemplate;

    @RequestMapping("test")
    public String test() {
        DefaultRedisScript<Long> redisScript = new DefaultRedisScript<>();
        redisScript.setScriptSource(new ResourceScriptSource(new ClassPathResource("redis/AccessLimit.lua")));
        redisScript.setResultType(Long.class);
        Long result = stringRedisTemplate.execute(redisScript,  Arrays.asList("user1"), "5", "10");
        return result+"";
    }
}

注意事项

  • 必须使用lua脚本保证原子性
  • 参数使用字符串生效

标签:return,springboot,KEYS,redis,redisScript,lua,限流,call
From: https://www.cnblogs.com/z8080/p/17029439.html

相关文章

  • 如何跳出springboot的service层中某一个方法?
    有一个需求,就是中断某个方法中的for循环目前的做法是:for循环中,增加if判断,如果满足条件就return,会中断这个方法for(inti=0;i<totalIndex;i++){............
  • SpringBoot整合Caffeine(通过注解)
    一、了解缓存配置先来了解一下配置方法吧,SimpleCacheManager和CaffeineCacheManager配置的区别:SimpleCacheManager: 这种缓存管理器允许你在应用程序启动时通过配置......
  • Redis——概览
     1、网络模型:IO多路复用 2、操作模块 3、数据类型:String、List(列表)、Hash(哈希)、Set(集合)、SortedSet(有序集合)底层数据结构:哈希表、双向链表、压缩列表、跳表、整......
  • <<Redis 核心技术与实战>> 小记随笔 —— 有一亿个keys要统计,应该用哪种集合?
    聚合统计应用场景统计手机App每天的新增用户数和第二天的留存用户数解决方案由于Set类型可以实现并集、交集、差集等能力。所以设计一个Set存所有的用户Id,并且......
  • <<Redis 核心技术与实战>> 小记随笔 —— GEO
    应用场景用于描述LBS(Location-BasedService)的数据结构,能够存储对象的经纬度信息,并且可以进行指定经纬度点指定距离范围内的查询、排序等能力。类型介绍是一种自定......
  • Redis简单入门
    0什么是Redisredis的结构是key-valuekey是字符串,value有5种类型字符串类型,hash类型(map),set类型(不允许重复),list(linkedlist),有序集合类型(sortedset)1字符串类型命令......
  • 同事说不会在SpringBoot中集成日志记录操作我向他推荐了这篇文章
    SpringBoot中记录操作日志记一次SpringBoot中记录管理员的操作日志,记录管理员对用户、管理员、分类、视频等模块的操作,如:删除管理员、用户、视频、修改密码、信息等等,都......
  • 基于Redis通用缓存
    基于Redis通用缓存redis简介:流程:基于SpringAop切面类进行增强,逻辑如下1.数据进入controller层调用serviceservice调用对应dao方法进行查询前应该先从redis中查......
  • Redis AOF持久化
    aof日志这种保存写操作命令到日志的持久化方式,就是Redis里的AOF(*AppendOnlyFile*)持久化功能,注意只会记录写操作命令,读操作命令是不会被记录的。在Redis中A......
  • springboot 资源分离 打包
    <build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-jar-plugin</a......