1.前言&基本介绍

    在原始的系统架构中,我们都由程序直接连接DB,随着业务的进一步开展,DB的压力越来越大,为了缓解DB的这一压力,我们引入了缓存,在程序连接DB中加入缓存层,

从而减轻数据库压力,而且缓存一般存在于内存中,相比于存在硬盘中的DB在读取速度上绝对是比DB高几个等级。下面我们来简单聊聊关于缓存几个东西

2.缓存的优缺点

    缓存的优点就是“快”,一个快字基本能概括了。如上文说的加速读写,分流对数据库的压力,归根结底就是对快字的应用及其本身,缺点主要是如下三点:

      1.数据不一致性:DB的数据与缓存中的数据不一致

      2.开发成本:需要同时处理缓存层跟DB层的逻辑,增加了开发成本

      3.维护成本:例如需要对缓存层进行一个监控,增加了运维的成本

3.缓存更新策略

    在上面中我们说到数据不一致性,一般来说缓存也是需要有生命周期的,需要被更新或者删除,这样才能保持缓存的可控性,在缓存更新中有如下三点:

      1.LR(F)U/FIFO算法删除:简单来说就是按照队列的形式对不常用的缓存进行删除,链表的形式来实现,具体可点这里http://blog.csdn.net/maddemon/article/details/6650703
 
      2.超时删除:在设置缓存的时候可以设置过期时间,在时间到期之后自动删除。在使用这个的时候,最好还是确保缓存数据跟数据库数据不一致的时候业务能容忍,还是存在一致性的问题
 
      3.主动更新:应用于对数据一致性要求高的,但最好还是需要保证更新的准确性。假如对实时性要求不高的,还是根据超时删除吧
 

4.缓存粒度

    假设一张用户表有20个字段,那是否需要将全部字段都放到缓存中?这就涉及到一个粒度的问题!数据字段放少了,就会出现了不通用的问题;数据字段放多了,空间占用也多,序列化跟反序

列化消耗的性能更多了。在粒度这个问题上还是需要根据通用性,代码维护,性能跟空间占用这几点上进行考虑, 简单来说就是靠经验了

5.缓存穿透

     缓存穿透指的是查询一个不存在的数据,DB跟缓存都不会命中的数据。这样的话每次查询都会到DB层中查询,DB层负载加大还有可能造成死机,这样缓存就失去了保护DB层的意义。出现这种情况有两种:1.攻击,爬虫的大量请求;2.业务自身有问题。现在基本流行的解决方案有以下两种:

      5.1 缓存空对象,当DB层也查不到数据的时候,缓存一个null值进缓存,这样下一次的话就直接从缓存中读取,保护了后端。不过这种带来的后果是缓存了更多的键,需要更多的空间,而且不可控性增加

 
      5.2布隆过滤器拦截,它利用位数组很简洁地表示一个集合,并能判断一个元素是否属于这个集合。这样在查询缓存之前先去过滤器中查询缓存是否有存在该key。不过这个适合于数据量固定,实时性低的应用中,因为要维护这一个过滤器。
 

6.雪崩优化

    指的是原先的缓存层承载了大量的请求,有效的保护了DB层,但是假如缓存层炸了,那所有的请求都直接穿透到DB层,会容易造成DB层也炸了。就这个问题一直没有一个很完美的解决方案,可以从下列两个方面进行思考:

      6.1.保证缓存层的高可用(HA),例如redis的Sentinel跟Cluster都实现了高可用(在windows10下跑这个sentinel,偶尔会出现节点挂了但是sentinel没反应过来的情况,还是linux稳定一点)
 
      6.2.提前演练,这个类似与实验设计,模拟某一层挂了的处理情况
 

7.总结

  最后用Xmind总结一下:

  

《Redis开发与运维》快速笔记(一)的更多相关文章

  1. Redis开发与运维学习笔记

    <Redis开发与运维>读书笔记   一.初始Redis 1.Redis特性与优点 速度快.redis所有数据都存放于内存:是用C语言实现,更加贴近硬件:使用了单线程架构,避免了多线程竞争 ...

  2. Redis开发与运维:SDS

    STRING 我们会经常打交道的string类型,在redis中拥有广泛的使用.也是开启redis数据类型的基础. 在我最最开始接触的redis的时候,总是以为字符串类型就是值的类型是字符串. 比如: ...

  3. Redis 开发与运维

    Getting Start 高性能 性能优势的体现 C语言实现的内存管理 epoll的I/O多路复用技术+IO连接/关闭/读写通过事件实现异步的非阻塞IO TCP协议 单线程架构,不会因为高并发对服务 ...

  4. Redis实战(七)Redis开发与运维

    Redis用途 1.缓存 Redis提供了键值过期时间设置, 并且也提供了灵活控制最大内存和内存溢出后的淘汰策略. 可以这么说, 一个合理的缓存设计能够为一个网站的稳定保驾护航. 2.排行榜系统 Re ...

  5. 《Redis开发与运维》

    第1章 初识Redis 1. Redis介绍: Redis是一种基于键值对(key-value)的NoSQL数据库. 与很多键值对数据库不同的是,Redis中的值可以是由string(字符串).has ...

  6. 《Redis开发与运维》读书笔记

    一.初始Redis 1.Redis特性与优点 速度快.redis所有数据都存放于内存:是用C语言实现,更加贴近硬件:使用了单线程架构,避免了多线程竞争问题 基于键值对的数据结构,支持的数据结构丰富.它 ...

  7. Redis开发与运维

    常用命令 redis-server启动redis redis-server /opt/redis/redis.conf    配置启动 redis-server --port 6379 --dir / ...

  8. redis 开发与运维 学习心得1

    主要是命令相关 第一章 初识Redis 1.redis是基于键值对的NoSQL. 2.redis的值可以是 string, hash, list, set, zset, bitmaps, hyperl ...

  9. Redis开发与运维:linux安装

    Linux 安装 我的系统是inux 系统,官网下载 https://redis.io/download redis-5.0.5.tar.gz 解压: 编译安装: 官网和文档说得已经很清楚了,现在就执 ...

随机推荐

  1. adb获取Android系统属性(adb shell getprop ***)数据来源

    在Android系统中,它的根文件系统下有几个用于启动系统时需要的配置文件: /init.rc /default.prop /system/build.prop 通常我们可以通过命令getprop获取 ...

  2. for、while循环(java基础知识四)

    1.循环结构概述和for语句的格式及其使用 * 什么是循环结构 循环语句可以在满足循环条件的情况下,反复执行某一段代码,这段被重复执行的代码被称为循环体语句,当反复执行这个循环体时,需要在合适的时候把 ...

  3. How to run Media SDK samples on Skylake【转载】

    In the last few days, we have seen lot of concern for using Intel® Media 2016 on 6th generation Inte ...

  4. Prime Cryptarithm

    链接 分析:对于三位数我们限定为[100,999],两位数我们限定为[10,99],然后我们依次判断是否满足乘法式且各个数位是否在数列中,若都满足+1 /* PROB:crypt1 ID:wangha ...

  5. HNOI2008 GT考试 (KMP + 矩阵乘法)

    传送门 这道题目的题意描述,通俗一点说就是这样:有一个长度为n的数字串(其中每一位都可以是0到9之间任意一个数字),给定一个长度为m的模式串,求有多少种情况,使得此模式串不为数字串的任意一个子串.结果 ...

  6. javaScript的几个问题简答

    1.javascript的typeof返回哪些数据类型    Object.number. function. boolean. underfind 2.例举3种强制类型转换和2种隐式类型转换?    ...

  7. HTTP错误code大全

    100 - Continue 101 - Switching Protocols Top Success Codes 200 - OK 201 - Created 202 - Accepted 203 ...

  8. Unity3D4.* NGUI制作动态字库

    新建一个工程,这个工程必须没有中文路径,否则会不识别字体!!! 首先导入NGUI插件,这里我用的是NGUI 3.0.2版本的. 在Assets 下创建一个文件夹,用来存放接下来的工作文件 . 这里随便 ...

  9. View Controller Programming Guide for iOS---(七)---Resizing the View Controller’s Views

    Resizing the View Controller’s Views A view controller owns its own view and manages the view’s cont ...

  10. 基于puppeteer的网络拦截工具flyover

    为什么需要网络拦截工具 通常我们会遇到这样的场景: 线上一个图片有异常,线下修正之后需要发布之前进行测试,有些情况下,QA同学有直接在线上环境测试的需求,只是链接本地资源,通常在windows下有一个 ...