Cache策略

  • 定时过期策略

    1. 定时过期的好处是Cache节点的个数符合实际需求,不会造成资源滥用和服务器压力
    2. 定时过期适合访问量较大,实时性要求不高的情况
    3. 如果访问量小,定时过期会造成Cache命中率低,如果实时性要求高,过期间隔太小,Cache的意义就不大
    4. 适用情况 : 实时性低
  • 全量刷新策略
    1. 全量刷新的好处是Cache命中率高,Cache实时性高
    2. 全量数据相比那些Cache key值设置不好的非全量Cache,可能反而更小
    3. 全量刷新的弊端是有可能造成服务器的压力,如果数据使用率低,就是对资源的滥用
    4. 全量刷新适合数据量小或者数据使用率高的应用
    5. 适用情况 : 数据量小
  • 定时刷新策略
    1. 定时刷新的Cache节点个数和Cache大小成正比,需要综合考虑Cache命中率和数据量设定节点个数
    2. 节点数过大会造成Cache庞大,过小会造成命中率低
    3. 定时刷新的频率和实时性成正比
    4. 定时刷新对服务器资源有一定的滥用
    5. 需要开发人员了解具体服务的访问量数据量,制定合适的节点个数与刷新频率
    6. 使用情况 : 其他策略无法满足
  • 定时过期+磁盘持久化策略
    1. 过期Cache存磁盘文件,系统下线所有cache持久化
    2. 分布式Cache机制,互相备份,错开重启
    3. 可以在一定条件下舍弃数据库
  • Cache与访问量,数据量,定时性的关系
    1. 访问量大,数据量大,实时性高,可以使用复杂的定时刷新,还需要根据实际情况做优化
    2. 访问量小,数据量大,实时性高,可以使用定时刷新或不用Cache
    3. 数据量小,实时性高,可以使用全量刷新
    4. 访问量大,数据量大,实时性低,可以使用定时过期
    5. 访问量小,数据量大,实时性低,可以使用定时过期或者定时刷新

智能Cache策略

  • UserPreference cache
  • Subscription cache
  • 分时间段的Cache,某些时间段的某些cache不过期,需要通过分析流量制定时间段

穿透优化

  • 缓存穿透

    1. 发生大量不存在的key的访问,会加重对数据库层的压力
  • 优化方法
    1. 缓存空对象key:null

      1. 空对象使用一个比较短的过期时间
      2. 用主动刷新策略应对key又被存入数据库的情况
      3. 实现成本低,占用内存不可控(由非法key和合法key的比例决定)
    2. 布隆过滤器拦截
      1. BloomFilter缓存所有存在的key,进行第一层过滤
      2. 会降低缓存的性能,实现成本高,占用内存可控
    3. 不使用传统的低性能的数据库

无底洞优化

  • 无底洞现象

    1. 分布式存储随着节点数的增加以及key的随机分布,批量操作的网络传输次数怎加造成性能不增反减
  • 优化方法
    1. 串行IO

      1. 先将批量查询的key所在的节点做mapping
      2. 属于相同节点的key合并一组,循环的所有组进行查询
    2. 并行IO
      1. 对串行IO作多线程处理
    3. hash tag
      1. 将相同hash tag的数据存储在同一个节点
      2. 一次批量查询只操作相同hash tag的key
      3. 容易产生数据分布不均衡

缓存重建优化

  • 问题

    1. 高并发的热点key+数据对象大重建缓慢
    2. 数据过期等情况造成大量线程来重建缓存,使得服务崩溃
  • 优化方法
    1. 永不过期或者timeToIdle+主动更新
    2. 互斥锁:Redis可以用setnx实现
    3. 用户请求不重建缓存,用单独线程合并用户请求重建缓存

热点key集中化优化

其他等待解决疑问

  • Server resource的个数大小如何定
  • resourcePool的个数与大小
  • Manage the CacheManager/Cahce/Entity
  • load balance
  • Thread Pools线程池
  • key生成策略

CacheManager/Cache等实例数量与大小的考虑

  • server resource & resource pool

    1. server resource可以多设置几个,比如每个1-5G这样,设置5个备用,每个可以给一个CacheManager使用
    2. 一个server resource里可以设置一个或多个resourcePool用于clusteredShared,一个或多个resourcePool用于clusteredDedicated,这个要根据实际需求
    3. 一旦clusted端建立了CacheManager,此CacheManager所占用的resourcePool就会被分配给这个CacheManager,所以resourcePool的大小应该更具项目实际情况设置,以免造成资源浪费
    4. 一个pool满了,就使用下一个,而不是增加它的大小,不然会影响所有使用者
    5. 也可以使得pool的大小动态获取,而不是hard code
  • CacheManager
    1. 不同的业务模块创建不同的CacheManager实例,可以保持业务模块独立性

      1. 比如说可以单独清除一个CacheManager的所有Cache
    2. 多个CacheManager,配置代码在不同项目的复用会出现问题,如何解决?
      1. 用一个项目创建CacheManager,其他项目用缺省的方式连接CacheManager
    3. 单个CacheManager和多个CacheManager的性能问题?多个CacheManager真的必要么?
  • Cache
    1. 不同的业务模块创建不同的Cache实例,可以保持业务模块独立性

      1. 不同的业务模块可以使用不同的key规则
      2. 可以独立的管理cache,比如删除等操作
      3. 可以更合理的定制Cache大小,提高cache命中率
      4. 可以更合理的定制Expiry
    2. 通过不同的Expiry策略创建不同的Cache实例
      1. 方便开发,无须每次都创建新的cache
    3. clusteredDedicated
      1. 必须指定cache的大小,不适合producer/consumer的方式,因为consumer必须知道producer设置的大小
      2. 能够更好的更具实际需要利用内存资源
    4. clusteredShared
      1. 不需要指定每个cache大小,方便producer/consumer主从互换
      2. Shared pool的大小必须足够大,而且基本不变,才能方便使用,这样便会造成内存的浪费
      3. Shared pool的变化会造成所有producer/consumer的配置要变
    5. clustered继承
      1. 解决了clusteredDedicated的问题
      2. 但是如果有两个以上的producer或者spring cache那样自己也是producer,还是必须统一配置
  • 不方便的地方
    1. spring cache无须手动create cache,但是ehcache clustered必须手动,因为每个cache的配置更灵活
    2. withCache/createCache创建新cache,必须用autoCreate,在原来的CacheManager实例里创建新的cache并且连接
  • 动态cache配置机制
  • 多个Cache不同项目的配置
    1. 配置服务化[不推荐]

      1. 将配置信息封装成配置对象
      2. service提供获取配置对象服务
      3. 造成client项目依赖service或者cache项目
    2. 主从互换
      1. service与client都去判断cluster端是否存在cache,如果不存在,那么创建,否则继承
      2. 造成cache manage也无法继承
      3. 无法保证service与client创建cache时使用相同配置
      4. 适合clusteredShared
      5. 不适合clusteredDedicated的原因是client必须知道service端设置的大小
      6. 如果有两个以上的producer,也不适合clustered继承
    3. 完美主从互换[跨项目组的情况下建议使用]
      1. 方法1: service提供Cache配置服务,client获取配置创建cache,配置服务使得service必须有服务提供
      2. 方法2: common jar的形式保证创建cache时使用相同配置
      3. 方法3: service方提供client代码,client利用client代码创建cache
      4. 保证service与client创建cache时使用相同配置
      5. service必须知道自己的cache的配置,无法使用动态cache配置机制
      6. 需要动态cache配置的时候只适合clusteredShared,否则可以使用clusteredDedicated
      7. 这个工作需要额外开发,很麻烦啊,两害取其轻,还是使用clusteredShared+动态pool size吧,一点点浪费总比不可控也增加开发/维护难度好
    4. service主导[不推荐]
      1. client判断cluster端是否存在cache,如果不存在,那么创建,否则继承
      2. service判断cluster端配置是否符合自己要求,如何不符合,删除cache重新创建,否则直接创建
      3. 但是必须所有cache manager close()
      4. 适合clusteredDedicated

Cache架构设计的更多相关文章

  1. MySQL性能调优与架构设计——第 15 章 可扩展性设计之Cache与Search的利用

    第 15 章 可扩展性设计之Cache与Search的利用 前言: 前面章节部分所分析的可扩展架构方案,基本上都是围绕在数据库自身来进行的,这样是否会使我们在寻求扩展性之路的思维受到“禁锢”,无法更为 ...

  2. MVC实用架构设计(三)——EF-Code First(5):二级缓存

    前言 今天我们来谈谈EF的缓存问题. 缓存对于一个系统来说至关重要,但是是EF到版本6了仍然没有见到有支持查询结果缓存机制的迹象.EF4开始会把查询语句编译成存储过程缓存在Sql Server中,据说 ...

  3. MVC实用架构设计(三)——EF-Code First(4):数据查询

    前言 首先对大家表示抱歉,这个系列已经将近一个月没有更新了,相信大家等本篇更新都等得快失望了.实在没办法,由于本人水平有限,写篇博客基本上要大半天的时间,最近实在是抽不出这么长段的空闲时间来写.另外也 ...

  4. [转载] Codis作者黄东旭细说分布式Redis架构设计和踩过的那些坑们

    原文: http://mp.weixin.qq.com/s?__biz=MzAwMDU1MTE1OQ==&mid=208733458&idx=1&sn=691bfde670fb ...

  5. 两年内从零到每月十亿 PV 的发展来谈 Pinterest 的架构设计(转)

    原文:Scaling Pinterest - From 0 To 10s Of Billions Of Page Views A Month In Two Years 译文:两年内从零到每月十亿 PV ...

  6. MySQL性能调优与架构设计-架构篇

    架构篇(1) 读书笔记 1.Scale(扩展):从数据库来看,就是让数据库能够提供更强的服务能力 ScaleOut: 是通过增加处理节点的方式来提高整体处理能力 ScaleUp: 是通过增加当前处理节 ...

  7. web架构设计经验分享(转)

    本人作为一位web工程师,着眼最多之处莫过于 性能与架构,本次幸得参与sd2.0大会,得以与同行广泛交流,于此二方面,有些心得,不敢独享,与众博友分享,本文是这次参会与众同撩交流的心得,有兴趣者可以查 ...

  8. 谈一款MOBA游戏《码神联盟》的服务端架构设计与实现

    一.前言 <码神联盟>是一款为技术人做的开源情怀游戏,每一种编程语言都是一位英雄.客户端和服务端均使用C#开发,客户端使用Unity3D引擎,数据库使用MySQL.这个MOBA类游戏是笔者 ...

  9. Redis缓存项目应用架构设计二

    一.概述 由于架构设计一里面如果多平台公用相同Key的缓存更改配置后需要多平台上传最新的缓存配置文件来更新,比较麻烦,更新了架构设计二实现了缓存配置的集中管理,不过这样有有了过于中心化的问题,后续在看 ...

随机推荐

  1. HDU 5552 Bus Routes(NTT+分治)

    题意 给定 \(n\) 个点,任意连边,每条边有 \(m\) 种颜色可选,求带环连通图的方案数. \(1\leq n\leq 10000\) \(1\leq m < 2^{31}\) 思路 直接 ...

  2. vi中换行、翻页和查找功能

    vi时,按ESC进入Command模式, 1. 移动光标命令:j 向下移动一行:k 向上移动一行:h 向左移动一个字符:l 向右移动一个字符:对于 j.k.l和h键,命令前加数字,移动多行:如 3j, ...

  3. Linux md5sum 的用法

    MD5 算法常常被用来验证网络文件传输的完整性,防止文件被篡改.MD5 全称是报文摘要算法,此算法对任意长度 的信息逐位计算,产生一个二进制长度为 128 位(十六进制长度 32 位)的报文摘要,不同 ...

  4. 微信小程序计算器模拟后续

    今天按着自己的思路又重打了一遍 wxml没什么说的,就是分块起名,显示数字和结果的作为屏幕,数字键盘一行四块 <view class="onTop"> <view ...

  5. Cordova结合Vue学习Camera

    简单聊两句 学习Vue+Cordova打包编译App,首先你要安装Cordova与vue,在这里本人就不说明了,自行看文档与搜索相关资料. Cordova中文官网地址 Vue中文官网地址 第一步:首先 ...

  6. C#中Equals和= =(等于号)的比较)

    C#中Equals和= =(等于号)的比较) 相信很多人都搞不清Equals和 = =的区别,只是零星的懂一点,现在就让我带大家来进行一些剖析 一.           值类型的比较 对于值类型来说  ...

  7. 『TensorFlow』变量初始化

    变量初始化实质 initializer操作的流程是调用Variable节点组中的Assign节点为节点操作单元分配初始值 变量初始化方法 tf.Variable_initializer([variab ...

  8. 2、使用Angular-CLI初始化Angular项目(踩过的深坑!!!)

    1.step1:建一个放项目的文件夹,打开cmd,或vs code的终端,找到文件夹根目录 2.step2:初始化脚手架 初始化命令: ng new 项目名称 --skip-install 注意:-- ...

  9. 1-express学习

    1.在安装完node.js后,在Windows里面的cmd命令下,输入:express myapp --ejs 2.打开创建的工程myapp目录:cd myapp 3.安装:npm install 4 ...

  10. ThinkPHP5的数据操作和Thinkphp3.2.3对比小结

    前言: 由于Thinkphp5和Thinkphp3.2.3的版本差距过大, 在记忆方面容易混淆. 故特意记录一下在数据操作上的对比的不同. Tp3.2.3 增:add(),addAll() 查:fin ...