网站建设合同严瑾,南宁行业平台开发公司,免费机械加工网,wordpress 前台多语言CPU占用#xff1a;如果你有某些应用需要消耗大量的cpu去计算#xff0c;比如正则表达式#xff0c;如果你使用正则表达式比较频繁#xff0c;而其又占用了很多CPU的话#xff0c;那你就应该使用缓存将正则表达式的结果给缓存下来。
数据库IO性能#xff1a;如果发现有大… CPU占用如果你有某些应用需要消耗大量的cpu去计算比如正则表达式如果你使用正则表达式比较频繁而其又占用了很多CPU的话那你就应该使用缓存将正则表达式的结果给缓存下来。
数据库IO性能如果发现有大量数据需要频繁查询使用或者某些数据不会频繁变更时为了提高数据库IO性能可以使用缓存
缓存定义 所谓缓存就是将程序或系统经常要调用的对象存在内存中一遍其使用时可以快速调用不必再去创建新的重复的实例。这样做可以减少系统开销提高系统效率。
缓存主要可分为二大类:
通过文件缓存,顾名思义文件缓存是指把数据存储在磁盘上不管你是以XML格式序列化文件DAT格式还是其它文件格式
内存缓存也就是创建一个静态内存区域将数据存储进去例如我们B/S架构的将数据存储在Application中或者存储在一个静态Map中。
本地缓存 所谓的本地缓存是相对于网络而言的包括集群数据库访问等
在系统中有些数据数据量小但是访问十分频繁例如国家标准行政区域数据或者一些数据字典等针对这种场景需要将数据搞到应用的本地缓存中以提升系统的访问效率减少无谓的数据库访问数据库访问占用数据库连接同时网络消耗比较大
但是有一点需要注意就是缓存的占用空间以及缓存的失效策略。
分布式/集群缓存定义 传统单机缓存概念的一个延伸用于表示能跨越多台服务器同时具有可扩展性的缓存。说白了就是将本地缓存数据存储到远程可集群的缓存载体上利用网络进行数据交换的一种缓存方式
常用集群载体RedisMemcached
多级缓存 定义系统中使用多种缓存本地缓存及分布式缓存技术对数据进行缓存应用数据时按照优先级先本地后分布式对数据进行依次读取如果所有缓存中都无数据则对数据库进行数据读写并将取到的数据依次先分布式后本地进行缓存更新
为什么使用多级缓存技术以一级缓存L1(Caffeine)和二级缓存L2Redis举例
如果只有L1那么在系统重新部署后缓存数据全部消失
如果只要L2使用Redis很多系统都会使用云服务这时访问Redis会有一定的网络I/O以及序列化反序列化虽然性能很高但是其终究没有本地内存L1快
多级缓存常用技术 利用Caffeine做一级缓存Redis作为二级缓存。
首先去Caffeine中查询数据如果有直接返回。如果没有则进行第2步。
再去Redis中查询如果查询到了返回数据并在Caffeine中填充此数据。如果没有查到则进行第3步。
最后去Mysql中查询如果查询到了返回数据并在RedisCaffeine中依次填充此数据。
对于Caffeine的缓存如果有数据更新只能删除更新数据的那台机器上的缓存其他机器只能通过超时来过期缓存超时设定可以有两种策略
设置成写入后多少时间后过期
设置成写入后多少时间刷新
缓存更新 先删除缓存再更新数据库。
这个操作有一个比较大的问题在对缓存删除完之后有一个读请求这个时候由于缓存被删除所以直接会读库读操作的数据是老的并且会被加载进入缓存当中后续读请求全部访问的老数据。
先更新数据库再删除缓存推荐
有一个数据此时是没有缓存的所以查询请求会直接落库更新操作在查询请求之后但是更新操作删除数据库操作在查询完之后回填缓存之前就会导致我们缓存中和数据库出现缓存不一致但是这个问题几率特别小。
为什么要删除缓存而不是更新缓存
你可以想想当有多个并发的请求更新数据你并不能保证更新数据库的顺序和更新缓存的顺序一致那就会出现数据库中和缓存中数据不一致的情况。所以一般来说考虑删除缓存。
缓存坑货三剑客 缓存穿透
解释缓存穿透是指查询的数据在数据库是没有的那么在缓存中自然也没有所以在缓存中查不到就会去数据库取查询这样的请求一多那么我们的数据库的压力自然会增大
解决方案
约定:对于返回为NULL的依然缓存对于抛出异常的返回不进行缓存,注意不要把抛异常的也给缓存了。采用这种手段的会增加我们缓存的维护成本需要在插入缓存的时候删除这个空缓存当然我们可以通过设置较短的超时时间来解决这个问题。
制定一些规则过滤一些不可能存在的数据小数据用BitMap大数据可以用布隆过滤器比如你的订单ID 明显是在一个范围1-1000如果不是1-1000之内的数据那其实可以直接给过滤掉。
缓存击穿
解释对于某些key设置了过期时间但是其是热点数据如果某个key失效可能大量的请求打过来缓存未命中然后去数据库访问此时数据库访问量会急剧增加。
解决方案
加分布式锁:加载数据的时候可以利用分布式锁锁住这个数据的Key,在Redis中直接使用setNX操作即可对于获取到这个锁的线程查询数据库更新缓存其他线程采取重试策略这样数据库不会同时受到很多线程访问同一条数据。
异步加载:由于缓存击穿是热点数据才会出现的问题可以对这部分热点数据采取到期自动刷新的策略而不是到期自动淘汰。淘汰其实也是为了数据的时效性所以采用自动刷新也可以。
缓存雪崩
解释缓存雪崩是指缓存不可用或者大量缓存由于超时时间相同在同一时间段失效大量请求直接访问数据库数据库压力过大导致系统雪崩。
解决方案
增加缓存系统可用性,通过监控关注缓存的健康程度根据业务量适当的扩容缓存。
采用多级缓存不同级别缓存设置的超时时间不同及时某个级别缓存都过期也有其他级别缓存兜底。
缓存的过期时间可以取个随机值比如以前是设置10分钟的超时时间那每个Key都可以随机8-13分钟过期尽量让不同Key的过期时间不同。
缓存监控 很多人对于缓存的监控也比较忽略基本上线之后如果不报错然后就默认他就生效了。但是存在这个问题很多人由于经验不足有可能设置了不恰当的过期时间或者不恰当的缓存大小导致缓存命中率不高让缓存就成为了代码中的一个装饰品。所以对于缓存各种指标的监控也比较重要通过其不同的指标数据我们可以对缓存的参数进行优化从而让缓存达到最优化