基于Session实现登录
Session登录流程图:
![](https://img-blog.csdnimg.cn/img_convert/3fb3ecdb0cd79c66e4f32373bceab9e7.png)
若是单体服务,可以基于Session实现登录问题。但是在集群部署的情况下Session存在共享问题:因为多台Tomcat并不共享Session的存储空间,当请求切换到不同的Tomcat时会造成数据丢失的问题。
基于redis实现共享Session登录
redis实现流程图:
![](https://img-blog.csdnimg.cn/img_convert/8b838a239ed9f8521c9600c7e14717f0.png)
与上面Session实现登录图对比可发现redis实现是把用户信息存储在了redis中,因为redis是内存存储的,在redis集群部署下可以实现数据共享,解决了在集群部署下Session数据共享的问题。
在redis中存储用户信息时可以使用String结构或者Hash结构存储。
Sting结构是以JSON字符串进行保存,比较直观,便于查询观察,但是操作比较麻烦,每次都要使用序列化和反序列化,有一定开销。而且不便于单独操作用户的某个属性。
Hash结构可以将对象的每个字段独立存储,可以针对单个字段做crud,但是占用内存会比String稍微多一些
Redis代替session需要考虑的问题:
选择合适的数据结构
选择合适的key
选择合适的存储粒度