转载请注明出处哈:http://carlosfu.iteye.com/blog/2269678
一、什么是缓存粒度
下面这个图是很多项目关于缓存使用最常用的一个抽象,那么我们假设storage层为mysql, cache层为redis。
假如我现在需要对视频的信息做一个缓存,也就是需要对select * from video where id=?的每个id在redis里做一份缓存,这样cache层就可以帮助我抗住很多的访问量(注:这里不讨论一致性和架构等等问题,只讨论缓存的粒度问题)。
我们假设视频表有100个属性(这个真有,有些人可能难以想象),那么问题来了,需要缓存什么维度呢,也就是有两种选择吧:
(1)cache(id)=select * from video where id=#id (2)cache(id)=select importantColumn1, importantColumn2 .. importantColumnN from video where id=#id
其实这个问题就是缓存粒度问题,我们在缓存设计应该佮预估和考虑呢?下面我们将从通用性、空间、代码维护三个角度进行说明。
二、全部数据和部分数据比较
1. 两者的特点是显而易见的:
数据类型 | 通用性 | 空间占用(内存空间 + 网络码率) | 代码维护 |
全部数据 |
高 |
大 |
简单 |
部分数据 |
低 |
小
|
较为复杂 |
2. 通用性:
如果单从通用性上看,全部数据是最优秀的,但是有个问题就是是否有必要缓存全部数据,认为以后会有这样的需求,但是从经验看除了非常重要的信息,那些不重要的字段基本不会在需求里出现,也就是说这种通用性 通常都是想象出来的。太多人觉得通用性是最重要的。vid拿一些基本信息,会想专辑明星。。要不要用通用性高的,于是加了全局的,通用性很重要,但是要想清楚。
3. 空间占用:
很显然,缓存全部数据,会占用大量的内存,有人会说,不就费一点内存吗,能有多少钱?而且已经有人习惯了把缓存当做下水道来使用,什么都框框的往里面放,但是我这里要说内存并不是免费的,可以说是很珍贵的资源。instagram21->4G的例子就说明了这个道理,好的程序员可以帮助公司节约大量的资源。
而且单个cache(id)也带来两个问题:序列化的开销和网络流量的开销(QPS,百倍),都是无容忽视的。
4. 代码维护:
代码维护性,全部数据的优势更加明显,而部分数据一旦要加新字段就会修改代码,而且还需要对原来的数据进行刷新。
三、总结:
缓存粒度问题是一个容易被忽视的问题,如果使用不当,可能会造成很多无用空间的浪费,可能会造成网络带宽的浪费,可能会造成代码通用性较差等情况,必须学会综合数据通用性、空间占用比、代码维护性 三点评估取舍因素权衡使用。
相关推荐
Gradle-8.0 此版本包括对的几项改进科特林DSL。这包括一个解释器来跳过声明性插件的Kotlin编译器,并升级到Kotlin API级。...这包括通过从缓存条目加载任务并在首次构建时独立运行任务来实现更细粒度的并行性。
11-4 缓存粒度问题.mp4 11-3 缓存的更新策略.mp4 11-2 缓存的受益和成本.mp4 11-1 目录.mp4 10-9 集群缩容-操作.mp4 10-8 集群缩容-说明.mp4 10-7 集群扩容演示-2.mp4 10-6 集群扩容演示-1.mp4 10-5 扩展...
Spring 2.0的'spring-jdo.jar', 'spring-jpa.jar', 'spring-hibernate3.jar', 'spring-toplink.jar' 和 'spring-ibatis.jar' 被合并到Spring 2.5大粒度的'spring-orm.jar'中。 Spring 2.5的 'spring-test.jar' 取代...
Hibernate允许在类和集合的粒度上设置第二级缓存。在映射文件中,和元素都有一个子元素,这个子元素用来配置二级缓存。 示例:以category(产品类别)和product(产品)的映射为例: 1) 修改要配置缓存的那个持久化类的...
本系统是基于RBAC授权和基于用户授权的细粒度权限控制通用平台,并提供单点登录、会话管理和日志管理。接入的系统可自由定义组织、角色、权限、资源等。用户权限=所拥有角色权限合集+用户加权限-用户减权限,优先级...
3.1.2 程序控制 ..................................................................................................................... 15 3.2 串行化.........................................................
插件内置combo支持,对combo请求亦可版本管理和获取后细粒度拆分存储。 插件github地址: 插件源来 如果大家还记得我发的年中总结,其中里面提及了我们存储方案上的设定。 回顾一下: cookie + localStorage ...
产品特点自动缓存所有数据库查询高粒度智能缓存无效使用现有代码,安装后无需更改仅缓存特定模型或排除某些模型的可能性利用 (支持)版本兼容性LaravelPHP 拉达缓存5.1-5.6 5.6.4+ 2.x 5.7-5.8 7.1+ 3.x 6.x 7.2+ 4...
1. 目录 1. 2. 目录 .........................................................................................................................................................1 JVM .........................
Service Worker提供了更细粒度的缓存控制,支持离线应用和资源版本管理。此外,资源文件名的优化、资源压缩和CDN的使用都是提升缓存效率的有效方法。正确管理浏览器缓存能够显著提高网页加载速度,减少服务器压力,...
1. 目录 1. 2. 目录 .........................................................................................................................................................1 JVM ........................
ssm+shiro+layui+quartz实现细粒度权限控制,支持调度,支持日志监控,支持缓存,支持多数据源 运行环境: jdk8+tomcat8.0.53+mysql8.0.16.0+IntelliJ IDEA+maven+redis 项目技术: spring+spring mvc+mybatis+...
缓存维护更细粒度 @CacheNameRemove(name = AppConstants.DEFAULT_CACHENAME) @Inherited @Retention(RetentionPolicy.RUNTIME) @Target({ElementType.TYPE, ElementType.METHOD}) public @interface ...
系统采用struts、hibernate框架及中间件的结合既实现了业务逻辑与控制逻辑的有效分离,提高了层次结构的清晰度,提高了复用的粒度降低了开发代价和维护代价,同时保证了软件的质量使其更具有鲁棒性和可维护性。...
系统采用struts、hibernate框架及中间件的结合既实现了业务逻辑与控制逻辑的有效分离,提高了层次结构的清晰度,提高了复用的粒度降低了开发代价和维护代价,同时保证了软件的质量使其更具有鲁棒性和可维护性。...
4.缓存redis 5.消息中间件ActiveMQ 6.JWT认证 7.LayUI前端 8.AngularJS 9.OSS对象存储 10.JavaMail邮件收发 11.阿里大鱼发短信 12.海康威视监控接入 13.物联网网关开发快接入 14.传感器硬件交互接口 15....
Seam - 语境相关的组件[满江红20071230]..........................................................................1.6.4. Seam 的UI 控制库........................................................................
互联网的应用方式正从以面向主机的点对点通信为主转向以海量内容获取为主.为适应这一转变,研究 界提出了多种以信息/...缓存透明化、泛在化和细粒度化等新特征,对缓存系统的建模、行为理解和优化方法都提出了新的挑战
django-cacheops, 一个带有自动粒度事件驱动失效的光滑 Cacheops 支持自动或者手动queryset缓存和自动粒度事件驱动失效的平滑应用程序。它使用 redis 作为ORM缓存和redis或者 文件系统的后端,实现了简单的。还有更...