设计存储的数据结构
首先我们要思考一下利用Redis来存储数据,那么到底使用哪种结构呢?由于存入的数据比较简单,我们可以考虑使用String或者hash ,如下图。

String结构与Hash结构存储值的比较:
- String的值是将Java对象序列化为JSON字符串的形式保存,更加直观,操作也更加简单,但是JSON结构会有很多非必须的内存开销,比如双引号、大括号,内存占用比Hash更高。
- Hash的值是以hash表的形式保存,通过field单独存储对象中每个属性的值,对单个字段增删改查更加灵活,hash类型存储空间占用比String类型更小 这里我们选择使用hash结构来实现存储。
设计Key的细节
关于key的处理,session是每个用户都有自己独立的session,因此key可以写死为code,因为每个session有不同的sessionId来保证唯一性。但是Redis的key是共享的,就不能使用硬编码的key了。(session中用户A与用户B的code可以相同)
因此在设计key的适合,需要满足两点:
- key要具有唯一性
- key要方便客户端携带,方便从Redis中取出这个value 如果我们采用phone手机号作为key来存储当然是可以的,但是如果把这样的敏感数据存储到Redis中并且从页面中带过来毕竟不太合适。所以我们在后台生成一个随机串token,tomcat并不会像sessionId那样把token自动写到客户端浏览器中,因此我们需要手动的把token返回给客户端,客户端保存token作为登录凭证,之后客户端携带着token来发送请求,后端服务器验证token后就可以基于token从Redis中获取数据。
整体访问流程
注册完成,用户登录校验用户提交的手机号和验证码是否一致,如果一致,根据手机号查询用户信息,不存在则新建,最后将用户数据保存到Redis,生成token作为Redis的key,当校验用户是否登录时,携带token访问,从Redis取出token,获得对应的value,判断是否存在,不存在则拦截,存在则保存到threadLocal
