赞
踩
缓存穿透 | 缓存击穿 | 缓存雪崩 | |
---|---|---|---|
描述 | 查询不存在的数据 | 某小段时间大量相同查询达到存储层 | 缓存无法提供服务,大量请求打到存储层 |
可能原因 | 1. 缓存和库中数据被删除 2. 恶意攻击 | 某些热点数据过期失效 | 大量数据过期,或Redis宕机 |
解决方法 | 1. 缓存空对象,未命中时将空值存入缓存 2. 布隆过滤器拦截 | 1. 热点数据永不过期 2. 互斥加锁,多线程访问redis某key无数据时,只有一个线程能去存储层查询并存入redis,然后其它线程再从redis取数据 | 1. 避免数据同时过期,设置过期时间为随机值 2. 降级和熔断,对于非核心请求直接返回预定义信息 3. 构建高可用服务 |
命令 | 示例和描述 |
---|---|
PERSIST | PERSIST key-name —— 移除键的过期时间 |
TTL | TTL key-name —— 查看给定键距离过期还有多少秒 |
EXPIRE | EXPIRE key-name seconds —— 让给定键在指定的秒数之后过期 |
EXPIREAT | EXPIREAT key-name timestamp —— 将给定键的过期时间设置为给定的 UNIX 时间戳 |
PTTL | PTTL key-name —— 查看给定键距离过期时间还有多少毫秒 |
PEXPIRE | PEXPIRE key-name milliseconds —— 让给定键在指定的毫秒数之后过期 |
PEXPIREAT | PEXPIREAT key-name timestamp-milliseconds —— 将一个毫秒级别精度的 UNIX 时间戳设置为过期时间 |
LRU和LFU的算法代码见这里
当写入数据将导致超出maxmemory限制时,Redis会采用maxmemory-policy所指定的策略进行数据淘汰。该策略包含如下八种。
策略 | 描述 | 版本 |
---|---|---|
noeviction | 直接返回错误; | |
volatile-ttl | 从设置了过期时间的键中,选择过期时间最小的键,进行淘汰; | |
volatile-random | 从设置了过期时间的键中,随机选择键,进行淘汰; | |
volatile-lru | 从设置了过期时间的键中,使用LRU算法选择键,进行淘汰; | |
volatile-lfu | 从设置了过期时间的键中,使用LFU算法选择键,进行淘汰; | 4.0 |
allleys-random | 从所有的键中,随机选择键,进行淘汰; | |
allkeys-lru | 从所有的键中,使用LRU算法选择键,进行淘汰; | |
allkeys-lfu | 从所有的键中,使用LFU算法选择键,进行淘汰; | 4.0 |
前缀含义:
LRU与LFU:
从 Redis 的 v1.0 到 v6.0 版本之前,Redis 的核心网络模型一直是一个典型的单 Reactor 模型。Redis v6.0 才改造成多线程模式。
Redis的主要瓶颈是内存和网络带宽,而非CPU。6.0引入多线程解决网络IO问题。
涉及的多线程 | |
---|---|
Redis 3.0前 | 1. 持久化:BGSAVE和BGREWRITEAOF会fork子进程进行 2. 异步任务:关闭文件、将缓冲区冲洗到磁盘文件中 |
Redis 4.0 | 异步删除键值对的命令:UNLINK(DEL的异步版本)、FLUSHALL ASYNC、FLUSHDB ASYNC(删除选项,整个数据集还是单个数据库) |
Redis 6.0 | socket读写、请求解析是多线程,但命令执行是单线程(键值对操作,防止线程不安全) |
在A线程删缓存和更新数据库期间,其他线程查询并更新缓存后,会造成数据库和缓存不一致的情况。
A线程更新缓存后若数据库更新失败,会造成数据库和缓存不一致的情况。一般需要重试,一般通过异步方式进行
延时时间的设置:
布隆过滤器使用bit位存储数据。占用空间小。
可以用于拦截不存在的数据,有概率拦截到存在的数据。
value值占用内存较大
一般是因为业务涉及不合理,没有预计value动态增长
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。