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客户端连接机制的实现方案

《Redis客户端连接机制的实现方案》本文主要介绍了Redis客户端连接机制的实现方案,包括事件驱动模型、非阻塞I/O处理、连接池应用及配置优化,具有一定的参考价值,感兴趣的可以了解一下... 目录1. Redis连接模型概述2. 连接建立过程详解2.1 连php接初始化流程2.2 关键配置参数3. 最大连

使用Python构建智能BAT文件生成器的完美解决方案

《使用Python构建智能BAT文件生成器的完美解决方案》这篇文章主要为大家详细介绍了如何使用wxPython构建一个智能的BAT文件生成器,它不仅能够为Python脚本生成启动脚本,还提供了完整的文... 目录引言运行效果图项目背景与需求分析核心需求技术选型核心功能实现1. 数据库设计2. 界面布局设计3

Java.lang.InterruptedException被中止异常的原因及解决方案

《Java.lang.InterruptedException被中止异常的原因及解决方案》Java.lang.InterruptedException是线程被中断时抛出的异常,用于协作停止执行,常见于... 目录报错问题报错原因解决方法Java.lang.InterruptedException 是 Jav

kkFileView在线预览office的常见问题以及解决方案

《kkFileView在线预览office的常见问题以及解决方案》kkFileView在线预览Office常见问题包括base64编码配置、Office组件安装、乱码处理及水印添加,解决方案涉及版本适... 目录kkFileView在线预览office的常见问题1.base642.提示找不到OFFICE组件

SpringBoot监控API请求耗时的6中解决解决方案

《SpringBoot监控API请求耗时的6中解决解决方案》本文介绍SpringBoot中记录API请求耗时的6种方案,包括手动埋点、AOP切面、拦截器、Filter、事件监听、Micrometer+... 目录1. 简介2.实战案例2.1 手动记录2.2 自定义AOP记录2.3 拦截器技术2.4 使用Fi

最新Spring Security的基于内存用户认证方式

《最新SpringSecurity的基于内存用户认证方式》本文讲解SpringSecurity内存认证配置,适用于开发、测试等场景,通过代码创建用户及权限管理,支持密码加密,虽简单但不持久化,生产环... 目录1. 前言2. 因何选择内存认证?3. 基础配置实战❶ 创建Spring Security配置文件

Spring Security 单点登录与自动登录机制的实现原理

《SpringSecurity单点登录与自动登录机制的实现原理》本文探讨SpringSecurity实现单点登录(SSO)与自动登录机制,涵盖JWT跨系统认证、RememberMe持久化Token... 目录一、核心概念解析1.1 单点登录(SSO)1.2 自动登录(Remember Me)二、代码分析三、

Redis MCP 安装与配置指南

《RedisMCP安装与配置指南》本文将详细介绍如何安装和配置RedisMCP,包括快速启动、源码安装、Docker安装、以及相关的配置参数和环境变量设置,感兴趣的朋友一起看看吧... 目录一、Redis MCP 简介二、安www.chinasem.cn装 Redis MCP 服务2.1 快速启动(推荐)2.

go动态限制并发数量的实现示例

《go动态限制并发数量的实现示例》本文主要介绍了Go并发控制方法,通过带缓冲通道和第三方库实现并发数量限制,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面... 目录带有缓冲大小的通道使用第三方库其他控制并发的方法因为go从语言层面支持并发,所以面试百分百会问到

WinForm跨线程访问UI及UI卡死的解决方案

《WinForm跨线程访问UI及UI卡死的解决方案》在WinForm开发过程中,跨线程访问UI控件和界面卡死是常见的技术难题,由于Windows窗体应用程序的UI控件默认只能在主线程(UI线程)上操作... 目录前言正文案例1:直接线程操作(无UI访问)案例2:BeginInvoke访问UI(错误用法)案例