考虑把用户数据完全存储在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的数据了。
请问,是否有更合理的结构来解决这个问题。期待达人指教。
个人认为,用redis存储肯定不合理,但是是可行的。