核心内容摘要
fee性满足he性aaw
文章目录简单介绍一下Redis为什么Redis这么快分别解释缓存穿透、缓存击穿、缓存雪崩以及如何解决Redis的适用场景有哪些简单介绍一下RedisRedis(Remote Dictionary Server)远程数据服务是一个基于 C 语言开发的开源 NoSQL 数据库。
使用KV键值对存储数据数据直接保存在内存中因此读写速度快同时也提供持久化机制。
为了满足不同的业务场景Redis 内置了多种数据类型实现比如 String、Hash、Sorted Set、Bitmap、HyperLogLog、GEO。
并且Redis 还支持事务、持久化、Lua 脚本、发布订阅模型、多种开箱即用的集群方案。
为什么Redis这么快Redis快的原因主要基于以下几个方面纯内存操作Redis 数据读写操作都发生在内存中访问速度是纳秒级别而传统数据库频繁读写磁盘的速度是毫秒级别两者相差数个数量级。
内置高效数据结构Redis提供多种数据类型(String,List,Hash等)其内部采用高度优化编码方式。
Redis 会根据数据大小和类型动态选择最合适的内部编码以在性能和空间效率之间取得最佳平衡。
高效I/O模型Redis 使用单线程事件循环配合 I/O 多路复用技术让单个线程可以同时处理多个网络连接上的 I/O 事件如读写避免了多线程模型中的上下文切换和锁竞争问题。
处理数据库操作命令使用单线程执行高效简单无需进行锁竞争、CPU上下文切换等操作。
简单高效的通信协议Redis使用自身设计的RESP协议。
客户端/服务端通信对数据进行序列化/反序列化开销小有助于提升整体交互速度。
分别解释缓存穿透、缓存击穿、缓存雪崩以及如何解决先说明一下使用Redis缓存的核心目的热点数据缓存减轻数据库压力高频热点数据查询每次查关系数据库系统性能瓶颈可能直接转换为DB引入Redis进行缓存的作用分担数据库压力从而提升系统并发能力。
基于这个点再来解释上面问题缓存穿透简单点就是大量请求的 key 是不合理的根本不存在于缓存中也不存在于数据库中。
这就导致这些请求直接到了数据库上根本没有经过缓存这一层对数据库造成了巨大的压力可能直接就被这么多请求弄宕机了。
常见解决方案缓存无效key出现缓存穿透的核心原因是数据不存在就不进行缓存导致每次都查库如果对于无效key也进行缓存并设置过期时间就可以避免每次都查库。
接口限流根据用户/IP对接口限流对于频繁异常查询行为限制短时间访问次数。
布隆过滤器使用布隆过滤器先过滤大部分不存在数据请求。
缓存击穿缓存击穿中请求的 key 对应的是 热点数据该数据 存在于数据库中但不存在于缓存中通常是因为缓存中的那份数据已经过期。
这就可能会导致瞬时大量的请求直接打到了数据库上对数据库造成了巨大的压力可能直接就被这么多请求弄宕机了。
常见解决方案永不过期针对热点数据可以设置永不过期或者过期时间比较长。
更甚可以等数据热点持续时间过了之后手动管理。
提前预热针对有预期的热点数据可以提前手动将热点数据缓存并免用户访问的时候采取查询集中查询。
加锁访问在缓存失效后通过设置互斥锁确保只有一个请求去查询数据库并更新缓存其它请求自旋等待缓存更新。
缓存雪崩缓存在同一时间大面积的失效导致大量的请求都直接落到了数据库上对数据库造成了巨大的压力。
同时当服务器宕机也会导致缓存雪崩。
常见解决方案避免缓存同一时间失效可将数据设置随机时间失效/不失效保证避免同一时间大量缓存失效。
避免系统崩溃宕机使用redis分布式集群提高系统可靠性。
Redis的适用场景有哪些热点数据缓存缓存是Redis最常见的应用场景之所有这么使用主要是因为Redis读写性能优异。
限时业务使用redis中可以使用expire命令设置一个键的生存时间到时间后redis会删除它。
利用这一特性可以运用在限时的优惠活动信息、手机验证码过期等业务场景。
计时器相关场景redis由于incrby命令可以实现原子性的递增可用于分布式有序编号生成、接口限流等场景使用。
分布式锁利用redissetnx方法只有不存在时才能添加成功返回true。
分布式场景使用redis协调多服务同步。
分布式Session利用 String 或者 Hash 数据类型保存 Session 数据所有的服务器都可以访问。
限定场景下使用通过 Bitmap 统计活跃用户、通过 Sorted Set 维护排行榜、通过 HyperLogLog 统计网站 UV 和 PV。