Advertisement

Redis知识点汇总

阅读量:

前言

梳理知识


说一下项目中的Redis的应用场景

首先了解Redis的主要值类型包括字符串类型的对象(string)、有序列表(list)、哈希表(hash)、集合(set)以及有序集合(zset)等五种基本类型。
主要用于缓存数据。
旨在帮助服务保持无状态的状态。
实现无锁操作以避免传统锁机制带来的性能开销和一致性问题。

在这里插入图片描述
在这里插入图片描述

Redis是单线程还是多线程

1.无论什么版本,工作线程就一个
2.6.x高版本出现IO多线程

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

单线程满足Redis的串行原子,只不过IO多线程后,把输入/输出放到更多的线程里去并行,优点如下:1.执行时间缩短,更快,2.更好的压榨系统及硬件的资源(网卡能够高效的使用)
客户端被读取的顺序不能被保障
在一个链接里(socket里)顺序是可以被保障的

Redis缓存穿透、击穿、雪崩

🔐挡住了无效请求和重复请求

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

Redis击穿

在这里插入图片描述

Redis雪崩

在这里插入图片描述

Redis存在线程安全的问题吗?为什么?

在这里插入图片描述
在这里插入图片描述

如何避免缓存雪崩

核心问题:避免DB无效/重复请求

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

Redis缓存如何回收♻️

  1. 删除过期Key
  2. 定时删除 在设置某个key 的过期时间的同时,我们创建一个定时任务,让该定时任务在该过期时间到来时,立即执行对该key进行删除的操作。优点:这种定时删除策略对内存非常友好,能够保证内存中的key一旦过期就能立即从内存中被移除。
  3. 惰性删除(Lazy delete) 设定该key 的过期时间之后,我们不会主动采取任何行动去处理它,而是等到需要获取该key的时候,再检查其是否已过期;如果已过期,则将其从内存中移除;反之则返回正常的key值。
在这里插入图片描述
在这里插入图片描述
  1. 后台进行检查与处理,在适当的时间点按段批量清理不再有效的key项。
  2. 在请求处理阶段识别并清理内存中的冗余占用空间以节省资源。

缓存如何淘汰

在这里插入图片描述
  1. 该淘汰机制禁止淘汰相关项,
  2. 基于时间限制(TTL)下,
  3. 全局范围内所有的空间,
  4. 用于存储已过时键值对的集合中

如何进行缓存的预热

a.提前给redis中嵌入部分数据,再提供服务

b.绝对不可能将所有数据一次性全部写入Redis系统中。首先会因耗时太久而无法完成任务;其次由于Redis的存储容量有限而导致无法存储全部的数据

c.需要更具当天的具体访问情况,试试统计出频率较高的热数据

接着对具有较高访问频率的热数据进行Redis存储,并可以看出这类高频率的数据量相对较大。同时我们可能需要通过多服务同时进行读取和 writes操作,并且分布式缓存机制进行预热以提升整体性能

e.然后将经过热数据嵌入处理的数据对外服务化, 这样就不至于出现 cold start, 直接导致数据库崩溃了

具体的实时方案:

  1. nginx+lua将访问量上报到kafka中

要收集并分析当前最新的实时热数据以确定哪些是关键数据我们就需要将该商品详情页的请求对应的流量日志以及实时信息采集后发送至kafka中进行处理

storm订阅kafka的数据流,并实时追踪每个商品的访问频率;该系统通过LRU内存模型优化的数据存储机制来记录访问次数。

优先用内存中的一个LRUMap去存放,性能高,而且没有外部依赖

否则,则不基于Redis而采用MySQL?因为其难以承受高并发的读写压力;而HBase虽然属于Hadoop生态系统,但其生态系统维护较为复杂,并不适合我们的需求。我们只需要统计一段时间内访问频率最高的商品,并维护一个包含前N个高频商品的列表即可。

规划每个task所需商品访问次数的数量规模后,在确定容量上限的基础上构建一个LURMap结构。具体而言,在Apache Commons Collections官方提供的实现方案下设定一个最大容量上限,在该限制下系统将通过LRU(最近使用时第一次)算法策略自动剔除不再活跃的数据项。从而保证内存资源的有效利用,在部分数据被移除的情况下也不会影响整体性能表现;因为这些被移除的数据已经被确认为非高频访问项,因此在较长时间内不会再被访问到。在下次进行操作时会重新启动该技术流程

每个storm task启动时, 利用zk分布式锁机制, 将自己的id记录在zk指定的某个节点上。

每个storm task负责统计自己这里热点数据的情况,在每次计算完成后更新该商品列表

创建并管理一个后台线程,在每隔一定时间(例如每分钟一次)执行操作:获取排名前1000的热数据列表,并进行数据同步操作至zk数据库中。

总之: 提前把数据塞入Redis,需要预知哪些数据是热数据,

数据库与缓存不一致如何解决?

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

1.redis是缓存,更倾向于稍微的有时差
2.减少DB的操作

Redis主从不一致问题:

1.Redis默认采用弱一致性机制,在异步操作中实现数据的一致性。
2.Redis中的锁机制不支持基于主从的同步方式(建议使用单实例集群、分片集群以及红黑板模型中的redlock方案),这一做法被RedisSon所采纳。
3.在配置文件中需指定客户端同步所需的最低数量,并通过设置同步因子参数来调节系统的强一致性特性。
4.wait 2 5000

描述一下Redis持久化原理

在这里插入图片描述

高版本: 启用AOF功能,该功能可借助执行日志获取全部内存数据的具体信息,同时需注重性能优化
1.规模扩大,存在冗余指令,建议采用重写策略,在后台使用线程生成一个新的AOF文件来处理内存的KV指令
2.在4.x版本中增加了更高效率的方式,将上述重写策略调整为直接引用RDB格式,将其置于AOF文件头部部分,并同步记录日志信息以提高整体效率

当万级流量打到DB上,Redis都没有抗住,怎么处理:

在这里插入图片描述

了解Redis事务的三条核心指令是什么?当第三条指令执行时出现故障时该怎么办?

Redis实现分布式锁的指令

在这里插入图片描述

全部评论 (0)

还没有任何评论哟~