怎样建移动网站,免费咨询在线律师,什么是响应式网站建设,网站开发的疑虑文章目录 Redis有哪几种基本类型Redis为什么快#xff1f;为什么Redis6.0后改用多线程?什么是热key吗#xff1f;热key问题怎么解决#xff1f;什么是热Key#xff1f;解决热Key问题的方法 什么是缓存击穿、缓存穿透、缓存雪崩#xff1f;缓存击穿缓存穿透缓存雪崩 Redis… 文章目录 Redis有哪几种基本类型Redis为什么快为什么Redis6.0后改用多线程?什么是热key吗热key问题怎么解决什么是热Key解决热Key问题的方法 什么是缓存击穿、缓存穿透、缓存雪崩缓存击穿缓存穿透缓存雪崩 Redis的过期策略Redis持久化方式有哪些区别Redis高可用1. 主从复制Master-Slave Replication2. Sentinel哨兵3. Cluster集群 Redis有哪几种基本类型
Redis 提供了丰富的数据类型这些数据类型使得 Redis 不仅仅是一个简单的键值存储系统而是一个多功能的 NoSQL 数据库。下面是 Redis 支持的主要数据类型及简介 String字符串 最基本的数据类型可以存储单个值如字符串、整型或浮点型数据。适用于大多数简单的键值存储需求。 Hashes哈希 哈希是一个键值对的集合每个键都是一个字段名值可以是任意类型。哈希非常适合存储对象比如用户信息其中每个字段代表用户的一个属性。 Lists列表 列表是由字符串元素构成的有序集合可以看作是一个双端队列。可以在列表的头部或尾部添加或弹出元素常用于消息队列或任务队列。 Sets集合 集合是一组无序的不重复的字符串元素。集合成员是唯一的可以进行交集、并集和差集等集合运算适用于处理唯一元素的集合。 Sorted Sets有序集合 类似于集合但每个成员都有一个分数score与其关联以此来确定成员的排序。有序集合可以高效地获取指定范围内的成员适用于排行榜、时间序列数据等场景。
详细的介绍可以看文章Redis的几种基本类型详解 Redis为什么快
Redis之所以非常快速主要归功于以下几个设计特点和技术优势 内存存储 Redis将所有的数据都保存在主服务器的内存中读写速度极快不受磁盘I/O速度的影响。由于内存访问速度远高于硬盘这大大提升了数据的读取和写入效率。 非阻塞架构 Redis采用了事件驱动的非阻塞I/O模型可以同时处理多个客户端请求无需等待慢速的I/O操作完成提高了并发处理能力。 多路复用器epoll/kqueue Redis使用了高效的事件处理器如Linux下的epoll和BSD下的kqueue这些机制可以让Redis在高负载下仍然保持良好的性能。 异步数据交换 在主从复制和持久化过程中Redis采用异步方式处理背景任务避免影响主线程的工作效率保证在线服务的速度不受影响。 精简的数据结构 Redis提供了多种高度优化的数据结构如跳跃表、压缩列表、整数集合针对不同的应用场景进行了专门的设计在节省空间的同时也加快了操作速度。 单线程模型 Redis采用单线程模型处理命令请求避免了复杂的锁竞争问题简化了内部调度流程减少了上下文切换带来的开销。 为什么Redis6.0后改用多线程?
redis使用多线程并非是完全摒弃单线程redis还是使用单线程模型来处理客户端的请求只是使用多线程来处理数据的读写和协议解析执行命令还是使用单线程。
需要注意的是Redis的多线程仅限于后台任务如AOF、BGSAVWE、IO等对于数据处理和客户端请求的处理依然保持单线程这是因为单线程模型可以避免复杂的并发控制问题保证数据的一致性和安全性。多线程的引入主要是为了释放CPU资源让主线程专注于更关键的实时数据处理工作。 什么是热key吗热key问题怎么解决
什么是热Key
在分布式缓存系统中热Key指的是那些访问频率非常高以至于对整个系统的性能产生负面影响的键值。
解决热Key问题的方法
分散热点 Key前缀随机化通过对Key增加随机前缀可以使原本相同的Key分布到不同的节点上从而分散请求的压力。 一致性Hash使用一致性Hash算法可以更好地均衡各个节点间的负载避免单一节点成为瓶颈。
缓存更新策略 延时双删法即“Cache Aside”模式的变体先删除缓存再更新数据库然后再异步更新缓存这样即使缓存失效也能防止所有请求立即打到数据库。 加锁更新在更新热Key时可以使用分布式锁确保同一时间内只有一个进程能够更新这个Key其他请求则可以从旧缓存中读取数据直到新数据准备好。
缓存降级
备用数据源当热Key失效时可以暂时使用预先准备好的静态数据或默认值作为替代避免直接访问数据库。
读写分离
对于读多写少的场景可以考虑将读操作和写操作分离使用只读副本应对大部分读请求减少主节点的负载。
限流与熔断 限流对访问频率过高的Key实施限流措施避免过度消耗资源。 熔断当检测到某个Key的访问异常时自动切断对该Key的访问直到恢复正常。 什么是缓存击穿、缓存穿透、缓存雪崩
缓存击穿
缓存击穿的概念就是单个key并发访问过高过期时导致所有请求直接打到db上这个和热key的问题比较类似只是说的点在于过期导致请求全部打到DB上而已。
解决方案
加锁更新比如请求查询A发现缓存中没有对A这个key加锁同时去数据库查询数据写入缓存再返回给用户这样后面的请求就可以从缓存中拿到数据了。 将过期时间组合写在value中通过异步的方式不断的刷新过期时间防止此类现象。
缓存穿透
缓存穿透是指查询不存在缓存中的数据每次请求都会打到DB就像缓存不存在一样。
针对这个问题加一层布隆过滤器。布隆过滤器的原理是在你存入数据的时候会通过散列函数将它映射为一个位数组中的K个点同时把他们置为1。
这样当用户再次来查询A而A在布隆过滤器值为0直接返回就不会产生击穿请求打到DB了。
显然使用布隆过滤器之后会有一个问题就是误判因为它本身是一个数组可能会有多个值落到同一个位置那么理论上来说只要我们的数组长度够长误判的概率就会越低这种问题就根据实际情况来就好了。
缓存雪崩
当某一时刻发生大规模的缓存失效的情况比如你的缓存服务宕机了会有大量的请求进来直接打到DB上这样可能导致整个系统的崩溃称为雪崩。雪崩和击穿、热key的问题不太一样的是他是指大规模的缓存都过期失效了。
针对雪崩几个解决方案
针对不同key设置不同的过期时间避免同时过期 限流如果redis宕机可以限流避免同时刻大量请求打崩DB 二级缓存同热key的方案。 Redis的过期策略
redis主要有2种过期删除策略
惰性删除 惰性删除指的是当我们查询key的时候才对key进行检测如果已经达到过期时间则删除。显然他有一个缺点就是如果这些过期的key没有被访问那么他就一直无法被删除而且一直占用内存。
定期删除 定期删除指的是redis每隔一段时间对数据库做一次检查删除里面的过期key。由于不可能对所有key去做轮询来删除所以redis会每次随机取一些key去做检查和删除。
那么定期惰性都没有删除过期的key怎么办 假设redis每次定期随机查询key的时候没有删掉这些key也没有做查询的话就会导致这些key一直保存在redis里面无法被删除这时候就会走到redis的内存淘汰机制。
volatile-lru从已设置过期时间的key中移除最近最少使用的key进行淘汰 volatile-ttl从已设置过期时间的key中移除将要过期的key volatile-random从已设置过期时间的key中随机选择key淘汰 allkeys-lru从key中选择最近最少使用的进行淘汰 allkeys-random从key中随机选择key进行淘汰 noeviction当内存达到阈值的时候新写入操作报错 Redis持久化方式有哪些区别
Redis 提供了两种主要的持久化方式RDB (Redis Database Backup) 和 AOF (Append Only File)。
RDB 使用定时记录某个时间点的内存快照将数据存储到磁盘中进行持久化。 所以可能存在数据丢失的风险在保存周期内发生故障就会丢失数据但重启后数据恢复速度相较于AOF快。
AOF AOF 记录每一次写操作命令类似于事务日志可以追加到文件末尾因此不会覆盖已有的数据。 所以相较于RDB数据完整性好但重启需要重新加载所有命令启动速度慢。
Redis高可用
Redis 高可用性的实现主要包括以下几种方式每种方法都有其特定的适用场景和优缺点
1. 主从复制Master-Slave Replication
原理通过建立一个或多个从服务器slave从主服务器master同步数据。从服务器可以用来处理读请求实现读写分离提高系统性能同时当主服务器宕机时可以从中服务器中选择一台升级为主服务器实现故障转移。优点简单易行可以实现读写分离提高读操作的性能。缺点写操作依然是单点如果主服务器失败需要手动干预进行故障转移。
2. Sentinel哨兵
原理Sentinel 是一组运行在独立 Redis 服务器上的进程它们负责监控主从服务器的状态当主服务器不可用时Sentinel 能够自动选出一个新的主服务器实现故障转移。优点自动化故障检测和故障转移降低了运维难度。缺点Sentinel 本身也需要管理增加了系统的复杂度。
3. Cluster集群
原理Redis Cluster 是一种原生的集群解决方案它不仅提供了数据分区的能力还可以实现自动故障转移。每个节点都是一个完整的 Redis 实例数据按照哈希槽的方式分布到不同节点上。优点支持水平扩展可以动态添加或删除节点自动故障转移高可用性较好。缺点配置相对复杂不适合简单的读写分离场景不支持所有 Redis 命令有一定的限制。