今天在做图片验证码的时候遇到一个问题。用redis的生命周期来存放,用户输入错误次数。
三十秒内输错三次就,等待三十分钟。
那么问题来了,如果说第一次输入错误,应该是 key为用户用,value 为 次数2 ex就为30秒
,但是第二次 set把值改为2时,生命周期就会被覆盖。如果不加过期时间就是一个有效,加了那就是重新给了30秒。
第一种方法:
第二次输入错误的时候,用tll 取出第一次的过期时间,继续设置为第二次的过期时间。
第二种:
使用SETRANGE命令
用 value 参数覆写(overwrite)给定 key 所储存的字符串值,从偏移量 offset 开始。
>SET greeting "111111"
"OK"
>ttl greeting
"-1"
>EXPIRE greeting 30
"1"
>ttl greeting
"25"
>SETRANGE greeting 0 "222222"
"6"
>GET greeting
"222222"
>ttl greeting
"16"
第三种:
如果你的value值为数字,nice可以进行实现自增操作,不改变生命周期。

总结:
第一种: 不适用,中间的存在偏差,但已经很小了。
方案是可行,但不够完美。
第二种: 很实用,但是不好理解。
第三种: 是做自增操作,那就意味着你的值只能是数字,也不能指定自增的值,不能满足任何场景。
文章讨论了在实现图片验证码时遇到的问题,即如何使用Redis管理用户在30秒内错误输入次数不超过3次的限制。提出了三种策略:一是通过获取并保持原有的过期时间;二是利用SETRANGE命令更新值和过期时间;三是利用Redis的自增功能更新数字值。作者指出了每种方法的优缺点,如第一种方法可能存在时间偏差,第二种方法实用但复杂,第三种方法适用于数字值但限制较多。
1万+

被折叠的 条评论
为什么被折叠?



