Redis
1.Redis简介
1.1 NoSQL非关系数据库
以key-val存储,不支持ACID,适合场景:高并发、海量数据读写。
Redis是典型的NoSQL数据库
1.2 Redis应用场景
1.2.1 配合关系型数据库做高速缓存
- 高频次,热门访问的数据,降低数据库IO
- 分布式架构,做session共享
1.2.2 多样的数据结构存储持久化数据
1.3 Redis介绍相关知识
- redis 默认端口号:6379 默认有16个数据库
- Redis是单线程+多路IO复用技术
- 与Memcache三点不同:redis 支持多种数据类型、支持持久化、单线程+多路IO复用
1.4 Redis常用的5大数据类型
1.3.1. 符串String
1.3.2. 哈希Hash
1.3.3. 列表List
1.3.4. 集合Set
1.3.5. 有序集合 Sorted set (底层实现结构)
数据结构采用的是跳表结构,查找时间复杂度(log(n))
链接: 聊聊Mysql索引和redis跳表 —redis的有序集合zset数据结构底层采用了跳表原理 时间复杂度O(logn)(阿里).
1.5 Redis 键(key )命令
链接: Redis各种命令-菜鸟教程.
1.6 redis 配置文件介绍
1.6.1 bind
1.6.2 protected-mode
将本机访问保护模式设置为:no。
不然不支持远程访问。
1.6.3 port
默认端口:6379
1.6.4 tcp-backlog
2. Redis的发布和订阅(本质:一种消息通信模式)
2.1 什么是发布和订阅
- Redis发布订阅(pub/sub)是一种消息通信模式:发送者发送消息,订阅者接受消息。
- Redis可以订阅任意数量的频道。
2.2 Redis的发布和订阅
2.3 发布订阅命令行实现
链接: 菜鸟教程.
3 Redis 新数据类型
3.1 Bitmaps
用二进制位作为信息的基本单位。
3.2 HyperLogLog
统计基数的数量
3.3 Geographic
4 Jedis操作redis
4.1 Jedis常用操作
之前用命令操作的均可以用jedis-api完成。
4.2 Redis_Jedis实例
4.2.1 随机生成6位验证码
4.2.2 每个手机每天只能发送三次,验证码放到Redis中,设置过期时间
5. Springboot整合Redis
链接: Springboot整合Redis参考视频.
链接: 博客链接.
分三个阶段
- 在pom.xml导入两个依赖
- 在springboot 配置文件中配置Redis ip地址、端口号、连接池
- 在项目中新建Redis一个配置类,配置Redis其他相关内容
6. Redis中事务的操作
6.1事务的操作原理
6.2 事务的三个操作命令
6.3 事务的冲突问题
案例:双十抢购商品
三个人拥有一个账户购买商品会超额,同时也会出现超时连接。
解决办法: 用redis连接池解决超时连接问题;用乐观锁解决超卖问题;这时会出现库存遗留问题,需要用Lua脚本去实现。
6. 4解决事务冲突的问题: 悲观锁与乐观锁
悲观锁与乐观锁(cas)的区别:
乐观锁适用于平时的抢票场景
6.5 watch 操作命令实现乐观锁
6.6 Redis中事务的三个特性
7. Redis持久化操作
7.1 RDB(Redis-DataBase)
在相同时间间隔内以数据快照的方式存在dump.rdb
采用了“写时复制技术”
特点:对数据敏感性要求不高,可能最后一次丢失数据
7.2 AOF(append only file)
在文件末尾追加内容,根据更新时间策略(aof频率同步操作)更新appendonly.aof
当appendonly.aof达到一定的容量时,会进行Rewrite压缩。
8. Redis 主从复制
8.1 搭建一主两从Redis的步骤
8.2 主从复制的原理
8.3 一主二仆、薪火相传、反客为主
反客为主:slaveof no one ---->将从slave 变为master服务器.
8.4 哨兵模式(反客为主的自动版)
故障恢复
9.Redis 集群
9.1 Redis为什么要集群?
容量不够,redis 如何进行扩容?并发写操作,redis如何分摊?
Redis集群 实现了对redis的水平扩容,即启动N个redis节点,将整个数据库分布存储在这个N节点中,每个节点存储总数据的1/N.
9.2 什么是slot插槽?
9.3 redis 故障恢复?
9.4 集群Redis开发
即便链接的不是主机,集群会自动切换主机存储,主机写,从机读
无中心化主从集群。无论是哪台主机写的数据,其他主机上都能读到数据。
public class JedisClusterTest{
public static void main(String[] args){
Set<HostAndPort>set = new HashSet<HostAndPort>();
set.add(new HostAndPort("192.168.31.211",6379));
JedisCluster jedisCluster = new JedisCluseter(set);
jedisCluster.set("k1","value1");
System.out.println(jedisCluster.get("k1"));
}
}
10. Redis 应用问题解决
10.1 缓存穿透
解决方案:
10.2 缓存击穿
解决方案
10.3 缓存雪崩
- 数据库压力变大服务器崩溃
- 在极少时间段,查询大量key的集中过期情况
解决办法:
11. Redis 分布式锁 (Redis应用问题解决)
11.1 概念
1.分布式锁引入
2.分布式锁场景
3 代码分析
4 uuid误删场景
5 uuid 防止误删
6 缺乏原子性操作
7. 解决原子性问题 – lua脚本
11. 2 超卖场景:
分布式锁案例
优化:
宕机 设置过期时间
有问题
11. Redis知乎面试总结
链接: 《进大厂系列》系列-Redis常见面试题(带答案).
12. 参考视频
链接: 尚硅谷-参考视频.