目录:

  • 缓存更新策略
  • 缓存粒度
  • 缓存穿透
  • 缓存雪崩
  • 缓存击穿

缓存更新策略:

1、内存溢出淘汰策略

当redis的使用内存超过maxmemory时会触发相应的策略,具体策略由maxmemory-policy参数控制

淘汰策略分为六种:

)noeviction:默认策略,此策略不会删除任何数据;当客户端还进行写操作时将返回OOM(内存溢出)

)volatile-lru:根据LRU算法删除设置了过期时间的key,如果没有可删除的key,回退到noevication策略

)volatile-random:随机删除过期的key

)allkeys-lru:根据LRU算法从所有的key里删除

)allkeys-random:随机算出所有的key

)volatile-ttl:根据对象ttl属性删除最近将要过期的key,若没有回退到noevication策略

不推荐使用noevication、allkeys-lru

2、过期删除

)惰性删除:redis有一个专门存储设置了过期时间的过期字典,每当客户端要访问一个key时,先回去这个过期字典里查,若已过期则返回空;但仅只有这一个删除策略的话就会导致一些长期未使用的key也占用这内存,故有了一个定时删除的策略

)定时删除:redis内部维护了一个job,默认每10秒运行一次;它会根据key的过期比例,使用快慢两种模式回收key

3、应用方删除

)先从缓存读取,获取不到读DB,然后再将DB读到的数据写入缓存

)先删缓存,再更新DB(不推荐),怕并发写操作导致脏数据

)先更新DB,再删缓存(推荐)

缓存粒度:

到底是缓存整个对象呢,还是缓存需要的数据呢,我们从两个方面来分析:

1、缓存整个对象

优点:通用性更好

缺点:浪费内存;网络流量大,极端情况可能会阻塞网络;序列化和反序列化的CPU开销更大

2、仅缓存需要使用的数据

优缺点与缓存整个对象恰恰相反,但是新增缓存属性时需要修改代码,而且修改后还需要刷新缓存

缓存穿透:

缓存穿透是指去访问一个根本不可能不存在的key,缓存层和持久层都不会命中,从而导致请求直接打向持久层,增加持久层的压力。

出现缓存击穿的原因:

1、自身业务实现的问题

2、恶意攻击、爬虫等

解决方案:

1、缓存空对象

缓存空对象会有两个问题:

)占用更多的内存;缓存层会有更多的键,需要更多的内存;可以通过设置过期时间解决问题

)数据不一致;若在缓存有效期时,持久层又新增了这一条数据,便会有这一问题;可以通过MQ或其它方式清除缓存中的空对象

2、布隆过滤器

布隆过滤器实际上是一个很长的二进制向量和一系列随机映射函数。布隆过滤器可以用于检索一个元素是否在一个集合中。它的优点是空间效率和查询时间都远远超过一般的算法,缺点是有一定的误识别率和删除困难。它收到一个对key请求时先用布隆过滤器验证是key否存在,如果存在在进入缓存层、存储层。

可以使用bitmap做布隆过滤器;但这种方式仅适用于数据命中不高、数据相对固定、实时性低的应用场景,代码维护较为复杂;优点是缓存空间占用少。

缓存雪崩:

我们都知道缓存层承载了大量的请求,它有效的保护了我们的DB,但缓存层也可能因为某些情况宕机了或大量缓存在同一时间失效,这样便会导致大量请求直接到达DB,导致系统雪崩。

解决方案:

1、使用高可用的sentinel、cluster方案

2、采用多级缓存,如系统进程为一级缓存,redis作为二级缓存等等

3、缓存的过期时间随机,不要让大量缓存在同一时间失效

缓存击穿:

当一个热点key过期时,恰好有大量的并发请求到这个key,此时这些并发请求就会大量的打入DB层。

出现缓存击穿的原因:

1、缓存中有热点key

2、重建缓存不能再短期内完成,如复杂计算或复杂SQL

解决方案:

1、分布式互斥锁

只允许线程重建一个缓存,其他线程需要等待重建缓存的线程执行完后才能重新从缓存获取数据。

2、永不过期

从缓存层面上看:不设置热点key的过期时间

从功能层面上看:为热点key设置一个逻辑过期时间,当超过这个逻辑过期时间后,用一个单独的线程将其缓存更新

Redis学习笔记(八、缓存设计)的更多相关文章

  1. Redis学习笔记八:集群模式

    作者:Grey 原文地址:Redis学习笔记八:集群模式 前面提到的Redis学习笔记七:主从复制和哨兵只能解决Redis的单点压力大和单点故障问题,接下来要讲的Redis Cluster模式,主要是 ...

  2. Redis学习笔记八:独立功能之二进制位数组

    Redis 提供了 setbit.getbit.bitcount.bitop 四个命令用于处理二进制位数组. setbit 命令用于为位数组指定偏移量上的二进制位设置值,偏移量从 0 开始计数. ge ...

  3. redis 学习笔记(6)-cluster集群搭建

    上次写redis的学习笔记还是2014年,一转眼已经快2年过去了,在段时间里,redis最大的变化之一就是cluster功能的正式发布,以前要搞redis集群,得借助一致性hash来自己搞shardi ...

  4. redis 学习笔记-cluster集群搭建

    一.下载最新版redis 编译 目前最新版是3.0.7,下载地址:http://www.redis.io/download 编译很简单,一个make命令即可,不清楚的同学,可参考我之前的笔记: red ...

  5. Redis学习笔记~目录

    回到占占推荐博客索引 百度百科 redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合). ...

  6. Redis学习笔记4-Redis配置详解

    在Redis中直接启动redis-server服务时, 采用的是默认的配置文件.采用redis-server   xxx.conf 这样的方式可以按照指定的配置文件来运行Redis服务.按照本Redi ...

  7. Redis学习笔记7--Redis管道(pipeline)

    redis是一个cs模式的tcp server,使用和http类似的请求响应协议.一个client可以通过一个socket连接发起多个请求命令.每个请求命令发出后client通常会阻塞并等待redis ...

  8. (转)redis 学习笔记(1)-编译、启动、停止

    redis 学习笔记(1)-编译.启动.停止   一.下载.编译 redis是以源码方式发行的,先下载源码,然后在linux下编译 1.1 http://www.redis.io/download 先 ...

  9. Redis 学习笔记4: Redis 3.2.1 集群搭建

    在CenOS 6.7 linux环境下搭建Redis 集群环境 1.下载最新的Redis版本 本人下载的Redis版本是3.2.1版本,下载之后,解压,编译(make): 具体操作可以参考我的博文:R ...

  10. Redis学习笔记(2)——Redis的下载安装部署

    一.下载Redis Redis的官网下载页上有各种各样的版本,如图 但是官网下载的Redis项目不正式支持Windows.如果需要再windows系统上部署,要去GitHub上下载.我下载的是Redi ...

随机推荐

  1. fork函数的一些小结

    今天遇到一个这样的问题,假设父进程有一个变量S,fork后,子进程中的变量S地址是否和父进程中的变量S 是相同的? 再学操作系统的时候,知道fork是采用的写时复制,所以如果子进程或者父进程不对变量S ...

  2. CentOS-7-x86_64-Minimal安装后的初始设置

    本文是给0基础的初始linux小白写的,只是方便大家尽快上手掌握使用linux系统,完成当前任务,有一定基础能力的请忽略 接上一篇的安装之后,开始配置linx的一些基本功能 1,第一步,也是最重要的一 ...

  3. postman---postman导出python脚本

    前面一直写关于postman的一些文章,大家现在都应该简单了解,其实postman还有许多的功能,这个要大家一点点的挖掘出来了,安静在给大家分享一个关于postman导出python脚本 Postma ...

  4. MYSQL5.7的安装(yum、二进制、编译安装)

    目录 一.环境说明 二.YUM安装 1.安装MYSQL-YUM源 2.安装说明 3.安装前的准备 4.安装 5.启动 三.变更root密码 四.BINARY-INSTALL 1.基础环境准备 2.建立 ...

  5. 201871010136-赵艳强《面向对象程序设计(java)》第一周学习总结

    项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/  这个作业的要求在哪里 https://www.cnblogs.com/nwnu-daizh/ ...

  6. day95_11_28,selenium定位元素,cookies获取

    一.selenium selenium可以将一些资源定位: # 1.find_element_by_id 根据id找 # 2.find_element_by_link_text 根据链接名字找到控件( ...

  7. 一道常被人轻视的web前端常见面试题(JS)

    本文转载自站长之家,如有侵权问题,请联系我,马上删除. 面试题是招聘公司和开发者都非常关心的话题,公司希望通过它了解开发者的真实水平和细节处理能力,而开发者希望能够最大程度地展示自己的水平(甚至超常发 ...

  8. IT兄弟连 Java语法教程 流程控制语句 控制循环结构1

    Java语言没有提供goto语句来控制程序的跳转,这种做法提高了程序流程控制的可读性,但降低了程序流程控制的灵活性.为了弥补这种不足,Java提供了continue和break来控制循环结构.除此之外 ...

  9. IT兄弟连 Java语法教程 流程控制语句 分支结构语句5

    5  switch-case条件语句 Java中的第二种分支控制语句时switch语句,switch语句提供了多路支持,因此可以使程序在多个选项中进行选择.尽管一系列嵌套if语句可以执行多路测试,然而 ...

  10. 前端笔记之Vue(四)UI组件库&Vuex&虚拟服务器初识

    一.日历组件 new Date()的月份是从0开始的. 下面表达式是:2018年6月1日 new Date(2018, 5, 1); 下面表达式是:2018年5月1日 new Date(2018, 4 ...