php redis 自增计数器,redis实现高并发计数
业务需求中经常有需要用到计数器的场景:譬如一个手机号一天限制发送5条短信、一个接口一分钟限制多少请求、一个接口一天限制调用多少次等等。使用Redis的Incr自增命令可以轻松实现以上需求。以一个接口一天限制调用次数为例:/**
* 是否拒绝服务
* @return
*/
private boolean denialOfService(String userId){
long count=JedisUtil.setIncr(DateUtil.getDate()+"&"+userId+"&"+"queryCarViolation", 86400);
if(count<=10){
return false;
}
return true;
}/**
* 查询违章
* @param plateNumber车牌
* @param vin 车架号
* @param engineNo发动机
* @param request
* @param response
* @throws Exception
*/
@RequestMapping("/queryCarViolationList.json")
@AuthorizationApi
public void queryCarViolationList(@CurrentToken Token token,String plateNumber,String vin,
String engineNo,HttpServletRequest request,HttpServletResponse response) throws Exception {
String userId=token.getUserId();
//超过限制,拦截请求
if(denialOfService(userId)){
apiData(request, response, ReqJson.error(CarError.ONLY_5_TIMES_A_DAY_CAN_BE_FOUND));
return;
}
//没超过限制,业务逻辑……
}
每次调用接口之前,先获得下计数器自增后的值,如果小于限制,放行,执行后面的代码。如果大于限制,则拦截掉。
JedisUtil工具类:public class JedisUtil {
protected final static Logger logger = Logger.getLogger(JedisUtil.class);
private static JedisPool jedisPool;
@Autowired(required = true)
public void setJedisPool(JedisPool jedisPool) {
JedisUtil.jedisPool = jedisPool;
}
/**
* 对某个键的值自增
* @author liboyi
* @param key 键
* @param cacheSeconds 超时时间,0为不超时
* @return
*/
public static long setIncr(String key, int cacheSeconds) {
long result = 0;
Jedis jedis = null;
try {
jedis = jedisPool.getResource();
result =jedis.incr(key);
if (cacheSeconds != 0) {
jedis.expire(key, cacheSeconds);
}
logger.debug("set "+ key + " = " + result);
} catch (Exception e) {
logger.warn("set "+ key + " = " + result);
} finally {
jedisPool.returnResource(jedis);
}
return result;
}
}
更多redis知识请关注redis入门教程栏目。
php redis 自增计数器,redis实现高并发计数相关推荐
- php redis 自增计数器,redis自增计数
INCR key 将 key 中储存的数字值增一. 如果 key 不存在,那么 key 的值会先被初始化为 0 ,然后再执行 INCR 操作. 如果值包含错误的类型,或字符串类型的值不能表示为数字,那 ...
- Spring Redis中使用Lua脚本实现高并发原子操作
1. 前言 在上一文中我对 Lua 语言的一些简单的语法及其在 Redis 中的操作进行了介绍,但是在 Java 开发中我们还需要进一步的学习才能使这种技术落地.今天就结合Spring Data Re ...
- 高并发架构系列:Redis为什么是单线程、及高并发快的3大原因详解
Redis的高并发和快速原因 1.redis是基于内存的,内存的读写速度非常快: 2.redis是单线程的,省去了很多上下文切换线程的时间: 3.redis使用多路复用技术,可以处理并发的连接.非阻塞 ...
- Redis系列教程(四):Redis为什么是单线程、及高并发快的3大原因详解
Redis的高并发和快速原因 1.redis是基于内存的,内存的读写速度非常快: 2.redis是单线程的,省去了很多上下文切换线程的时间: 3.redis使用多路复用技术,可以处理并发的连接.非阻塞 ...
- Redis为什么是单线程、及高并发快的大原因详解
Redis的高并发和快速原因 1.redis是基于内存的,内存的读写速度非常快: 2.redis是单线程的,省去了很多上下文切换线程的时间: 3.redis使用多路复用技术,可以处理并发的连接.非阻塞 ...
- Mysql更新计数器_MySQL实现计数器如何在高并发场景下更新并保持数据正确性
一张表 两个字段 一个id 一个useCount 表里存了100个id 每个id对应自己的useCount 业务场景是:当id每使用一次 useCount要加1. 当useCount大于1000时 这 ...
- Java全能手册火了!Redis/Nginx/Dubbo/Spring全家桶/高并发
前言 本文是为了帮大家快速回顾了Java中知识点,这套面试手册涵盖了诸多Java技术栈的面试题和答案,相信可以帮助大家在最短的时间内用作面试复习,能达到事半功倍效果. 本来想将文件上传到github上 ...
- redis实战教程(二)- 高并发、大流量限速
关键代码如下: @Override public void rateLimit(String key, int unitTime, long rate) { Jedis jedis = getJedi ...
- Redis 的高并发实战:抢购系统 --浅奕
简介: 主要内容: 一.IO 模型和问题 二.资源竞争与分布式锁 三.Redis 抢购系统实例 主要内容: 一.IO 模型和问题 二.资源竞争与分布式锁 三.Redis 抢购系统实例 一.IO 模型和 ...
最新文章
- 国外17个非常热门的在线备份服务
- insight-vmi 编译中的问题
- 川大优秀毕业生在GitHub上建了一个项目《深度学习500问》,还未完结就获赞无数
- 异步加载SAP UI5 OData metadata
- C#LeetCode刷题之#141-环形链表(Linked List Cycle)
- 微信小程序 服务器触发事件,微信小程序组件间通讯与事件
- 某些error page不加载_细说So动态库的加载流程
- [Java] 蓝桥杯ALGO-12 算法训练 幂方分解
- mysql 分区表 知乎_mysql 分区表
- psvimg格式PSV存档文件解包工具psvimgtools在macOS环境下的使用教程
- C#如何获取指定周的日期范围
- 应广PFS122单片机比较器测供电电源VDD电压带临界点消抖处理
- 特征选择方法-统计方法
- Linux提高CPU使用率并设置固定占比
- 【邻接表】77 邻接表:顶点u的下一个邻接点
- 【Vue 组件化开发 三】父组件给子组件传递数据、组件通信(父传子、子传父)、父访问子(children、ref)、动态组件(is、component)
- 软件测试丨工具在接口测试中发挥什么样的作用?
- SpringCloud Gateway 重试路由器的过滤器
- 基础连接已关闭解决办法_手机wifi连不上怎么办 手机wifi连不上解决办法【详解】...
- 中国车用尿素市场规模调研与发展趋势分析报告2022-2028年