Redis调用lua生成验证码

场景:

? 通过微信公众号拿验证码在APP上绑定,为了防止重复,尝试使用reids-lua的方法实现此功能

以下是 php 调用 redis.eval 方法传入的 lua 方法,当然这只是修改后的,保留了主要逻辑

local time = 1542363164 // unix时间戳
local code = redis.call(‘get‘,1)
if (code) then
    return code
else
    local i = 0
    while(true) do
        math.randomseed(time+i)
        code = math.random(100000,999999)
        if (1 == redis.call(‘setnx‘,1,code)) then
            return code
        end
    end
end
return 0

乍一看没问题,但是要知道 redis 在创建 lua 环境的时候,第6步是这样的(具体为什么是这样的 https://redisbook.readthedocs.io/en/latest/feature/scripting.html#id2)

用 Redis 自己定义的随机生成函数,替换 math 表原有的 math.random 函数和 math.randomseed 函数,新的函数具有这样的性质:每次执行 Lua 脚本时,除非显式地调用 math.randomseed ,否则 math.random 生成的伪随机数序列总是相同的。

也就是说,如果不改变randomseed,random返回的序列会总是相同的,所以会拿到同样的值。

这就需要考虑一个场景:

? 一秒内有600个用户同时访问, randomseed 会一直增加到time+600,会把未来10分钟的时间戳都占用。一秒内请求越多,占用未来时间戳越多,循环时间就越长。

? 就是一个秒数只能承载一个用户的验证码,想来想去,决定使用拼接的方式实现 math.randomseed(time .. i) 这样一个秒数可以实现承载更多。

原文地址:https://www.cnblogs.com/lisq/p/10011345.html

时间: 2024-07-29 17:30:47

Redis调用lua生成验证码的相关文章

.Net Core使用分布式缓存Redis:Lua脚本

一.前言 运行环境window,redis版本3.2.1.此处暂不对Lua进行详细讲解,只从Redis的方面讲解. 二.Redis的Lua脚本 在Redis的2.6版本推出了脚本功能,允许开发者使用Lua语言编写脚本传到Redis中执行,在Lua脚本中也可以调用大部分的Redis命令.使用脚本有以下三个好处: (1) 减少网络开销:有些时候需要多次请求Redis获取处理数据,而使用脚本功能就可以只使用一次请求完成相同操作,减少了网络往返时延. (2) 原子操作:Redis会将整个脚本作为一个整体

android 生成验证码图片

(转自:http://blog.csdn.net/onlyonecoder/article/details/8231373) 1 package com.nobeg.util; 2 3 import java.util.Random; 4 5 import android.graphics.Bitmap; 6 import android.graphics.Canvas; 7 import android.graphics.Color; 8 import android.graphics.Pai

生成验证码总结

java生成验证码总结 1.serialVersionUID    private static final long serialVersionUID = -8501285780349046114L;    Java的序列化机制是通过在运行时判断类的serialVersionUID来验证版本一致性的.相当于java类的身份证.主要用于版本控制. 2.BufferedImage类    --BufferedImage 子类描述具有可访问图像数据缓冲区的 Image.    TYPE_INT_RG

生成验证码效果

生成验证码效果    ValidateCode.java 验证码生成类 Java代码   package cn.dsna.util.images; import java.awt.Color; import java.awt.Font; import java.awt.Graphics2D; import java.awt.image.BufferedImage; import java.io.FileOutputStream; import java.io.IOException; impor

vs项目中使用c++调用lua

在前一篇文章中,我们已经讲了如何编译lua源码并生成lua.lib(请阅读 使用vs2010编译lua5.1源码生成lua.lib),在新的项目中,我们继续使用之前的项目来学习如何使用c++调用lua. 一.创建项目 同样在该解决方案中,右键解决方案->添加项目->命名为testlua,选择win32控制台程序->不需要其他配置,选择完成. 二.配置项目 右键testlua项目->通用属性->框架和引用->添加新引用,指向lua项目. 右键testlua项目->配

lua入门之二:c/c++ 调用lua及多个函数返回值的获取

当 Lua 调用 C 函数的时候,使用和 C 调用 Lua 同样类型的栈来交互. C 函数从栈中获取她的參数.调用结束后将返回结果放到栈中.为了区分返回结果和栈中的其它的值,每一个 C 函数还会返回结果的个数(the  function  returns  (in  C)  the  number  of  results  it  is leaving on the stack.). // luacallcpp.cpp : 定义控制台应用程序的入口点. // #include "stdafx.

使用jsp生成验证码

在开发中验证码是比较常用到有效防止这种问题对某一个特定注册用户用特定程序暴力破解方式进行不断的登陆尝试的方式. 此演示程序包括三个文件: 1.index.jsp:登录页面 2.image.jsp:生成验证码图片页面 3.result.jsp:结果页面 [页面代码] 1.index.jsp <html> <body> <form method=post action="result.jsp"> <input type=text name=inpu

PHP--TP框架----生成验证码的方式

TP框架----生成验证码的方式 xianshi.html <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <

HttpServletResponse应用----生成验证码

1.1生成随机图片用作验证码 生成图片主要用到BufferedImage类 package gacl.response.study;import java.awt.Color;import java.awt.Font;import java.awt.Graphics;import java.awt.Graphics2D;import java.awt.image.BufferedImage;import java.io.IOException;import java.util.Random;im