Redis进阶

进阶内容概述:
1. redis 面试题
2. jvm 了解
3. 并发编程线程 重点
4. java进阶 面向对象设计原则设计模式
5. spring框架 重点
6. mysql 重点
7. 分布式微服务架构
8. 面试讲解

Redis

非关系型数据库,以键值对形式存储在内存中,支持多种数据类型,支持数据持久化
使用场景:
1. 缓存(mybatis一级二级缓存)访问量大的(秒杀,点赞),修改少的,存储验证码(定时)
2. 计数器(点赞)
3. 排行榜(zst)
4. 数据去重(set)
5. 消息队列(list)排号
6. 分布式锁

Redis线程模型

6.0之前是单线程模式的,处理客户端和读写操作是一个线程的
6.0之后是多线程,将客户端链接请求部分采用多线程处理,执行读写命令依然采用单线程(线程安全的)

为什么设计为单线程模型速度也很快
  1. 基于内存操作:读写都是在内存中进行的
  2. 底层存储结构是哈希表,通过key计算哈希值,快速定位
  3. 单线程设计避免线程切换,减小开销

Redis持久化

Redis数据存储在内存中有可能数据丢失,所以提供数据持久化机制
两种方式:
RDB方式:是Redis中默认的持久化方式,以快照方式将某一时刻的Redis数据保存到rdb文件中,redis.conf文件中可以配置save规则
AOP方式:以日志形式记录写操作(增删改)命令,恢复数据时,逐行执行命令即可,在配置文件中开启,才可以

Redis和Mysql如何保证数据一致

  1. 当更新完Myqsql后,立即更新redis,万一更新失败,会出现不同步问题
  2. 先删除redis中的数据,然后更新MySQL。也会出现问题,一个线程更新,MySQL事件还未提交,另一个查的还是之前的数据
  3. 延时双删:先删除redis中的数据,更新MySQL,等更新完成后在定时删除redis

Redis事物

为了保证一组中的多条命令作为一个整体执行,执行过程中,其他过程不能打断执行
集合中有命令报错,不会影响其他命令执行成功
示例:

multi 开启事务
set a aa 添加命令
set b bb 添加命令
incr b 添加命令
exec 执行事务

主从复制(集群)

一台作为主机,其余作为从机,实现数据的备份,即使一台机器宕机,其他机器还能正常运行,保证数据的完整,写入命令,直接送入主机执行,会自动备份到从机实现读写分离,分担redis压力

哨兵模式

在redis的集群中可以配置哨兵(进程),哨兵会定期给每个redis发送指令,如果能正常接收到指令,说明redis服务正常,否则redis故障,一旦检测主机宕机,哨兵会从从机中选举出一个作为主机。

Key过期策略

  1. 惰性删除:当key过期时,标记为过期的状态(字典,记录过期的key)下一次使用时再删除
  2. 定期删除:每搁一定时间,清楚已过期的key

缓存穿透、缓存击穿、缓存雪崩

穿透:数据库的数据不存在(如-1),导致key对应的数据不存在,会查询MySQL(相当于把redis架空)
措施:
1. 参数验证,不合法参数进行拦截
2. 设置一对key:null再次请求过来直接回null
击穿:key在对应的数据库中存在,但在redis的某个时间节点过期了,大量请求过来,redis中不存在,会查询MySQL
措施:
1. 给访问MySQL的代码加锁
2. 热点数据设置为永不过期
雪崩:是在大量的key失效时就是雪崩,是击穿的PLUS
措施:
1. 随机设置key失效时间,避免大量key集体失效
2. 主从复制(宕机的情况下)
3. 定时任务,查看key是否快过期,可以重新设置定时时间

你可能感兴趣的:(redis,数据库,缓存)