【Redis实战|黑马点评】登录篇

329 阅读2分钟

SQL & NoSQL

SQL

  • 结构化(Structured)
  • 关联的(Relational)
  • SQL查询
  • 事务 -> 满足ACID原则
  • 磁盘存储
  • 垂直扩展
  • 使用场景
    • 数据结构固定
    • 相关业务对数据安全性、一致性要求较高

NoSQL

  • 非结构化(json字符串形式)
  • 无关联的(嵌套 -> 重复存储问题)
  • 非SQL
  • BASE理论
  • 内存存储
  • 水平扩展
  • 使用场景
    • 数据结构不固定
    • 对一致性、安全性要求不高
    • 对性能要求高

种类

  • 键值类型 Redis
  • 文档类型 MongoDB
  • 列类型 HBase
  • Graph类型 Neo4j

Redis特征

  • 键值(key-value)型,value支持多种不同的数据结构,功能丰富
  • 单线程,每个命令具备原子性(核心命令执行目前依然是单线程)
  • 低延迟、速度快(基于内存、IO多路复用、良好的编码)
  • 支持数据持久化
  • 支持主从集群、分片集群
  • 支持多语言客户端

RedisTemplate序列化方案

方案1

  • 自定义RedisTemplate
  • 修改RedisTemplate的序列化器为GenericJackson2JsonRedisSerializer

方案2

  • 使用StringRedisTemplate
  • 写入Redis时,手动把对象序列化为JSON
  • 读取Redis时,手动把读取到的JSON反序列化为对象

Redis企业实战课程-黑马点评

截屏2023-04-28 15.38.33.png

短信登录

导入黑马点评项目

首先,导入对应sql文件。包含:

  • tb_user:用户表
  • tb_user_info:用户详情表
  • tb_shop:商品信息表
  • tb_shop_type:商品类型表
  • tb_log:用户日记表(达人探店日记)
  • tb_follow:用户关注表
  • tb_voucher:优惠券表
  • tb_voucher_order:优惠券的订单表

单体项目(非微服务项目)

截屏2023-04-28 15.48.38.png Tomcat水平扩展

截屏2023-04-28 15.49.58.png

基于Session实现登录

截屏2023-04-28 18.50.18.png

发送短信验证码

注意: maven使用自己本地下载好的,不然有的依赖导不进去,还非常慢。(改了好久bug...)

截屏2023-04-28 21.39.49.png

截屏2023-04-29 20.48.52.png

集群的session共享问题

session共享问题: 多台Tomcat并不共享session存储空间,当请求切换到不同tomcat服务时导致数据丢失的问题。

session的替代方案应该满足:

  • 数据共享
  • 内容存储
  • key、value结构

基于Redis实现共享session登录

数据类型选择:

  • 验证码:String
  • 保存用户对象:Hash

截屏2023-04-29 21.50.36.png

截屏2023-04-29 21.53.36.png 登录校验状态:

截屏2023-04-29 21.55.21.png Redis代替session需要考虑的问题:

  • 选择合适的数据结构
  • 选择合适的key
  • 选择合适的存储粒度

单个拦截器:存在一些问题(用户频繁访问不需要登录的页面)

  • 获取token
  • 查询Redis用户
    • 不存在,则拦截
    • 存在,则继续
  • 保存到ThreadLocal
  • 刷新token有效期
  • 放行

优化拦截器:

截屏2023-04-29 22.54.39.png

什么是缓存

缓存是数据交换的缓冲区,是存储数据的临时地方,一般读写性能较高。

缓存的作用:

  • 降低后端负载
  • 提高读写效率,降低响应时间

缓存的成本:

  • 数据一致性成本
  • 代码维护成本
  • 运维成本(缓存高可用)