主要使用的是hash结构来存储用户数据,列表来存储访问的频率git
email.to.id存储的是邮箱和用户id的对应关系github
user:{$userID}存储的是用户的email、password、nickname基本数据web
retrieve.password.code:{$verifyCode}存储的是该验证码发送给的emailredis
rate:limit:{$email}存储的是该邮箱的访问的时间url
注册:.net
一、判断email是否已经被注册过code
$redis->hexists('email.to.id', $email);orm
二、获取一个自增的用户IDget
$redis->incr('users:count');hash
三、存储用户的基本信息
$redis->hmset("user:{$userID}", ['email' => $email, 'password' => $password, 'nickname' => $nickname]);
四、记录邮箱和用户ID的对应关系
$redis->hset('email.to.id', $email, $userID);
登陆:
一、获取用户ID
$redis->hget('email.to.id', $email);
二、获取密码
$redis->hget("user:{$userID}", 'password')
三、比较输入的密码和获取的密码
忘记密码:
一、访问频率限制
判断访问次数是否大于10
$redis->llen("rate:limit:{$email}")
没有超过限制的10,存入当前访问的时间
$redis->lpush("rate:limit:{$email}", time());
超过了限制的10次,
获取第一次访问的时间
$redis->lindex("rate:limit:{$email}", -1);
判断当前的时间和第一次访问的时间是否间隔一分钟
超过一分钟,存入当前访问的时间,并把第一次访问的时间移除
$redis->lpush("rate:limit:{$email}", time());
$redis->ltrim("rate:limit:{$email}", 0, 9);
未超过一分钟提示用户,超过才能访问
二、存储验证码
$redis->hmset("retrieve.password.code:{$verifyCode}", ['email' =>$email, 'newPassword' => $newPassword]);
三、给验证码设置过时时间
$redis->expire("retrieve.password.code:{$verifyCode}", 24*60*60);
四、发送邮件,邮件内容中的url是携带验证码
五、点击邮件中url,获取到验证码,判断验证码是否过时
$ttl = $redis->ttl("retrieve.password.code:{$verifyCode}");
六、若是$ttl > 0验证码没有失效,获取email、newPassword
$redis->hget("retrieve.password.code:{$verifyCode}", 'email');
$redis->hget("retrieve.password.code:{$verifyCode}", 'newPassword');
验证码失效,删除key
$redis->del("retrieve.password.code:{$verifyCode}");
七、经过email获取用户ID,从而修改密码
$redis->hget('email.to.id', $email);
$redis->hset("user:{$userID}", 'password', $newPassword);
八、修改密码成功,删除验证码key
$redis->del("retrieve.password.code:{$verifyCode}");
ps:主要写出的是redis相关的,其余功能未实现
参考文章:http://download.csdn.net/detail/mydownloadformweb/8147343
demo代码地址:https://github.com/Ritajiajia/redis_test/tree/master/test/redis-demo