Redis限制N小时内每用户Id最多只能登录M次解决方案

2024-06-01 01:58

本文主要是介绍Redis限制N小时内每用户Id最多只能登录M次解决方案,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

package com.zxl.redis.rediscode;import redis.clients.jedis.Jedis;import java.util.List;/*** @author xiaoliang* @date 2020/5/12 21:30* @since V1.0*/
public class LoginValidate {//设置成10s是因为方便测试//周期时间为毫秒final static int EXPIRE_TIME_MILLISECOND = 10*1000;//一个周期内最多的操作次数final static int MOST_TIMES_IN_TIME_LIMIT = 5;public static void main(String[] args) {//创建Jedis客户端Jedis jedis = new Jedis("192.168.0.3",6379);//操作数据jedis.select(0);//模拟登入用户String userId="zxl";loginValidateWithQueue(jedis,userId);loginValidateWithQueue(jedis,userId);loginValidateWithQueue(jedis,userId);try {Thread.sleep(5000);} catch (InterruptedException e) {e.printStackTrace();}loginValidateWithQueue(jedis,userId);loginValidateWithQueue(jedis,userId);loginValidateWithQueue(jedis,userId);try {Thread.sleep(6000);} catch (InterruptedException e) {e.printStackTrace();}loginValidateWithQueue(jedis,userId);loginValidateWithQueue(jedis,userId);//取出用户最后五次的操作时间List<String> values=jedis.lrange(userId,0,-1);for (int i = 0; i < values.size(); i++) {System.out.printf(values.get(i) + "\n");}//删除用户列表jedis.del(userId);jedis.close();}/*** 用Redis和任意语言实现一段恶意登录保护的代码,限制1小时内每用户Id最多只能登录5次** @param jedis* @param userId* @return*/public static boolean loginValidateWithQueue(Jedis jedis, String userId) {Long currentTime = System.currentTimeMillis();//判断List列表长度是否超过操作次数if (jedis.llen(userId) < MOST_TIMES_IN_TIME_LIMIT) {//将当前操作时间放入到用户list中jedis.rpush(userId, currentTime.toString());System.out.println(currentTime + " 登入成功!" + jedis.llen(userId));return true;} else {//如果超过操作次数则取出list中最早操作时间,即list下标为0的String earliestTimeStr = jedis.lindex(userId, 0);//将字符串转为长整形Long earliestTime = Long.valueOf(earliestTimeStr);//判断最早操作时间是否在周期内,如果在周期内说明在这个周期内操作数已到阀值不允许再操作。if (currentTime - earliestTime <= EXPIRE_TIME_MILLISECOND) {System.out.println(EXPIRE_TIME_MILLISECOND/1000 + " 秒内只能操作" + MOST_TIMES_IN_TIME_LIMIT + " 次");return false;} else {//如果最早操作时间不再周期,说明可以继续操作。//为了使用户列表长度为操作次数。需要删除最早的操作时间,保存本次操作时间。//删除列表尾段数据,即最早操作时间。jedis.lpop(userId);//插入当前操作时间jedis.rpush(userId, currentTime.toString());System.out.println(currentTime + " 登入成功!" + jedis.llen(userId));return true;}}}
}

这篇关于Redis限制N小时内每用户Id最多只能登录M次解决方案的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1019667

相关文章

redis中使用lua脚本的原理与基本使用详解

《redis中使用lua脚本的原理与基本使用详解》在Redis中使用Lua脚本可以实现原子性操作、减少网络开销以及提高执行效率,下面小编就来和大家详细介绍一下在redis中使用lua脚本的原理... 目录Redis 执行 Lua 脚本的原理基本使用方法使用EVAL命令执行 Lua 脚本使用EVALSHA命令

Redis 热 key 和大 key 问题小结

《Redis热key和大key问题小结》:本文主要介绍Redis热key和大key问题小结,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录一、什么是 Redis 热 key?热 key(Hot Key)定义: 热 key 常见表现:热 key 的风险:二、

C#使用StackExchange.Redis实现分布式锁的两种方式介绍

《C#使用StackExchange.Redis实现分布式锁的两种方式介绍》分布式锁在集群的架构中发挥着重要的作用,:本文主要介绍C#使用StackExchange.Redis实现分布式锁的... 目录自定义分布式锁获取锁释放锁自动续期StackExchange.Redis分布式锁获取锁释放锁自动续期分布式

SpringBoot整合mybatisPlus实现批量插入并获取ID详解

《SpringBoot整合mybatisPlus实现批量插入并获取ID详解》这篇文章主要为大家详细介绍了SpringBoot如何整合mybatisPlus实现批量插入并获取ID,文中的示例代码讲解详细... 目录【1】saveBATch(一万条数据总耗时:2478ms)【2】集合方式foreach(一万条数

SpringBoot UserAgentUtils获取用户浏览器的用法

《SpringBootUserAgentUtils获取用户浏览器的用法》UserAgentUtils是于处理用户代理(User-Agent)字符串的工具类,一般用于解析和处理浏览器、操作系统以及设备... 目录介绍效果图依赖封装客户端工具封装IP工具实体类获取设备信息入库介绍UserAgentUtils

Redis Pipeline(管道) 详解

《RedisPipeline(管道)详解》Pipeline管道是Redis提供的一种批量执行命令的机制,通过将多个命令一次性发送到服务器并统一接收响应,减少网络往返次数(RTT),显著提升执行效率... 目录Redis Pipeline 详解1. Pipeline 的核心概念2. 工作原理与性能提升3. 核

redis过期key的删除策略介绍

《redis过期key的删除策略介绍》:本文主要介绍redis过期key的删除策略,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录第一种策略:被动删除第二种策略:定期删除第三种策略:强制删除关于big key的清理UNLINK命令FLUSHALL/FLUSHDB命

usb接口驱动异常问题常用解决方案

《usb接口驱动异常问题常用解决方案》当遇到USB接口驱动异常时,可以通过多种方法来解决,其中主要就包括重装USB控制器、禁用USB选择性暂停设置、更新或安装新的主板驱动等... usb接口驱动异常怎么办,USB接口驱动异常是常见问题,通常由驱动损坏、系统更新冲突、硬件故障或电源管理设置导致。以下是常用解决

Mysql用户授权(GRANT)语法及示例解读

《Mysql用户授权(GRANT)语法及示例解读》:本文主要介绍Mysql用户授权(GRANT)语法及示例,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录mysql用户授权(GRANT)语法授予用户权限语法GRANT语句中的<权限类型>的使用WITH GRANT

Redis消息队列实现异步秒杀功能

《Redis消息队列实现异步秒杀功能》在高并发场景下,为了提高秒杀业务的性能,可将部分工作交给Redis处理,并通过异步方式执行,Redis提供了多种数据结构来实现消息队列,总结三种,本文详细介绍Re... 目录1 Redis消息队列1.1 List 结构1.2 Pub/Sub 模式1.3 Stream 结