常见项目场景题2(多次输错密码禁止登录,分布式下多线程抢夺资源)

embedded/2024/9/25 9:34:14/

多次输错密码后如何禁止一定时间内用户再次登录

通常使用 IP 地址为单位来进行限制,而非具体的用户。这样可以减少误伤其他用户的可能性。
(一个非法用户可能会拿他人的账号不断尝试登录)
同时,以 IP 地址为单位进行限制还可以避免黑客通过使用同-IP 地址进行暴力破解等攻击行为。提高系统的安全性和稳定性。
使用 Redis解决该问题
使用 Redis 记录当前 ip 的尝试登录次数:
·key 为该 ip 请求登录的唯一标识
·value 为当前 ip 的尝试登录次数
需要给 key 设置一个过期时间,用来实现指定时间内无法再次登录的效果。并且,每次
对 key 对应的 value 进行修改时,都需要重置过期时间。
大致运行流程如下:

  1. 当用户登录时,判断是否有对应的 key
  2. 如果没有对应 key ,说明是第一次登录,如果密码出错,就创建对应的 key,key 对应的 value 值为设为1
  3. 如果有对应的 key,说明不是第一次登录了,需要判断 key 对应的 vaue 大小是否小于 3。
  4. 如果小于3则代表还能继续尝试登录,重复密码校验这一步。如果密码继续出错,就返回“登录失败”,并将 key 对应的 value值加1
  5. 如果 value 等于 3,返回“输入密码错误次数达到 3次,请 xx 分钟后再尝试”

多线程抢夺共享资源情景(多位用户抢一个红包,如何保证只有一个抢到?)

为了共享资源被安全地访问,需要对共享资源进行加锁
实际生产项目多为分布式环境,分布式系统下,不同的服务/客户端通常运行在独立的 JVM 进程上。如果多个 JVM 进程共享同一份资源的话,使用本地锁就没办法实现资源的互斥访问了。于是,分布式锁 就诞生了。
分布式锁常用Redis实现
什么是分布式缓存

如何基于 Redis 实现一个最简易的分布式锁?

在 Redis 中, SETNX 命令是可以帮助我们实现互斥。SETNXSET if Not eXists,如果 key 不存在的话,才会设置 key 的值

> SETNX lockKey uniqueValue
(integer) 1
> SETNX lockKey uniqueValue
(integer) 0

释放锁的话,通过 DEL 命令删除对应的 key 即可。

> DEL lockKey
(integer) 1

为了防止误删其他的锁,建议使用 Lua 脚本通过 key 对应的 value(唯一值)来判断。
选用 Lua 脚本可以保证解锁操作的原子性

java">// 释放锁时,先比较锁对应的 value 值是否相等,避免锁的误释放
if redis.call("get",KEYS[1]) == ARGV[1] thenreturn redis.call("del",KEYS[1])
elsereturn 0
end

http://www.ppmy.cn/embedded/116560.html

相关文章

【AIGC】ChatGPT提示词解析:如何生成爆款标题、节日热点文案与完美文字排版

博客主页: [小ᶻZ࿆] 本文专栏: AIGC | ChatGPT 文章目录 💯前言💯情绪化的吸睛爆款标题提示词使用方法 💯紧跟节日热点生成文案提示词使用方法 💯高效文字排版技巧提示词使用方法 💯小结 &#x1f4af…

HtmlCss 基础总结(基础好了才是最能打的)五

Html&Css 基础学习回顾总结 Html&Css 基础总结(基础好了才是最能打的)一 Html&Css 基础总结(基础好了才是最能打的)二 Html&Css 基础总结(基础好了才是最能打的)三 Html&Css 基础总结…

[产品管理-33]:实验室技术与商业化产品的距离,实验室技术在商业化过程中要越过多少道“坎”?

目录 一、实验室技术 1.1 实验室研究性技术 1.2 技术发展的S曲线 技术发展S曲线的主要阶段和特点 技术发展S曲线的意义和应用 二、实验室技术商业化的路径 2.1 实验室技术与商业化产品的距离 1、技术成熟度与稳定性 - 技术自身 2、市场需求与适应性 - 技术是满足需求 …

spark的stage划分的原理

在 Apache Spark 中,stage 是执行作业时的重要执行单元。一个 Spark 作业会被划分为若干个 stage,每个 stage 由一组可以并行执行的任务组成。这种划分主要依赖于 RDD 中的操作类型(窄依赖和宽依赖)。下面我们来讨论 Spark stage …

Linux 中 man手册基础 与 man.vim 和 ctags的安装使用

man手册基础 查找命令:Man [section] [所查找…的名字] Linux的man很强大,该手册分成很多section,使用man时可以指定不同的section来浏览,各个section意义如下: 1 - commands 2 - system calls 3 - library calls 4 -…

React 启动时webpack版本冲突报错

报错信息: 解决办法: 找到全局webpack的安装路径并cmd 删除全局webpack 安装所需要的版本

【Linux笔记】如何将内容从一个文件复制到另一个文件

比如:将文件tmp_file.txt中的部分数据,复制到file01.txt中去 tmp_file.txt文中内容: file01.txt为空文档 一、使用vi编辑器 I、文件中直接使用:e 目标文件进行切换文件复制 1、打开被复制文件 vi tmp_file.txt 2、进入一般命令模式 默认情况为…

Maven 编译和Nexus 构建私有仓库

Java 程序编译 编译流程 C 语言源码编译过程,对于单文件,我们可以使用 gcc 命令直接编译即可,但如果是大型商业项目,源码文件多,存在各种依赖,各种配置路径,各种库的支持等,几乎无法…