利用Redis实现高并发计数器
2023-06-13 09:11:46 时间
大家好,又见面了,我是你们的朋友全栈君。
业务需求中经常有需要用到计数器的场景:譬如一个手机号一天限制发送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 (result<=1 && 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;
}
}
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/141991.html原文链接:https://javaforall.cn
相关文章
- 实现使用Java实现Redis消息队列(redis消息队列java)
- 解决Redis安装遇到的烦恼(redis安装问题)
- 利用Redis实现订阅发布机制(redis订阅发布)
- 性能研究结果:在Redis远程服务器上测试性能(测试redis远程服务器)
- 手机端连接Redis,轻松实现远程操控(手机远程连接redis)
- 新型微信小程序借助Redis缓存实现极致性能(微信小程序redis缓存)
- 鲁班学院Redis技能面试指南(鲁班学院redis面试)
- 腾讯云函数实现Redis存储功能(腾讯云函数redis)
- 压测Redis挖掘稳定性的秘密(直接针对redis写压测)
- Redis实现LRU从零开始(用redis写个lru)
- Redis缓存实现权限控制(权限控制的redis缓存)
- 从零开始指定Redis配置文件(指定 redis配置文件)
- 云端存储技术利用Redis实现数据灵活化(云数据redis)
- 单机Redis如何实现分区划分(单机redis如何分区)
- 开始Redis连接池的初始化(初始化redis的连接池)
- 使用分布式Redis实现极致命中(分布式redis怎么命中)
- 如何防止Redis 雪崩(如何让redis雪崩)
- 如何实现高效Redis缓存管理(如何管理redis)
- 阿里云Redis实现外网连接的方法(外网连接阿里云redis)
- 串功能Redis中没有自带的字符串功能(哪项不是redis的字符)
- 替代Redis有哪些替代方案(和redis相同的有哪些)
- 实现快速存取Redis灵活数据存储模式(向redis写入数据)
- 实现快速可靠将数据同步至Redis(同步数据到redis)
- 发现Redis未授权访问,开启警戒之旅(发现redis未授权访问)
- 深入浅出解析Redis面试中的哨兵机制(redis面试哨兵机制)
- 实现高效Redis集群备份的技术研究(redis集群备份对应)
- Redis集群理解它的意义(redis集群啥意思)
- Redis集群实现高可用性与数据持久化(redis集群与持久化)
- Redis实现的完美防穿透锁(redis防穿透锁)
- 实现方式红色传送带五种Redis队列实现方法(redis队列的五种)
- 解决Redis闪退的妙招(redis闪退怎么解决)
- 接Redis连接快速实现数据共享(redis连)
- Redis极速读写拥抱缓冲区的美妙之处(redis读写缓冲区)
- 如何在Redis中设置认证密码(redis 设置认证密码)
- 期Redis实现限时有效一天之内(redis 设置当日有效)
- Redis有没有实现强大的持久化功能(redis能做持久化层吗)
- 基于Redis的自增序号设置(redis设置自增数)
- Redis模糊查找带来的性能提升(redis模糊查找性能)