redis知识点总结

1、redis为什么可以高效的进行存储和读取?
redis的存储的数据结构也是通过 key 进行hash 然后找到对应的数组位置 链表到对应的key/value对象,如果发生hash碰撞 则直接链表到其后边,取值的时候 根据其key 进项hash 找到其对应下标后迭代链表中的key 相同就取出
在这里插入图片描述
redis的key都是String类型的

redis单线程快的原因?

1、存内存操作
2、核心是基于非阻塞的IO多路复用机制
3、单线程反而避免了多线程的频繁上下文切换带来的性能问题

redis的持久化机制?
RDB: 某个时间点的内存快照,以二进制的方式存入磁盘。
手动触发:
save命令 保存数据为dump.rdb save命令会使redis处于阻塞状态,知道RDB完成。bgsave命令 会fork出一个子进程进行持久化,主进程知道fork的过程中会有短暂的阻塞,子进程创建之后,主进程就可以继续响应客户端请求了
自动触发: save m n : 在m秒内如果有n个键发生改变,则自动触发持久化,通过bgsave执行。

AOF: append only File 以日志的形式 记录服务器所处理的每一个写、删除操作、
1、 所有的写命令会追加到aof缓冲中
2、aof缓冲区 根据不同的策略 想硬盘进行同步操作
3、随着aof文件越来越大,需要定期对aof文件进行重写,达到压缩的目的。
4、redis重启时,加载aof文件 完成数据恢复
同步策略: 每秒同步 和 每修改同步

aof文件 比rdb 更新频率高,优先使用aof还原数据

redis 过期键的删除策略?

惰性过期: 只有在访问key的时候 去判断当前key是否过期,如果过期就删除,节省cpu资源 但是占用了大量内存。

定期过期: 每隔一段时间,会扫描expire一定数量的key,清除已过期的key。

redis是将两者结合使用的

redis 分布式锁的实现原理?
1、利用setnx来保证获取到锁
2、然后利用lua脚本来保证多个redis操作的原子性
3、同时还要考虑锁的过期,需要有一个看门狗的机制的定时任务来完成锁的续约

redis 和mysql 如何保证数据一致?
1、先更新mysql 再更新redis
2、先删除 再更新mysql 再次查询的时候将数据更新到redis中
3、延时双删 先删除redis 再更新mysql 再过几百毫秒再删除redis ,这样就算在更新mysl的时 有其他线程读了mysql 把数据读到了redis 也会被删除掉,从而保持了数据一致

redis 集群方案

主从模式

哨兵模式

Redis cluster

redis 主从复制的核心原理?

在这里插入图片描述

缓存雪崩、缓存穿透、缓存击穿 解决方案?

缓存雪崩: 是指缓存在同一时间大面积失效、后边的请求全部落在了数据库上,造成了数据库短时间承受了大量请求而崩掉。

解决方案:
1、缓存数据的过期时间设置随机,方式同一时间大量数据失效的场景发生
2、缓存预热 ,redis重启的时候 也会引发缓存雪崩,我们可以在重启的时候 对热点数据进行提前存储到redis 减轻数据库的压力
3、加互斥锁 使缓存请求进入排队阻塞的状态 从而避免雪崩

缓存穿透: redis中 和 数据库都不存在这个key ,导致请求都落到了数据库上,造成数据库承受大量的请求而崩掉。

解决方案:
1、接口增加校验,用户鉴权校验
2、缓存拿不到数据,数据库也拿不到,这时就把key-value 设置为key-null
3、采用布隆过滤器,将所有可能存在的数据hash到bitmap中 一定不存在的过滤器会帮你拦截

缓存击穿: 指缓存中没有,但数据库中有(缓存过期),并发量过大给数据库造成压力

解决方案: 1、设置热点数据永不过期
2、加互斥锁

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值