首页 > 数据库 >redis实现用户查询次数限制

redis实现用户查询次数限制

时间:2023-02-28 11:22:05浏览次数:48  
标签:false redis value 查询 次数 flag key redisTemplate

  随着项目的开发越来越完善,产品也会提出各种层出不穷的需求,当一个复杂列表查询功能实现时,需求又说要增加用户的查询次数限制,这就让开发很是头疼,但是为了RMB也就忍忍了!

具体实现思路是使用Redis的<key,value>特性存储,计算每个key的访问次数,然后递减代码如下:

 

一、定义访问次数和过期时间常量

private static final int TIME_INTERVAL = 1440;
private static final int FAILED_RETRY_TIMES = 4;

二、判断用户是否是登录状态?

登录则获取用户Id
String key = "";
boolean flag = false;
Long userId = SecurityUtils.getCurrUserId();
if (userId != null) {
CoCompanyInfo coCompanyInfo = coCompanyInfoMapper.selectMyCoCompanyInfoByTenantId(SecurityUtils.getCurrTenantId());
if (coCompanyInfo == null){
key = userId.toString();
}else {
flag = true;
}
}
未登录或者未注册的用户则取IP地址作为Key
else {
HttpServletRequest request = ServletUtils.getRequest();
String ip = IpUtils.getIP(request);
log.info("获取客户端的IP地址为:" + ip);
key = ip;
}

 

三、redisTemplate方法根据key获取到value

if (StringUtils.isNotEmpty(key)){
Integer value = (Integer) redisTemplate.opsForValue().get(key);
if (value != null){
//剩余次数大于零且数组不等于空时,查询次数减一
if (value > 0 && CollectionUtils.isNotEmpty(list)){
redisTemplate.boundValueOps(key).increment(-1);
flag = true;
}else {
flag = false;
}
}
如果key等于空则是第一次访问,则存入次数和时间
else {
redisTemplate.opsForValue().set(key, FAILED_RETRY_TIMES, TIME_INTERVAL, TimeUnit.MINUTES);
flag = true;
}
}

四、如果flag = false则登录次数已用完,返回空数组
if (flag == false){
return new ArrayList<>();
}
return list;

以上是完整实现代码,如有不足欢迎大家补充

标签:false,redis,value,查询,次数,flag,key,redisTemplate
From: https://www.cnblogs.com/izmm/p/17163347.html

相关文章

  • BIP查询框添加查询条件
    //搜索框添加查询条件viewModel.on("afterMount",function(data){letagentId=viewModel.getParams().query.agentId;//获取传值(其他页面......
  • 什么是Redis缓存穿透、缓存雪崩、缓存击穿
    缓存穿透缓存穿透,是指查询一个数据库一定不存在的数据。正常的使用缓存流程大致是,数据查询先进行缓存查询,如果key不存在或者key已经过期,再对数据库进行查询,并把查询到的对象......
  • [转]Redis干货 | 五种常用类型之String字符串详解
    一.背景说明小白:伟哥,java中String是最常用类型,Redis中也是吗?伟哥:差不多,我给你稍微讲一下。二.数据类型依据Redis官网,目前Redis数据类型共计九种。具体整理如下:......
  • DQL聚合函数/分组查询/分页查询
    -------------------------聚合函数-------------------------------------------------------查班里一共多少学生:selectcount(id)fromstu;  --count()......
  • 8.开启慢查询日志
    1.查看慢查询日志是否开启showvariableslike%slow_query_log%2.开启慢查询日志:setglobalslow_query_log=1    3.查看慢查询日志设置的时间showvariable......
  • windows下安装redis7
    一、下载地址:https://github.com/zkteco-home/redis-windows 二、解压到电脑指定目录并注册为服务管理员方式打开cmd,进入到解压到的目录,执行redis-server--service-......
  • test redis
     importredisr=redis.StrictRedis(host='localhost',port=6379,db=0)r.set('test1','test1')value1=r.get('car')print(value1)all_keys=r.keys()pri......
  • JDBC练习,查询所有
    查询所有数据获取Connection定义SQL:selection*fromtb_brand;获取PerparedStatement对象设置参数:不需要执行SQL处理结果:List<Brand>释放资源没有系统学过这些,只......
  • mybatis模糊查询
    publicUserqueryUserByLike(@Param("arg")Stringarg);方式一:<selectid="queryUserByLike"resultType="org.example.entity.User">select*fromt_use......
  • mybatis查询返回多条数据
    返回User类型的list<selectid="queryAllUser"resultType="org.example.entity.User">select*fromt_user</select>publicinterfaceUserMapper{......