目录
概念
redis是一种非关系型数据库数据库(nosql), 快速响应, 支持高并发, 快速响应大数据量, 不强调数据的强一致性;
mysql关系型数据库 | nosql非关系型数据库 |
强调数据与数据之间的关系和强一致性 | 快速响应,可以有数据冗余 |
都支持高并发,大数据量存储 |
特性
基于单线程模式设计的一款基于内存的缓存键值对数据库。
- 高并发, 使用内存, 读写更快, 但是不可靠(一般结合mysql使用)
- 原子性, 基于单线程模式高并发不存在安全问题(分布式情况下依旧存在问题)
- 数据类型丰富(String, hash, list, set, zset)
PS: redis,Nginx都是单线程模型;tomcat,mysql都是多线程模型设计
使用场景
- 高并发业务操作, 秒杀, 抢购, 削峰操作
- 高频热点数据, 频繁被查询的数据, 比如热搜
- 常量数据, 添加成功后, 基本不变动的数据, 比如字典项数据
- 需要排序的数据: 比如排行榜, 使用zset自动排行
- 计算器: 雪花算法id, 生成序列号/id主键
- 临时数据存储: 比如验证码, httpsession
redis持久化机制
- rdb持久化: 指定间隔时间,当发生指定数据改变时,把内存中的数据保存到硬盘rdb文件,下次启动reids时,加载rdb持久化文件
- 优点: 文件紧凑, 子进程处理, 数据量大恢复的比aof快
- 缺点: 没法做到秒级持久化, 新老版本可能不兼容, 服务器停机会丢失数据比aof多
- aof持久化: 固定每秒把这一秒执行的redis增删改指令保存硬盘aof文件,下次启动reids时,加载aof持久化文件.相对于rdb持久化更可靠。
- 优点: 丢失的数据更少, 日志可读, 可以处理误操作
- 缺点: 占用磁盘更多, 恢复较慢, 有性能压力
同时开启默认读取aof数据, 官方推荐同时启用, 只是作为缓存使用可以都不开启
Mysq和redis数据一致
- 删除缓存(常用, 分布式要使用延时双删: 删除缓存-->更新数据库-->线程休眠再删缓存)
- 修改msql时同时修改redis(复杂, 不用)
- 使用mq消息队列, 让多线程操作顺序执行
- 使用Nginx负载均衡, 使相同的进程放入一个队列
缓存穿透
指访问一个数据库中不存在的数据, 无法存储到缓存, 每次都直接击穿缓存, 访问数据库
- 缓存null值, 防止直接访问数据库
- 使用布隆过滤器, 通过hash算法判断key是否合法(可能误杀)
- 读取数据库时加锁, 让其他请求先休眠
- 分级缓存
缓存击穿
指同一时刻, 大量热点(集中)数据失效, 同时又有大量并发请求涌入, 直接访问数据库, 导致数据库承受不住压力;
解决方案: (不做过多阐述)
- 异步重建缓存, 逻辑过期时间小于缓存过期时间, 超时后重置缓存有效时间
- 数据库获取数据时加锁(常用)
- 热点永不过期
缓存雪崩
指同一时刻, 大量缓存失效, 同时又有大量并发(分散)请求涌入, 直接访问数据库, 导致数据库承受不住压力, 重启后又会快速崩掉
解决方案: (不做过多阐述)
- 设置不同的过期时间
- 服务降级, 限流
- 集群部署(主从, 哨兵), 一个挂掉其他顶上
Redis分布式锁
目的: 保证集群部署的添加的字段唯一
- 查询该字段是否存在
- 不存在则加分布式锁
- 加锁成功后才能添加到数据库(同时创建守护线程, 监控锁的有效时间, 定期延期)
- 操作成功释放锁(守护线程自动结束)
PS
Redis官方为什么不提供Windows版本?
因为redis 是单线程高性能的。所以单线程轮询。linxu轮询用epoll,window 用selector, 性能上来说 epoll是高于selector 的。(仅供需要了解)
所以redis推荐使用linux版本。window版本的redis是微软修改提供的