收藏私塾在线
 

欢迎您来到私塾在线网!   

请登录! 

免费注册 

交流首页 » Java »缓存使用的最佳实践  提现最快的斗地主游戏
发表人 内容
aierdaa
[头像]

交流经验:
总积分:100
级别:普通会员
注册时间: 2013-12-15
文章: 8
离线

本文地址:http://www.panxinet.com/forum/posts/list/14638.html
文章摘要:缓存使用的最佳实践 ,我并不是个月白头如新,排水工程晒太阳老少配。

最佳实践1
缓存系统主要消耗的是服务器的内存,因此,在使用缓存时必须先对应用需要缓存的数据大小进行评估,包括缓存的数据结构、缓存大小、缓存数量、缓存的失效时间,然后根据业务情况自行推算未来一定时间的容量的使用情况,根据容量评估的结果来申请和分配缓存资源,否则会造成资源浪费或者缓存空间不够。
最佳实践2
建议将使用缓存的业务进行分离,核心业务和非核心业务使用不同的缓存实例,从物理上进行隔离,如果有条件,则请对每个业务使用单独的实例或者集群,以减少应用之间互相影响的可能性。笔者经常听说有的公司应用了共享缓存,造成缓存数据被覆盖,以及缓存数据错乱的线上事故。
最佳实践3
根据缓存实例提供的内存大小推送应用需要使用的缓存实例数量,一般在公司里会成立一个缓存管理的运维团队,这个团队会将缓存资源虚拟成多个相同内存大小的缓存实例,例如,一个实例有 4GB 内存,在应用申请时可以按需申请足够的实例数量来使用,对这样的应用需要进行分片。这里需要注意,如果我们使用了 RDB 备份机制,每个实例使用 4GB 内存,则我们的系统需要大于 8GB 内存,因为 RDB 备份时使用 copy-on-write 机制,需要 fork 出一个子进程,并且复制一份内存,因此需要双份的内存存储大小。
最佳实践4
缓存一般是用来加速数据库的读操作的,一般先访问缓存,后访问数据库,所以缓存的超时时间的设置是很重要的。笔者曾经在一家互联网公司遇到过由于运维操作失误导致缓存超时设置得较长,从而拖垮服务的线程池,最终导致服务雪崩的情况。
最佳实践5
所有的缓存实例都需要添加监控,这是非常重要的,我们需要对慢查询、大对象、内存使用情况做可靠的监控。
最佳实践6
如果多个业务共享一个缓存实例,当然我们不推荐这种情况,但是由于成本控制的原因,这种情况经常出现,我们需要通过规范来限制各个应用使用的 key 一定要有唯一的前缀,并进行隔离设计,避免缓存互相覆盖的问题产生。
最佳实践7
任何缓存的 key 都必须设定缓存失效时间,且失效时间不能集中在某一点,否则会导致缓存占满内存或者缓存穿透。
最佳实践8
低频访问的数据不要放在缓存中,如我们前面所说的,我们使用缓存的主要目的是提高读取性能,曾经有个小伙伴设计了一套定时的批处理系统,由于批处理系统需要对一个大的数据模型进行计算,所以该小伙伴把这个数据模型保存在每个节点的本地缓存中,并通过消息队列接收更新的消息来维护本地缓存中模型的实时性,但是这个模型每个月只用了一次,所以这样使用缓存是很浪费的,既然是批处理任务,就需要把任务进行分割,进行批量处理,采用分而治之、逐步计算的方法,得出最终的结果即可。
最佳实践9
缓存的数据不易过大,尤其是 Redis,因为 Redis 使用的是单线程模型,单个缓存 key 的数据过大时,会阻塞其他请求的处理。
最佳实践10
对于存储较多 value 的 key,尽量不要使用 HGETALL 等集合操作,该操作会造成请求阻塞,影响其他应用的访问。
最佳实践11
缓存一般用于交易系统中加速查询的场景,有大量的更新数据时,尤其是批量处理,请使用批量模式,但是这种场景较少。
最佳实践12
如果对性能的要求不是非常高,则尽量使用分布式缓存,而不要使用本地缓存,因为本地缓存在服务的各个节点之间复制,在某一时刻副本之间是不一致的,如果这个缓存代表的是开关,而且分布式系统中的请求有可能会重复,就会导致重复的请求走到两个节点,一个节点的开关是开,一个节点的开关是关,如果请求处理没有做到幂等,就会造成处理重复,在严重情况下会造成资金损失。
最佳实践13
写缓存时一定写入完全正确的数据,如果缓存数据的一部分有效,一部分无效,则宁可放弃缓存,也不要把部分数据写入缓存,提现最快的斗地主游戏:否则会造成空指针、程序异常等。
最佳实践14
在通常情况下,读的顺序是先缓存,后数据库;写的顺序是先数据库,后缓存。
最佳实践15
当使用本地缓存(如 Ehcache)时,一定要严格控制缓存对象的个数及生命周期。由于 JVM 的特性,过多的缓存对象会极大影响 JVM 的性能,甚至导致内存溢出等问题出现。
最佳实践16
在使用缓存时,一定要有降级处理,尤其是对关键的业务环节,缓存有问题或者失效时也要能回源到数据库进行处理。
关于缓存使用的最佳实践和线上案例,请参考《可伸缩服务架构:框架与中间件》一书的第4章的内容,预计在2018年3月份上市。
数据库设计要点
索引
提起数据库的设计要点,我们首先要说的就是数据库索引的使用,在线上的服务中,任何数据库的查询都要走索引,这个是底线,不能因为数据量暂时较小就不使用索引,久而久之可能数据量增大就导致了性能问题,一般每个开发者都有建立索引和使用索引的意识,然而,问题出现在开发者使用索引的方法上。我们要保证建立的索引的有效性,一定要确保线上的查询最后走到了索引,曾经就出现过这样的一个低级错误,某个场景需要根据 A、B、C 三个字段联合查询,开发者分别在 A、B 和 C 上建立了3个索引,看似也符合规范,但是实际上只用了 A 这个索引,B 和 C 的都没有用上,后来由于产生了性能问题,代码走查的时候才发现。
我们建议每个开发者对使用的 SQL 都要查看执行计划,另外,SQL 和索引要经过 DBA 的审阅才能上线。
另外,对于一般的数据库,>=、BETWEEN、IN、LIKE 等都可以走索引,而 NOT IN 不能走索引,如果匹配的字符以 % 开头,是不能走索引的,这些必须记住了。
范围查询
任何针对数据库的范围查询,都要有最大结果集条数的限制,然后进行分页处理,不能因为暂时数据量小而采用开发式的 SQL 语句,如果这样的话,在数据上量以后,会导致结果集太大,而让应用 OOM。

这篇文章被编辑了 1 次. 最近一次更新是在 2019-03-06 15:05:58


推广链接
精品视频课程推荐

Java Web开发理论部分视频教程
系统掌握开发实际的Java Web应用所需的理论知识和技能(Servlet、Jsp、JavaBean、TagLib、EL、JSTL、MVC模式、连接池DataSource、JNDI等知识)。涉及项目:在线投票计数、在线人数统计、登录检查、购物车、商品管理、非法字符替换等多个随堂演示小应用。

Spring3开发实战-独家视频教程
从零到精通Spring3的开发知识;IoC/DI的思想、IoC/DI的运行流程、IoC/DI的开发指导、AOP的思想、AOP的运行流程、AOP应用的设计、Spring对JDBC和Hibernate的支持、Spring的事务、SSH的集成应用

深入浅出学Spring Web MVC视频教程
系统、完整的学习Spring Web MVC开发的知识。包括:Spring Web MVC入门;理解DispatcherServlet;注解式控制器开发详解;数据类型转换;数据格式化;数据验证; 拦截器;对Ajax的支持;文件上传下载;表单标签等内容;最后以一个综合的CRUD带翻页的应用示例来综合所学的知识

 
交流首页 » Java
前往:   

关于我们 | 联系我们 | 用户协议 | 私塾在线服务协议 | 版权声明 | 隐私保护

版权所有 Copyright(C)2009-2012 私塾在线学习网