主要使用的是hash结构来存储用户数据,列表来存储访问的频率
email.to.id存储的是邮箱和用户id的对应关系
user:{$userID}存储的是用户的email、password、nickname基本数据
retrieve.password.code:{$verifyCode}存储的是该验证码发送给的email
rate:limit:{$email}存储的是该邮箱的访问的时间
注册:
1、判断email是否已经被注册过
$redis->hexists('email.to.id', $email);
2、获取一个自增的用户ID
$redis->incr('users:count');
3、存储用户的基本信息
$redis->hmset("user:{$userID}", ['email' => $email, 'password' => $password, 'nickname' => $nickname]);
4、记录邮箱和用户ID的对应关系
$redis->hset('email.to.id', $email, $userID);
登录:
1、获取用户ID
$redis->hget('email.to.id', $email);
2、获取密码
$redis->hget("user:{$userID}", 'password')
3、比较输入的密码和获取的密码
忘记密码:
1、访问频率限制
判断访问次数是否大于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);
未超过一分钟提示用户,超过才能访问
2、存储验证码
$redis->hmset("retrieve.password.code:{$verifyCode}", ['email' =>$email, 'newPassword' => $newPassword]);
3、给验证码设置过期时间
$redis->expire("retrieve.password.code:{$verifyCode}", 24*60*60);
4、发送邮件,邮件内容中的url是携带验证码
5、点击邮件中url,获取到验证码,判断验证码是否过期
$ttl = $redis->ttl("retrieve.password.code:{$verifyCode}");
6、如果$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}");
7、通过email获取用户ID,从而修改密码
$redis->hget('email.to.id', $email);
$redis->hset("user:{$userID}", 'password', $newPassword);
8、修改密码成功,删除验证码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