ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

Java基础知识——分布式优化策略

2020-03-05 17:39:29  阅读:169  来源: 互联网

标签:缓存 Java Hash 数据库 基础知识 线程 服务 id 分布式


缓存策略

缓存穿透
缓存穿透是指缓存和数据库中都没有的数据,而用户不断发起请求,如发起为id为“-1”的数据或id为特别大不存在的数据。
方法1:布隆过滤器
Bloom-Filter算法的核心思想就是利用多个不同的Hash函数来解决“冲突”。
Hash存在一个冲突(碰撞)的问题,用同一个Hash得到的两个URL的值有可能相同。为了减少冲突,我们可以多引入几个Hash,如果通过其中的一个Hash值我们得出某元素不在集合中,那么该元素肯定不在集合中。只有在所有的Hash函数告诉我们该元素在集合中时,才能确定该元素存在于集合中。
缺点在于可能会出现判断错误

方法2:从缓存取不到的数据,在数据库中也没有取到,这时也可以将key-value对写为key-null,缓存有效时间可以设置短点,如30秒(设置太长会导致正常情况也没法使用)。这样可以防止攻击用户反复用同一个id暴力攻击

缓存击穿
缓存击穿是指缓存中没有但数据库中有的数据(一般是缓存时间到期),这时由于并发用户特别多,同时读缓存没读到数据,又同时去数据库去取数据,引起数据库压力瞬间增大,造成过大压力
方法1:设置不过期的热点数据
方法2:利用锁(令牌桶)。缓存中没有数据,第1个进入的线程,获取锁并从数据库去取数据,没释放锁之前,其他并行进入的线程会等待100ms,再重新去缓存取数据。

缓存雪崩:
在同一时刻出现大面积的缓存过期,即原本应该访问缓存的请求直接访问数据库
方法1:加锁(令牌桶)或者队列的方式保证来保证不会有大量的线程对数据库一次性进行读写hystrix限流
方法2:缓存失效时间分散开。

缓存预热
系统上线后,加载太多数据导致奔溃
在这里插入图片描述
缓存降级
当访问量剧增、服务出现问题(如响应时间慢或不响应)或非核心服务影响到核心流程的性能时,仍然需要保证服务还是可用的,即使是有损服务。系统可以根据一些关键数据进行自动降级,也可以配置开关实现人降级。

缓存粒度控制:
对于select * from video where id=?
如果video有几百条属性,我们会选择重要的属性进行缓存
select importantColumn1, importantColumn2 … importantColumnN from video where id=#id

无底洞问题优化:
增加机器反而导致性能下降:mget返回所有给定的key值
优化 IO 的几种方法:
命令本身优化,例如慢查询 keys、hgetall bigkey;
减少网络通信次数;
降低接入成本,例如客户端使用长连接/连接池、NIO 等

热点key优化:
互斥锁(mutex key),查询数据源 -> 重建缓存 这个过程加互斥锁;
永不过期:缓存层面不设置过期时间(没有用 expire),功能层面为每个 value 添加逻辑过期时间,但发现超过逻辑过期时间后,会使用单独的线程去构建缓存。

服务隔离:
种类隔离:服务提供方,服务调用方
在这里插入图片描述
服务提供方(订单服务,库存服务):每一个服务配置一个数据库
服务调用方(支付服务):
线程池的隔离策略:
每一个微服务一个线程池
因为线程池是阻塞队列,超过的线程可以在队列里继续调用
在这里插入图片描述
信号量的隔离策略:使用一个原子计数器(或信号量)来记录当前有多少个线程在运行,请求来先判断计数器的数值,若超过设置的最大线程个数则丢弃改类型的新请求,若不超过则执行计数操作请求来计数器+1,请求返回计数器-1。这种方式是严格的控制线程且立即返回模式,无法应对突发 流量(流量洪峰来临时,处理的线程超过数量,其他的请求会直接返回,不继续去请求依赖的服务)

流量削峰

1:消息队列,排队
2:答题,利用时间分片
3:分层过滤在这里插入图片描述

标签:缓存,Java,Hash,数据库,基础知识,线程,服务,id,分布式
来源: https://blog.csdn.net/weixin_45680007/article/details/104679259

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有