主要使用的是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