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企业实战课程-黑马点评
短信登录
导入黑马点评项目
首先,导入对应sql文件。包含:
- tb_user:用户表
- tb_user_info:用户详情表
- tb_shop:商品信息表
- tb_shop_type:商品类型表
- tb_log:用户日记表(达人探店日记)
- tb_follow:用户关注表
- tb_voucher:优惠券表
- tb_voucher_order:优惠券的订单表
单体项目(非微服务项目)
Tomcat水平扩展
基于Session实现登录
发送短信验证码
注意: maven使用自己本地下载好的,不然有的依赖导不进去,还非常慢。(改了好久bug...)
集群的session共享问题
session共享问题: 多台Tomcat并不共享session存储空间,当请求切换到不同tomcat服务时导致数据丢失的问题。
session的替代方案应该满足:
- 数据共享
- 内容存储
- key、value结构
基于Redis实现共享session登录
数据类型选择:
- 验证码:String
- 保存用户对象:Hash
登录校验状态:
Redis代替session需要考虑的问题:
- 选择合适的数据结构
- 选择合适的key
- 选择合适的存储粒度
单个拦截器:存在一些问题(用户频繁访问不需要登录的页面)
- 获取token
- 查询Redis用户
- 不存在,则拦截
- 存在,则继续
- 保存到ThreadLocal
- 刷新token有效期
- 放行
优化拦截器:
什么是缓存
缓存是数据交换的缓冲区,是存储数据的临时地方,一般读写性能较高。
缓存的作用:
- 降低后端负载
- 提高读写效率,降低响应时间
缓存的成本:
- 数据一致性成本
- 代码维护成本
- 运维成本(缓存高可用)