怎么用免费的网站空间,路由器当服务器做网站,南昌哪家做网站好,绵阳住房和城乡建设厅网站目录 需求看似简单#xff0c;一取一传但是#xff0c;又出现了一个新的问题#xff0c;数据丢了。 一、缓存缓存有哪些分类#xff1a; 二、分析一下本地缓存的优势三、本地缓存解决方案#xff1f;1、基于Guava Cache实现本地缓存2、基于Caffeine实现本地缓存3、基于Enc… 目录 需求看似简单一取一传但是又出现了一个新的问题数据丢了。 一、缓存缓存有哪些分类 二、分析一下本地缓存的优势三、本地缓存解决方案1、基于Guava Cache实现本地缓存2、基于Caffeine实现本地缓存3、基于Encache实现本地缓存 四、引入Redis五、Redis数据缓存策略1、为什么需要数据缓存策略2、Redis作为缓存的优势1高性能特点2多样性的缓存策略 六、LRU算法最近最少使用1、LRU算法原理解析2、redis中应用LRU算法3、LRU算法的优点与限制优点限制 七、LFU算法最不经常使用1、LFU算法原理解析2、在Redis中应用LFU算法3、LFU算法的优点与限制优点限制 八、其他数据缓存策略1、Least Recently Used with SamplingLRUSLRUS算法原理 2、Random Replacement随机替换随机替换的原理 九、性能优化与实际应用1、数据缓存策略的性能考量1缓存大小与命中率的平衡2数据访问模式的分析 2、实际应用案例电子商务网站1电子商务网站的缓存策略选择2性能优化与实际应用改进 十、总结与实践指导1、Redis数据缓存策略的重要性2、如何选择合适的缓存策略 大家好我是哪吒。
我第一次接触缓存的时候是用map做的当时做一个实时数据同步的功能。
需求看似简单一取一传
当时是通过websocket获取服务端数据然后根据数据类别将数据缓存到本地map中做了一个定时任务通过ftp上传给第三方服务器
当有并发时map是不行的数据会错乱使用ConcurrentHashMap可以解决并发数据错乱问题。
现场网络很不稳定FTP时好时坏做的是一个安全问题的实时监控系统第三方数据要求还很严格必须100%准确。
这矛盾怎么解决无解了。
起初是通过重启的方式解决的哈哈重启解决一切烦恼。
添加一个心跳功能实时监控FTP服务的状态如果断了7秒以上就采取报警功能我记得设置的是火警的音乐提示现场人员排查FTP网络如果断了1分钟以上就将软件自动重启。
但是又出现了一个新的问题数据丢了。
因为用的是ConcurrentHashMap缓存数据也就是本地缓存你重启了数据不就没了吗兄弟。
到后来才发现当时做的真的是稀烂本地缓存应该具有很多功能当时这些压根就没有。
超过最大限制有对应淘汰策略如LRU、LFU过期时间淘汰如定时、懒式、定期持久化统计监控 下面从缓存、本地缓存、Redis缓存、Redis缓存策略几个维度全方位、系统的学习一下缓存到底是个啥
一、缓存
缓存就是把访问量较高的热点数据从传统的关系型数据库中加载到内存中当用户再次访问热点数据时是从内存中加载减少了对数据库的访问量解决了高并发场景下容易造成数据库宕机的问题。
缓存有哪些分类
操作系统磁盘缓存减少磁盘机械操作数据库缓存减少文件系统 I/O应用程序缓存减少对数据库的查询Web 服务器缓存减少应用程序服务器请求客户端浏览器缓存减少对网站的访问 本地缓存在客户端本地的物理内存中划出一部分空间来缓存客户端回写到服务器的数据。当本地回写缓存达到缓存阈值时将数据写入到服务器中。
二、分析一下本地缓存的优势
数据缓存带来了诸多优势其中两个核心优点是
降低数据库压力通过将常用的数据存储在快速访问的内存中缓存有效地减轻了对后端数据库的压力。这意味着数据库可以更专注地处理复杂的查询和更新操作而不必频繁地处理重复的读取请求。提高响应速度将数据存储在缓存中使得系统能够更迅速地响应用户的请求。相比每次都从数据库中获取数据缓存可以在毫秒级别内提供所需信息从而极大地改善用户体验。 三、本地缓存解决方案
上面介绍了ConcurrentHashMap这里不再赘述。
1、基于Guava Cache实现本地缓存
Guava是Google团队开源的一款 Java 核心增强库包含集合、并发、缓存、IO、反射等工具箱性能和稳定性上都有保障应用十分广泛。
Guava Cache支持很多特性
支持最大容量限制支持两种过期删除策略插入时间和访问时间支持简单的统计功能基于LRU算法实现
2、基于Caffeine实现本地缓存
Caffeine是基于java8实现的新一代缓存工具缓存性能接近理论最优可以看作是Guava Cache的增强版功能上两者类似。
不同的是Caffeine采用了一种结合LRU、LFU优点的算法W-TinyLFU在性能上有明显的优越性。
3、基于Encache实现本地缓存
Encache是一个纯Java的进程内缓存框架具有快速、精干等特点。
同Caffeine和Guava Cache相比Encache的功能更加丰富扩展性更强。
优点
支持多种缓存淘汰算法包括LRU、LFU和FIFO缓存支持堆内存储、堆外存储、磁盘存储支持持久化三种支持多种集群方案解决数据共享问题
四、引入Redis
后来因为一次事故甲方被监管平台罚了100万本质原因就是丢数据问题。
这可如何是好我也是吓了一身冷汗连夜想整改方案最终的解决方案是“引入Redis”。
Redis作为一款高性能、内存存储的缓存数据库被广泛应用于缓存数据的场景。
用户第一次访问数据时缓存中没有数据要从数据库中获取数据因为是从磁盘中拿数据读取数据的过程比较慢。拿到数据后将数据存储在缓存中用户第二次访问数据时可以从缓存中直接获取因为缓存是直接操作内存的访问数据速度比较快。 下面将深入探讨Redis的数据缓存策略重点解析LRU最近最少使用、LFU最不经常使用等算法并分享如何通过性能优化来提升缓存系统的效率。
五、Redis数据缓存策略
1、为什么需要数据缓存策略
在现代应用中数据缓存发挥着至关重要的作用。
通过将频繁访问的数据存储在内存中我们能够避免不必要的数据库查询从而显著提升系统的响应速度和吞吐量。
然而随着应用规模和用户访问量的不断增加有效的数据缓存策略变得尤为重要。
我们需要在性能和资源利用之间找到最佳平衡以应对不同需求和挑战。
这进一步引出了一个关键问题如何选择适合的数据缓存策略来满足不同的应用场景
下图详细地说明了数据缓存的优势和选择适合的数据缓存策略的过程 通过上图我们深入探讨了数据缓存的优势并展示了在选择合适的缓存策略时我们如何在提升性能和资源利用之间找到最佳平衡。
选择适合的策略能够有效地降低数据库压力并通过提高响应速度来提供更出色的用户体验。
2、Redis作为缓存的优势
RedisRemote Dictionary Server是一款强大的高性能开源内存数据库不仅被广泛应用于缓存场景还可用作队列、发布订阅系统等。作为缓存数据库Redis拥有一系列突出的优势
1高性能特点
Redis的数据存储在内存中因此具备出色的读写性能。其高效的数据结构和优化的算法使得绝大多数情况下读写操作能够在微秒级别内完成满足了高并发应用的需求。
2多样性的缓存策略
Redis提供了多种数据缓存策略使开发者可以根据业务特点选择合适的策略。这种灵活性允许我们根据数据的访问模式、使用频率以及其他因素来决定数据何时被清理或保留。
下图说明缓存策略的选择过程 通过分析数据访问模式根据数据的访问频率选择合适的缓存策略。根据实际情况不断地监控数据的访问情况并优化缓存策略在不同的场景中灵活应用这些策略。 六、LRU算法最近最少使用
LRULeast Recently Used算法是一种经典的缓存替换策略它的核心思想是优先淘汰最近最少使用的数据以便为新数据腾出空间。在数据缓存场景中LRU算法能够保留热门数据从而提高缓存的命中率。
1、LRU算法原理解析
LRU算法的原理非常直观当缓存空间满了系统会优先淘汰最久未被访问的数据。这个策略的背后思想是如果某个数据在最近一段时间内没有被访问那么它在未来也可能不会被访问。这种替换策略有助于保持缓存中的数据是热数据即最近被频繁访问的数据。 上图说明了LRU算法如何根据访问顺序来保留缓存中的数据。最近访问的数据会被保留在缓存中而最早访问的数据会被优先替换。
示例代码如下展示了如何通过继承LinkedHashMap来实现LRU缓存
import java.util.LinkedHashMap;
import java.util.Map;class LRUCacheK, V extends LinkedHashMapK, V {private final int MAX_CAPACITY;public LRUCache(int capacity) {super(capacity, 0.75f, true);MAX_CAPACITY capacity;}Overrideprotected boolean removeEldestEntry(Map.EntryK, V eldest) {return size() MAX_CAPACITY;}
}在这个示例中我们创建了一个LRUCache类继承自LinkedHashMap。通过重写removeEldestEntry方法我们指定了当缓存大小超过一定阈值时自动删除最久未被访问的数据。
2、redis中应用LRU算法
在Redis中我们可以通过配置maxmemory-policy选项来启用LRU算法的缓存策略。当Redis的内存使用达到限制时LRU算法将被用于淘汰部分数据以便腾出空间给新数据。
以下是如何在Redis中启用LRU缓存策略的示例
# 启用LRU缓存策略
CONFIG SET maxmemory-policy allkeys-lru3、LRU算法的优点与限制 LRULeast Recently Used算法是一种常用的数据缓存策略它在管理缓存数据时有一些明显的优点和一些限制。
优点
优点描述适用于热数据LRU算法保留了最近最常访问的数据因此非常适用于具有明显访问热点的场景。简单有效LRU算法的实现相对简单不需要复杂的计算和维护。
限制
限制描述周期性访问LRU算法可能会因为数据的周期性访问而导致不必要的数据替换特别是在某些特殊业务场景中。缓存污染LRU算法容易受到突发的大量访问影响可能导致缓存中的“热·数据被淘汰从而影响缓存效果。
七、LFU算法最不经常使用
LFULeast Frequently Used算法是一种与LRU相似的缓存替换策略它的核心思想是优先淘汰最不经常使用的数据以便为新数据腾出空间。在某些特定场景下LFU算法能够更好地适应数据访问模式的变化。
1、LFU算法原理解析
LFU算法的原理与LRU算法类似但不同之处在于LFU算法基于数据被访问的频率来做出替换决策而不仅仅是访问的时间顺序。LFU算法维护了一个数据访问频率的记录当需要淘汰数据时会优先选择访问频率最低的数据。 上图说明了LFU算法如何根据数据的访问频率来保留缓存中的数据。频繁访问的数据会被保留而不经常访问的数据会被优先替换。
2、在Redis中应用LFU算法
在Redis中您可以通过配置maxmemory-policy选项来启用LFU算法的缓存策略。当Redis的内存使用达到限制时LFU算法将用于淘汰部分数据以便为新数据腾出空间。
以下是如何在Redis中启用LFU缓存策略的示例
# 启用LFU缓存策略
CONFIG SET maxmemory-policy allkeys-lfu3、LFU算法的优点与限制 LFULeast Frequently Used算法是一种另类的数据缓存策略它在不同的场景下具有一些明显的优点和一些限制。
优点
优点描述适用于频繁刷新LFU算法能够优先保留频繁被刷新的数据适合某些周期性访问的场景。对数据热度变化敏感相比于LRU算法LFU算法更能适应数据访问模式的变化能够更好地反映数据的热度。
限制
限制描述计算复杂性LFU算法需要维护数据的访问频率记录这可能导致一定的计算复杂性特别是在大规模数据场景下。冷启动问题对于刚开始访问的数据由于没有足够的访问频率信息LFU算法可能难以做出合适的替换决策。 八、其他数据缓存策略
1、Least Recently Used with SamplingLRUS
除了传统的LRU算法还存在一种改进的版本即LRUSLeast Recently Used with Sampling算法。LRUS算法通过周期性的采样来记录数据的访问情况从而更好地估计最近使用的数据减少了LRU算法中的“冷启动·问题。
LRUS算法原理
LRUS算法引入了采样机制通过周期性地记录一部分数据的访问情况从而更准确地判断哪些数据是热数据哪些是冷数据。与传统的LRU算法不同LRUS算法能够更好地适应数据访问模式的变化提高数据缓存的命中率。 上图LRUS算法通过周期性采样记录数据的访问情况从而更精确地判断哪些数据应该被保留哪些应该被替换。
2、Random Replacement随机替换
随机替换是一种简单但有效的缓存策略。与LRU和LFU不同随机替换策略不考虑数据的访问时间或频率而是随机选择要替换的数据。尽管这听起来不太智能但在某些场景下随机替换策略表现出意外的优势。
随机替换的原理
随机替换的核心思想是每次需要替换数据时从缓存中随机选择一条数据进行替换。虽然这种策略没有考虑数据的热度或频率但在一些特殊情况下随机替换能够避免特定数据被频繁淘汰从而维持一定的数据多样性。 上图中随机替换算法随机选择要替换的数据从而在一些情况下维持了数据多样性。
九、性能优化与实际应用
1、数据缓存策略的性能考量
在选择和配置数据缓存策略时性能是一个关键因素。不同的缓存策略适用于不同的业务场景因此在做出决策时需要综合考虑多个因素。
1缓存大小与命中率的平衡
在配置缓存大小时需要权衡缓存的总大小和实际存储的数据量。一个过小的缓存可能导致命中率降低无法有效减轻数据库负载而一个过大的缓存可能浪费内存资源。通常可以通过监控命中率和缓存利用率来优化缓存大小。
2数据访问模式的分析
分析业务的数据访问模式对于选择合适的缓存策略至关重要。例如如果某些数据被频繁地访问而另一些数据则很少被访问那么选择适当的策略可以提高缓存的效果。对于频繁访问的热数据可以选择LRU或者LFU策略而对于较少访问的冷数据可以考虑随机替换策略。
2、实际应用案例电子商务网站
让我们通过一个实际的应用案例来展示如何根据业务需求选择合适的缓存策略。考虑一个电子商务网站用户经常访问商品列表、商品详情以及购物车等页面。针对这个场景可以选择不同的缓存策略来优化性能。
1电子商务网站的缓存策略选择
商品列表页由于商品列表页中的商品信息经常变动可以选择LRU或者随机替换策略。这样可以保留最近的商品数据提高页面加载速度。
// 使用LRU算法实现商品列表页缓存
LRUCacheString, ListProduct productListCache new LRUCache(1000); // 缓存容量1000ListProduct cachedProductList productListCache.get(productList);
if (cachedProductList null) {// 从数据库获取商品列表数据ListProduct productList database.getProductList();productListCache.put(productList, productList);cachedProductList productList;
}商品详情页商品详情页的数据相对稳定适合选择LFU策略。这样可以保留频繁访问的商品详情数据提高页面响应速度。
// 使用LFU算法实现商品详情页缓存
LFUCacheString, ProductDetails productDetailsCache new LFUCache(500); // 缓存容量500ProductDetails cachedProductDetails productDetailsCache.get(product123);
if (cachedProductDetails null) {// 从数据库获取商品详情数据ProductDetails productDetails database.getProductDetails(product123);productDetailsCache.put(product123, productDetails);cachedProductDetails productDetails;
}购物车页购物车页的数据与用户关联紧密可以选择LRU或者LRUS策略。这样可以保留最近被访问的购物车数据提供更好的用户体验。
// 使用LRUS算法实现购物车页缓存
LRUSCacheString, ShoppingCart shoppingCartCache new LRUSCache(200); // 缓存容量200ShoppingCart cachedShoppingCart shoppingCartCache.get(user123);
if (cachedShoppingCart null) {// 从数据库获取购物车数据ShoppingCart shoppingCart database.getShoppingCart(user123);shoppingCartCache.put(user123, shoppingCart);cachedShoppingCart shoppingCart;
}2性能优化与实际应用改进
在实际应用中通过合理配置缓存策略以及优化缓存大小电子商务网站可以显著提升页面加载速度和用户体验。同时通过监控数据访问模式的变化还可以动态调整缓存策略进一步优化性能。
十、总结与实践指导
1、Redis数据缓存策略的重要性
数据缓存不仅可以提升系统性能还能降低后端数据库的压力从而实现更快的响应时间和更好的用户体验。在现代高并发应用中优化数据缓存策略已经成为系统设计中不可或缺的一环。
2、如何选择合适的缓存策略
在实际应用中选择合适的缓存策略是至关重要的。根据不同的业务场景和数据访问模式我们可以灵活地选择LRU、LFU、LRUS、随机替换等缓存策略。同时还可以根据实际需要动态地调整缓存大小以达到最佳的性能与资源利用率的平衡。
实践指导
分析数据访问模式在选择缓存策略之前首先需要详细分析数据的访问模式。哪些数据被频繁访问哪些数据变化较少根据这些信息选择适合的缓存策略。选择合适的算法根据业务需求选择合适的缓存算法。LRU适用于保留最近访问的数据LFU适用于保留最频繁访问的数据而LRUS则更好地应对访问模式的变化。监控与优化缓存策略不是一成不变的需要不断监控数据访问情况优化缓存大小和策略。通过监控缓存的命中率和利用率可以动态地做出调整。灵活应用不同的业务模块可能需要不同的缓存策略。根据实际情况可以在系统中采用多种缓存策略以最大程度地提升性能。