关于Redis

Redis

Redis

事务:哪个事务最先执行 exec 哪个业务相应的先执行 布隆过滤器:解决redis和mysql之间击穿的问题 ,通过 bigmap 在redis中存储mysql所有数据的索引 缓存LRU:这个涉及到redis的内存清理,有LRC 和LFC ,定时清理等多种清理方式 LFC:通过最少使用时间 LFC:最少使用次数 时间1:到时间点自动清理 时间2:当内存满了后,会先清理快到期的数据

持久化

RDB 通过开启一个子线程 通过 fork的的形式复制数据 - 缺点,宕机会丢失数据 AOF 通过日志文件的形式记录操作 - 缺点,文件大,有IO操作

redis 基本应用

用于做缓存:多使用RDB 允许数据的丢失 用于做数据库:使用AOF 记录所有操作日志

单机redis可能会出现的问题

  1. 单点故障
  2. 容量有限
  3. 压力

redis高可用解决了什么问题

通过上面的三个问题,在高可用的设计模式使用有 AKF 这个概念

  1. 通过 多机扩容 解决单点故障
  2. 通过 业务分离 解决容量有限
  3. 通过 一个业务多个redis 解决压力

同样高可用会涉及到数据一致性的问题

高可用在应用上要注意的点

主从,主备:一般都是对主高可用,即主redis 需要部署多台

一致性问题

强一致性:通过redis阻塞,实现 弱一致性:通过异步实现 弱一致性升级版,通过加入 kafa 消息队列,来保证数据的一致性,并且还可以保证数据不会丢失

redis中的模式

哨兵模式:当master节点宕机,可以设置从节点为master节点 ,即可以 解决redis单点问题 分区(Cluster):可以实现 业务分离,解决单机容量问题 - 同时也带来了 数据聚合的问题 - 通过 hash tag 实现数据被放在同一个分区 进而实现事务 - 可以使用代理实现分区 比如(twemproxy predixy) - 分区代理的事务的问题 - predixy 在只开启一个分组的情况下,可以实现事务 - twemproxy 不能解决事务的问题 - redis的 create-cluster + hash tag 能解决分区 分槽 事务问题

面试题常见问题

  • 击穿 在高并发下,需要请求的数据 在redis正好没有或者被过期处理了,并发直接请求到数据库
    • 解决方案,通过redis锁,阻塞住请求,以达到并发请求的目的
    • 同时 获得锁的用户请求数据库,并把数据返回到redis
    • 后面的数据通过 redis 拿对应的值

1

  • 穿透 业务接收查询的的是你数据库中根本没有的数据
    • 解决方案: 使用布隆过滤器

2

  • 雪崩 大量的key失效,间接照成大量访问数据库 3

  • 分布式锁

    • 使用redis实现
    • zookeeper 实现