# redisFlowControl **Repository Path**: zhayan/redis-flow-control ## Basic Information - **Project Name**: redisFlowControl - **Description**: redis限流模拟。模拟了普通模式、lua、redis分布式锁、redisson分布式锁 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2022-03-25 - **Last Updated**: 2022-05-25 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Redis限流模拟 1. 总限流total=60 2. key存活时间seconds=60s 3. getSleep()模拟业务耗时 4. 使用jemeter工具模拟多线程请求 5. 核心理念:**保证已请求数量的可见性,原子性操作** ## 1.普通模式 ``` # 并发情况下无法保证限流的准确性 wsz.redisflowcontrol.controller.RedisFlowControl#common ``` **缺点:** 1. 取值、判断、重新赋值未原子化、锁起来 2. 并发情况下,无法保证限流 ## 2.lua模式 ``` # 原子性操作-并发情况下可以保证准确性 wsz.redisflowcontrol.controller.RedisFlowControl#lua ``` ## 3.分布式锁模式 ​ 利用set nx px命令,通过使用唯一标识进行赋值tryLock,删除key-unlock ``` wsz.redisflowcontrol.controller.RedisFlowControl#lock # set nx px redisTemplate.opsForValue().setIfAbsent ``` **优点:** 1. 取值、判断、重新赋值,可以保证部分并发 **缺点:** 1. 业务超时:唯一标识key的过期时间不能根据业务动态续期。当业务处理时间超过过期时间;导致key失效。后续请求立马可以setnx px成功,被锁代码依旧被并发处理; 2. key删除异常:在key临近超时,这时候业务处理完成但删除key较慢。key过期,后续请求立马获取锁。删除key成功,导致刚获取到的锁被删除,后续请求依旧可以获取锁。 ## 4.Redisson模式 1. 在3的基础上,可以进行key超时时间的动态延长。 2. 封装后使用简单。 ``` RLock lock = redisson.getLock(redisson_lock_key); lock.lock(); lock.unlock(); ```