考慮把使用者資料完全儲存在redis中而不是使用SQL類別資料庫是否可行。
第一個麻煩是當使用者輸出使用者名稱密碼的時候如何檢索。
使用keys指令是絕不可行的,太可怕了。
設想的結構如下:
每一个用户数据存储为一个hash类型:
key user:info:unique-identification(int or uuid)
hash-key-email: hash-value-email
hash-key-cellphone: hash-value-cellphone
hash-key-password: hash-value-password
hash-key-nickname: hash-value-nickname
hask-key-right01: hash-value-right01
……
用hash类型存储email=>unique-identification检索数据
key email:index
hash-key-valueOfEmial: hash-value-unique-identification
用hash类型存储cellphone=>unique-identification检索数据
key cellphone:index
hash-key-valueOfCellphone: hash-value-unique-identification
判斷使用者輸入的是email還是cellphone
#從對應的資料使用hget指令取得對應的unique-identification
#如果hget獲得數據,則使用user:unique-identification作為key來取得使用者資料
#比較password,如果驗證一致,建立對應的session、cookies,登入完成。
考慮會遇到的問題:
hget的回應時間是可以接受的,這個比keys指令進行檢索快了太多,還未考慮是否可以使用LUA一次存取完成登入驗證。
但是,資料儲存成為另一個不好解決的問題,如果300萬用戶的話,只是一個email=>unique-identification檢索資料就大約300M,如果是1000萬用戶,兩種檢索就大概2G的數據了。
請問,是否有更合理的結構來解決這個問題。期待達人指教。