爱奇艺的Java缓存之路,你应该知道的缓存进化史!

合集下载

cache工作原理

cache工作原理

cache工作原理缓存(Cache)是计算机系统中常用的一种优化技术,它通过暂时存储数据来提高数据访问速度,减少对慢速存储器(如硬盘)的访问次数。

缓存的工作原理是将最常用的数据存储在快速访问的存储介质中,以便快速检索和访问。

1. 缓存的作用缓存的主要作用是提高数据访问速度和系统性能。

当计算机需要数据时,它首先检查缓存中是否存在所需的数据。

如果数据在缓存中,计算机可以直接从缓存中获取数据,而不必访问慢速存储器。

这样可以大大减少数据访问的延迟时间,提高系统的响应速度。

2. 缓存的层次结构缓存通常按照层次结构进行组织,以便根据数据的使用频率和访问时间来管理数据。

常见的缓存层次结构包括L1、L2、L3缓存等。

L1缓存位于处理器内部,速度最快,但容量较小。

L2缓存位于处理器和内存之间,速度较快,容量较大。

L3缓存位于处理器和主存之间,速度较慢,容量最大。

缓存层次结构的设计旨在根据数据的使用模式和访问时间来提供最佳的性能。

3. 缓存的替换策略由于缓存的容量有限,当缓存已满时,需要替换掉一部份数据来腾出空间存储新的数据。

常见的缓存替换策略有以下几种:- 最近至少使用(Least Recently Used, LRU):替换最长期没有被使用的数据。

- 先进先出(First In First Out, FIFO):替换最早进入缓存的数据。

- 随机替换(Random):随机选择一个数据进行替换。

4. 缓存的命中率缓存的命中率是衡量缓存性能的重要指标之一。

命中率指的是在数据访问中,所需数据在缓存中的比例。

高命中率意味着大部份数据都能从缓存中获取,系统性能较好。

低命中率则意味着大部份数据都需要从慢速存储器中获取,系统性能较差。

提高缓存的命中率可以通过优化缓存的设计和替换策略来实现。

5. 缓存一致性缓存一致性是指多个缓存之间数据的一致性。

当多个缓存同时访问同一块数据时,需要保证数据的一致性,即每一个缓存中的数据都是最新的。

java二级缓存原理

java二级缓存原理

java二级缓存原理Java二级缓存原理随着互联网的发展和应用程序的复杂化,对于数据的访问和处理速度要求也越来越高。

在Java中,缓存技术被广泛应用于提高系统的性能和响应速度。

其中,二级缓存是一种常用的缓存技术,可以有效地减少对数据库等资源的访问次数,提高系统的性能。

一、什么是二级缓存二级缓存是指在应用程序和数据库之间添加一层缓存,用于存储频繁访问的数据。

通常情况下,二级缓存会将数据存储在内存中,以提高数据的访问速度。

相比一级缓存(即应用内存中的缓存),二级缓存具有更大的容量和更高的性能。

二、为什么需要二级缓存在大多数应用程序中,对于频繁访问的数据,每次都直接从数据库中读取会导致较高的数据库负载和较慢的响应速度。

而通过使用二级缓存,可以将这些数据缓存在内存中,减少对数据库的访问次数,从而提高系统的性能和响应速度。

三、二级缓存的实现原理1. 缓存的数据结构二级缓存通常使用哈希表或者红黑树等数据结构来存储缓存数据。

这些数据结构具有快速的查找和插入操作,可以提高数据的访问效率。

2. 缓存的更新策略为了保证缓存数据的及时性和准确性,二级缓存需要实现一定的更新策略。

常见的更新策略有以下几种:- 缓存失效策略:当缓存中的数据过期或者被修改时,将其标记为失效状态,并在下次访问时更新缓存数据。

- 定时刷新策略:定期清理缓存中的失效数据,并从数据库中重新加载最新的数据。

- 主动更新策略:当数据库中的数据发生变化时,通过数据库触发器或者消息队列等机制,自动更新缓存中的数据。

3. 缓存的淘汰策略当缓存中的数据量超过一定的限制时,为了避免内存溢出,需要实现一定的淘汰策略。

常见的淘汰策略有以下几种:- 先进先出(FIFO)策略:将最早进入缓存的数据淘汰出去。

- 最少使用(LFU)策略:将最少被访问的数据淘汰出去。

- 最近最少使用(LRU)策略:将最近最少被访问的数据淘汰出去。

4. 缓存的一致性由于缓存数据是存储在内存中的,可能会出现缓存与数据库数据不一致的情况。

如何在Java中实现缓存雪崩和穿透

如何在Java中实现缓存雪崩和穿透

如何在Java中实现缓存雪崩和穿透在 Java 开发中,缓存是提高系统性能的重要手段之一。

然而,在使用缓存的过程中,可能会遇到一些问题,其中缓存雪崩和缓存穿透就是比较常见且棘手的情况。

首先,我们来了解一下什么是缓存雪崩。

缓存雪崩是指在某一时刻,大量的缓存同时失效,导致大量的请求直接打到数据库上,从而使数据库的压力瞬间增大,甚至可能导致数据库崩溃。

这就好比是在一个繁忙的路口,突然所有的交通信号灯都失灵了,车辆一下子乱了套,造成交通瘫痪。

造成缓存雪崩的原因通常有以下几种。

一是缓存设置了相同的过期时间。

如果大量的缓存项设置了相同的过期时间,那么在这个时间点,这些缓存就会同时失效,引发雪崩。

二是缓存服务器宕机。

如果缓存服务器出现故障,导致所有的缓存都无法使用,也会引发雪崩。

三是热点数据的缓存过期。

对于一些访问频率非常高的热点数据,如果其缓存过期,瞬间会有大量的请求访问数据库。

那么,如何在 Java 中预防和解决缓存雪崩的问题呢?一种常见的方法是设置不同的缓存过期时间。

我们可以在设置缓存过期时间时,加上一个随机值,让缓存的过期时间分散开来,避免大量缓存同时失效。

比如,原本设置缓存过期时间为 1 小时,可以在这个基础上加上一个随机的分钟数,这样每个缓存项的实际过期时间就会有所不同。

另一种方法是使用互斥锁。

当缓存失效时,不是所有的请求都去访问数据库,而是只有一个请求去访问数据库获取数据,其他请求等待这个请求获取到数据并重新设置缓存后,直接从缓存中获取数据。

还有一种方法是提前预热缓存。

在系统上线前,将热点数据提前加载到缓存中,避免在系统运行时,因为热点数据的缓存过期导致大量请求访问数据库。

接下来,我们再来看一下缓存穿透。

缓存穿透是指查询一个根本不存在的数据,由于缓存中没有,每次都会去数据库查询,从而给数据库带来很大的压力。

这就好像是有人一直在敲一个不存在的门,却每次都要去确认这扇门是否存在。

缓存穿透产生的原因主要有两种。

cache工作原理

cache工作原理

cache工作原理缓存工作原理缓存是计算机系统中常用的一种性能优化技术,它通过将时常使用的数据存储在高速存储介质中,以便快速访问和提供更快的响应时间。

缓存工作原理涉及到数据的存储、访问和更新过程。

本文将详细介绍缓存的工作原理。

一、什么是缓存?缓存是位于计算机系统内部或者外部的高速存储介质,用于存储时常访问的数据。

它可以是硬件缓存(如CPU缓存、磁盘缓存)或者软件缓存(如浏览器缓存、数据库缓存)。

缓存的目的是减少对慢速存储介质(如硬盘、网络)的访问次数,提高数据的读取速度和响应时间。

二、缓存的工作原理1. 数据存储过程当系统需要访问某个数据时,首先会检查缓存中是否存在该数据。

如果存在,系统直接从缓存中读取数据,避免了对慢速存储介质的访问。

如果缓存中不存在该数据,则系统从慢速存储介质(如硬盘、数据库)中读取数据,并将其存储到缓存中,以备下次访问。

2. 数据访问过程在数据存储到缓存后,系统会为其分配一个惟一的标识符,通常是一个键(key)。

当系统需要访问该数据时,它会使用这个键来查询缓存。

如果缓存中存在该键对应的数据,则系统直接从缓存中读取数据。

如果缓存中不存在该键对应的数据,则系统需要从慢速存储介质中读取数据,并将其存储到缓存中,以备下次访问。

3. 数据更新过程当系统对数据进行更新时,它需要同时更新缓存和慢速存储介质中的数据。

通常情况下,系统会先更新缓存中的数据,然后再将更新后的数据写入慢速存储介质。

这样可以确保缓存中的数据与慢速存储介质中的数据保持一致。

三、缓存的优势和应用场景1. 提高系统性能:缓存可以减少对慢速存储介质的访问次数,提高数据的读取速度和响应时间,从而提高系统的性能和用户体验。

2. 减轻服务器负载:通过将时常访问的数据存储在缓存中,可以减轻服务器的负载,提高系统的并发处理能力。

3. 减少网络带宽占用:缓存可以减少对慢速网络的访问次数,从而减少网络带宽的占用,提高网络传输效率。

4. 降低数据库压力:通过使用数据库缓存,可以减少对数据库的访问次数,降低数据库的压力,提高数据库的性能和可扩展性。

缓存 工作原理

缓存 工作原理

缓存工作原理缓存是一种用于提高计算机系统性能的技术。

它通过暂时存储数据的副本,使得下次请求相同数据时可以更快地获取到,从而降低了访问主存储器的次数。

缓存工作的基本原理是利用空间换取时间。

计算机系统中的缓存通常分为多级,如L1、L2、L3等。

这些缓存层级根据其与处理器之间的距离和访问速度排序,越接近处理器的缓存层级访问速度越快。

当处理器访问数据时,它首先会先查找最近的缓存层级(如L1缓存)。

如果所需数据在该缓存层级中存在,处理器会直接从缓存中读取数据,从而避免访问更慢的主存储器。

这个过程被称为缓存命中。

如果所需数据在缓存中不存在,处理器会继续查找下一个级别的缓存层级,直到找到数据或者到达最慢的主存储器。

如果数据在主存储器中存在,处理器将会把数据从主存储器读取到缓存中,并将数据返回给请求者。

这个过程被称为缓存未命中。

为了提高缓存命中率,缓存中的数据通常采用缓存行的形式进行存储。

缓存行是一个连续的存储块,一次可以读取或写入多个字节的数据。

当处理器读取数据时,如果缓存行中包含所需的数据,那么整个缓存行的数据都会被加载到缓存中。

这样,如果处理器在不久之后需要访问缓存行中的其他数据,就不需要再次访问主存储器。

另外,缓存还可以利用数据的局部性原理来提高命中率。

数据的局部性原理指的是,当程序访问某个数据时,很有可能也会访问其附近的数据。

因此,缓存会将这些附近的数据也一并加载到缓存中,以提高命中率。

总的来说,缓存通过存储数据副本来加快数据访问速度,从而提高计算机系统的性能。

它利用了缓存层级和缓存行的设计,以及数据的局部性原理来提高缓存命中率,减少对主存储器的访问次数,从而实现更快的数据访问速度。

Java缓存机制

Java缓存机制

在软件开发中,缓存是一种常用的优化技术,用于存储频繁访问的数据,使得下一次访问时可以更快地获取数据。

而在Java中,也存在着各种不同的缓存机制,用于提升程序的性能与效率。

一、内存缓存内存缓存是最常见的缓存机制之一。

在Java中,可以使用各种数据结构来实现内存缓存,比如Hashtable、HashMap、ConcurrentHashMap等。

使用内存缓存的好处是可以将数据存储在内存中,而不是频繁地访问数据库或者其他外部存储介质,从而提升访问速度。

同时,内存缓存还可以减轻数据库的负载,提高系统的并发能力。

二、CPU缓存CPU缓存是指CPU内部的高速缓存,用于暂时存储处理器频繁访问的数据。

在Java中,可以通过使用局部变量和静态变量来利用CPU缓存。

局部变量存储在方法栈帧中,相对于对象的实例变量来说,访问局部变量的速度更快。

因此,在开发过程中,应该尽量使用局部变量来存储频繁访问的数据。

静态变量是存储在方法区中的,与对象的实例无关。

由于静态变量只有一个副本,所以可以减少对CPU缓存的竞争,提高程序的性能。

三、磁盘缓存磁盘缓存是将数据存储在磁盘中,并使用相应的缓存算法来提高数据的读写速度。

在Java中,可以通过使用文件缓存或者数据库缓存来实现磁盘缓存。

文件缓存是将数据存储在本地文件系统中,比如将一些配置文件加载到内存中进行处理。

数据库缓存是将数据存储在数据库中,并使用缓存算法来提高数据的访问速度。

一般情况下,数据库缓存会使用LRU(最近最少使用)算法来决定何时移除某个数据。

四、网络缓存网络缓存是将数据存储在网络中,通过网络进行传输。

在Java中,可以通过使用HTTP缓存或者CDN来实现网络缓存。

HTTP缓存是浏览器和服务器之间的缓存,用于存储HTTP请求和响应的数据。

通过合理设定HTTP头信息,可以实现数据的缓存,减少带宽的消耗。

CDN(内容分发网络)是一种将数据分布到全球多台服务器的网络架构,用于存储静态文件,提供更快的数据访问速度。

缓存的知识点

缓存的知识点

缓存的知识点
缓存是一种提高数据访问速度的技术。

它是指将经常访问的数据
在临时存储器中保存一份副本,以便下次访问时可以更快地获取数据。

通常,缓存使用的是高速内存或者更快的介质,例如固态硬盘(SSD),所以可以大大缩短数据访问的响应时间。

缓存可以分为多级缓存。

CPU中有内置的一级缓存(L1 Cache)
和二级缓存(L2 Cache),以及连接到CPU总线上的三级缓存(L3 Cache)。

此外,还有独立于CPU的存储器缓存,例如浏览器中的网络
缓存和操作系统中的文件系统缓存。

多级缓存的设计可以提高缓存的
效率和容量,使得更多的数据可以被临时存储和快速访问。

缓存还可以分为两种类型:硬件缓存和软件缓存。

硬件缓存通常
由处理器或者存储器厂商实现,包括CPU缓存和固态硬盘的闪存缓存。

软件缓存则是应用程序或操作系统自身实现的内存缓存,例如Web浏
览器的缓存和操作系统的PageCache。

软件缓存可以通过更加优化的算法来提高缓存效率,例如使用LRU(最近最少使用)算法来检测使用频率,用更常用的数据来填充缓存。

总的来说,缓存可以提高数据访问速度,降低系统响应时间,减
少数据传输的负担。

不过,缓存也有一些缺点,例如会引起一些数据
一致性的问题,因此需要详细了解缓存的实现原理和算法,以充分利
用缓存的优势和避免其产生的缺点。

缓存工作原理

缓存工作原理

缓存工作原理
缓存工作原理是通过将数据暂时存储在快速访问的存储介质中,以加快数据的访问速度和提高系统性能。

缓存可以分为多级,例如L1、L2和L3缓存,每个级别都有
不同的容量和访问速度。

在CPU内部,L1缓存是最接近处理
器核心的,容量较小但速度最快,常用于存储最频繁使用的数据和指令。

较大容量的L2和L3缓存则位于CPU外部,速度
相对较慢,用于存储更大规模的数据。

当执行计算任务时,首先检查缓存中是否存在需要的数据。

如果数据已经在缓存中,则可以直接从缓存中读取,无需从慢速的主存取数据。

这样可以显著降低访问数据的延迟,并提高计算速度。

当数据更新时,缓存会将更新的数据同时更新到主存中,以保持数据的一致性。

当缓存空间不足时,缓存使用一些替换策略来决定哪些数据应该被驱逐,例如最少使用(LRU)或先进先出(FIFO)。

缓存的工作原理基于两个基本原则:局部性原理和时间局部性原理。

局部性原理指出,程序在一段时间内对特定数据的访问是集中的。

因此,将最常用的数据存储在缓存中,可以大大提高访问效率。

时间局部性原理是指在短时间内对同一数据的多次访问是紧密相关的。

因此,当一次访问后,将数据存储在缓存中,可以避免重复访问时从慢速的主存中读取数据,提高访问速度。

总而言之,缓存通过存储频繁使用的数据和指令,在快速访问的存储介质中提供快速的数据访问。

这种设计可以显著提高数据访问速度和系统性能。

缓存技术都有哪些

缓存技术都有哪些

缓存技术都有哪些缓存技术是用于提高系统性能、减轻服务器负担以及加速数据访问的重要组成部分。

以下是一些常见的缓存技术:1. 本地内存缓存:•将数据存储在应用程序的本地内存中,以提高数据访问速度。

例如,在Java中使用HashMap作为本地内存缓存。

2. 分布式缓存:•将缓存数据分布在多个节点上,以实现横向扩展和提高可用性。

常见的分布式缓存包括:•Redis:用作键值存储系统,支持多种数据结构。

•Memcached:专注于简单的键值存储,适用于分布式缓存场景。

•Apache Ignite:提供内存缓存、分布式计算和分布式数据网格等功能。

3. Web缓存:•使用Web服务器或反向代理服务器(如Nginx、Varnish等)来缓存静态资源,加速网页加载速度。

4. CDN(内容分发网络):•将静态资源分发到全球多个节点,使用户可以从距离更近的节点获取数据,从而提高访问速度。

常见的CDN提供商包括阿里云CDN、腾讯云CDN等。

5. 数据库缓存:•使用数据库查询结果的缓存,减少数据库访问压力。

例如,使用数据库查询缓存、查询结果缓存或对象关系映射(ORM)缓存。

6. 对象缓存:•缓存对象级别的数据,以减少对象的创建和数据库访问。

这可以通过内存中的数据结构(例如哈希表或字典)来实现。

7. Session缓存:•用于存储用户会话信息,减轻服务器负担。

常见的实现方式包括基于内存的Session缓存和基于分布式缓存的Session缓存。

8. 浏览器缓存:•将静态资源缓存在用户浏览器中,以减少对服务器的请求。

可以通过设置HTTP缓存头、ETag和Last-Modified等来控制浏览器缓存。

9. 页面片段缓存:•缓存页面中的某些部分,而不是整个页面。

这可以通过缓存页面片段的HTML或使用缓存模板来实现。

10. 缓存算法:•使用不同的缓存算法,例如LRU(Least Recently Used,最近最少使用)、LFU(Least Frequently Used,最不经常使用)、FIFO(First In, First Out,先进先出)等,来管理缓存中的数据。

ijkiocache 源码解读

ijkiocache 源码解读

ijkiocache 源码解读ijkiocache是一款基于ijkplayer的Android视频缓存库,用于实现视频的边播放边缓存功能。

下面我将从多个角度对ijkiocache的源码进行解读。

1. 架构设计:ijkiocache的架构设计采用了分层架构,主要分为三层,上层是ijkplayer,负责视频的解码和播放;中层是ijkcache,负责视频的缓存逻辑和数据管理;底层是底层缓存模块,负责实际的文件读写操作。

这种分层架构使得各个模块之间的职责清晰,易于扩展和维护。

2. 缓存逻辑:ijkiocache的缓存逻辑主要包括两个方面,预加载和实时缓存。

预加载是在视频播放之前,将视频的数据提前下载到本地缓存中,以提高播放的流畅性和用户体验。

实时缓存是在视频播放过程中,将正在播放的视频数据缓存到本地,以便在网络不稳定或断网的情况下继续播放。

3. 缓存策略:ijkiocache采用了多种缓存策略来提高缓存效率和用户体验。

其中包括按需缓存、分段缓存和LRU缓存。

按需缓存是根据用户的播放行为,动态地缓存视频数据,避免不必要的缓存开销。

分段缓存是将视频数据按照固定大小的分段进行缓存,以便在播放过程中可以快速定位和加载。

LRU缓存则是通过最近最少使用算法,淘汰不常访问的缓存数据,以保持缓存空间的有效利用。

4. 网络请求和数据处理:ijkiocache通过网络请求库实现视频数据的下载和缓存。

它支持多种网络请求方式,如HTTP、HTTPS等,并提供了数据处理模块,用于解析和处理视频数据。

数据处理模块可以对视频数据进行解密、解压、解码等操作,以便于后续的播放和缓存。

5. 错误处理和容错机制:ijkiocache在源码中考虑了各种错误情况和异常情况的处理。

它提供了错误码和错误回调接口,用于通知上层应用程序出现的错误,并采取相应的容错机制。

例如,在网络请求失败或缓存读取失败时,它会尝试重新请求或切换到其他可用的缓存源。

总结起来,ijkiocache是一款功能强大的Android视频缓存库,通过预加载和实时缓存等策略,提高了视频播放的流畅性和用户体验。

cache 工作原理

cache 工作原理

cache 工作原理
缓存是一种高速的存储方式,用于存储最常访问的数据,以便提高数据处理和访问速度。

它工作的基本原理是利用空间换时间的概念。

当程序需要读取数据时,首先会检查缓存中是否存在该数据。

如果存在,则直接从缓存中读取,并且可以避免访问更慢的主存储器或远程服务器。

这样就大大缩短了数据访问的时间。

如果缓存中不存在所需的数据,这时候就需要从主存储器或远程服务器中读取数据,并将其存储到缓存中。

下一次需要相同数据时,就可以直接从缓存中读取,而不需要再次访问主存储器或服务器。

为了提高缓存的效率,缓存通常采用一定的替换策略。

如果缓存已满并且需要将新的数据存储到缓存中,就需要替换掉一部分存在的数据。

常见的替换策略有最近最少使用(LRU)、先进先出(FIFO)等等。

另外,为了保持缓存的一致性,缓存还会采用一定的更新策略。

当数据在主存储器中被修改时,缓存中的相应数据也需要被更新。

更新策略可以是写回(Write-back)或写直达(Write-through)。

缓存的工作原理主要包括三个步骤:命中、替换和更新。

当程序访问缓存的数据时,会进行命中检查,如果命中缓存,则直接读取;如果未命中,则需要从主存储器或服务器中读取,并
进行替换和更新。

总的来说,缓存的工作原理是通过存储常用数据来提高数据访问速度,采用一定的替换和更新策略,以实现高效的数据存取。

JAVA 缓存技术

JAVA 缓存技术

JAVA 缓存技术作者:张云亮来源:《中国新通信》 2017年第24期随着现代计算机技术飞跃的发展,Java 被广泛应用于个人计算机、数据中心、游戏控制台、科学超级计算机、移动电话和互联网开发等领域,但由于访问人数的增多,访问次数频繁,导致并发量增大,对数据库的访问次数增大导致访问速度变得缓慢,所以就需要合理利用Java缓存技术,将一些不需要实时更新的数据放入缓存中,减少对数据库及程序的压力,加快访问速度,给用户更好的体验。

一、缓存缓存是高速缓冲存储器一种特殊的存储器子系统,其中复制了频繁使用的数据以利于快速访问,凡是位于速度相差较大的两种硬件/ 软件之间的,用于协调两者数据传输速度差异的结构,均可称之为缓存。

二、缓存的必要性缓存机制可以很大程度的缓解对数据库操作的压力,并发量较大的时候,使用缓存能明显加快访问速度,使用缓存的话,可以在第一次访问的时候查询数据库,将查到的数据放入缓存中,之后每次查询时可以直接查缓存中的数据,而不用每次都访问数据库,这个对于数据量较大、查询次数较多的功能来说,效率提升是巨大的。

三、Java 缓存技术1、Memcached。

Memcached 是一个自由、源码开放、高性能、分布式的分布式内存对象缓存系统,用于动态Web应用以减轻数据库的负载。

它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高了网站访问的速度。

Memcached 的具体工作流程是先进行检查客户端发起请求的数据是否在Memcached 缓存中,如果在缓存中已经存在相关数据,直接在缓存中查找到结果后讲结果返回,不会再对数据库进行任何操作。

如果请求的数据不在Memcached 缓存中,则会去查询数据库,将数据库中的结果返回给客户端,同时将数据缓存一份,但此部分需要程序中实现;每次更新数据库的同时更新缓存中的数据,保证一致性;当分配给缓存的空间用完之后,会使用LRU 策略加上到期失效策略,失效数据首先被替换,然后再替换掉最近未使用的数据。

爱奇艺的Java缓存之路,你应该知道的缓存进化史!

爱奇艺的Java缓存之路,你应该知道的缓存进化史!

爱奇艺的Java缓存之路,你应该知道的缓存进化史!本文是上周去技术沙龙听了一下爱奇艺的Java缓存之路有感写出来的。

先简单介绍一下爱奇艺的java缓存道路的发展吧。

可以看见图中分为几个阶段:第一阶段:数据同步加redis通过消息队列进行数据同步至redis,然后Java应用直接去取缓存这个阶段优点是:由于是使用的分布式缓存,所以数据更新快。

缺点也比较明显:依赖Redis的稳定性,一旦redis 挂了,整个缓存系统不可用,造成缓存雪崩,所有请求打到DB。

第二、三阶段:JavaMap到Guava cache这个阶段使用进程内缓存作为一级缓存,redis作为二级。

优点:不受外部系统影响,其他系统挂了,依然能使用。

缺点:进程内缓存无法像分布式缓存那样做到实时更新。

由于java内存有限,必定缓存得设置大小,然后有些缓存会被淘汰,就会有命中率的问题。

第四阶段: Guava Cache刷新为了解决上面的问题,利用Guava Cache可以设置写后刷新时间,进行刷新。

解决了一直不更新的问题,但是依然没有解决实时刷新。

第五阶段: 外部缓存异步刷新这个阶段扩展了Guava Cache,利用redis作为消息队列通知机制,通知其他java应用程序进行刷新。

这里简单介绍一下爱奇艺缓存发展的五个阶段,当然还有一些其他的优化,比如GC调优,缓存穿透,缓存覆盖的一些优化等等。

有兴趣的同学可以关注公众号,联系我进行交流。

上面说的是爱奇艺的一个进化线路,但是在大家的一般开发过程中,第一步一般都没有redis,而是直接查库。

在流量不大的时候,查数据库或者读取文件是最为方便,也能完全满足我们的业务要求。

当我们应用有一定流量之后或者查询数据库特别频繁,这个时候就可以祭出我们的java中自带的HashMap或者ConcurrentHashMap。

我们可以在代码中这么写:但是这样做就有个问题HashMap无法进行数据淘汰,内存会无限制的增长,所以hashMap 很快也被淘汰了。

视频缓存原理

视频缓存原理

视频缓存原理视频缓存是指将视频文件的数据暂时存储在本地或网络中,以便用户在观看视频时能够更快地加载和播放。

视频缓存的原理是利用存储设备或网络节点的存储空间,将视频文件的数据进行预先加载或临时存储,以提高视频播放的流畅性和观看体验。

视频缓存的原理主要包括以下几个方面:1. 缓存位置选择。

视频缓存可以分为本地缓存和网络缓存两种。

本地缓存是指将视频文件的数据存储在用户设备的本地存储空间中,例如硬盘、固态硬盘或内存中。

而网络缓存则是将视频数据存储在网络节点的缓存服务器或CDN节点中。

选择合适的缓存位置可以根据用户需求、网络带宽和存储空间等因素进行综合考虑。

2. 缓存策略。

视频缓存的策略包括预加载缓存、按需缓存和混合缓存等。

预加载缓存是指在用户观看视频之前,提前将视频数据加载到缓存中,以减少视频加载时间和缓冲等待时间。

按需缓存是指根据用户的实际需求,在用户观看视频时才将视频数据加载到缓存中。

混合缓存则是将预加载缓存和按需缓存结合起来,根据视频的特点和用户的观看习惯进行智能缓存。

3. 缓存替换算法。

在有限的存储空间内,视频缓存需要根据一定的替换算法来管理存储空间,以保证缓存命中率和用户体验。

常见的缓存替换算法包括最近最少使用(LRU)、最不经常使用(LFU)和随机替换等。

这些替换算法可以根据视频的访问频率和缓存的存储空间进行动态调整,以提高缓存命中率和优化用户体验。

4. 缓存更新机制。

视频缓存的更新机制是指在视频文件发生变化或更新时,如何及时更新缓存中的视频数据。

常见的更新机制包括定时更新、事件触发更新和增量更新等。

定时更新是指定期定时检查视频文件的更新情况,事件触发更新是指在视频文件发生变化时主动触发更新操作,而增量更新则是只更新发生变化的部分视频数据,以减少更新时间和网络带宽的消耗。

总之,视频缓存是通过合理选择缓存位置、制定缓存策略、采用合适的缓存替换算法和更新机制,来提高视频播放的加载速度和流畅性,从而优化用户观看体验。

mybatis缓存原理

mybatis缓存原理

mybatis缓存原理MyBatis缓存原理MyBatis是一个开源的Java持久层框架,它可以帮助我们简化数据库访问的开发工作。

在MyBatis中,缓存机制被广泛使用,以提高数据库访问的性能。

本文将深入探讨MyBatis的缓存原理。

一、缓存的作用与类型缓存是一种临时存储技术,它将经常访问的数据暂时保存在内存中,以提高数据的访问速度。

在数据库访问中,缓存可以减少对数据库的频繁访问,从而提高系统的性能。

在MyBatis中,存在两种类型的缓存:一级缓存(本地缓存)和二级缓存(全局缓存)。

1. 一级缓存(本地缓存)一级缓存是指SqlSession级别的缓存,它默认是开启的。

当SqlSession执行查询操作时,查询结果会被缓存到一级缓存中。

下次再执行相同的查询操作时,MyBatis会先从一级缓存中获取数据,而不再访问数据库。

一级缓存的生命周期与SqlSession的生命周期一致。

当SqlSession被关闭后,一级缓存也会被清空。

2. 二级缓存(全局缓存)二级缓存是指Mapper级别的缓存,多个SqlSession共享同一个二级缓存。

当SqlSession执行查询操作时,查询结果会被缓存到二级缓存中。

下次再执行相同的查询操作时,MyBatis会先从二级缓存中获取数据,如果找到了缓存数据,则直接返回,不再访问数据库。

二级缓存的生命周期与整个应用的生命周期一致。

当应用关闭时,二级缓存才会被清空。

二、缓存的实现机制MyBatis的缓存实现机制遵循了经典的缓存设计模式,即使用一个Map来存储缓存数据。

在MyBatis中,缓存数据存储在一个称为Cache的接口中,具体的缓存实现类由用户自己选择。

1. 一级缓存的实现机制一级缓存的实现机制非常简单。

当SqlSession执行查询操作时,MyBatis会先检查一级缓存中是否存在缓存数据,如果存在,则直接返回缓存数据。

如果不存在,则执行查询操作,并将查询结果存入一级缓存中。

缓存工作原理

缓存工作原理

缓存工作原理
缓存工作原理是通过将计算机中的数据存储在高速缓存中,以便在后续访问中更快地获取数据。

它利用了时间局部性和空间局部性的原理。

在计算机系统中,缓存由具有更快速访问时间的存储器组件组成,这些存储器组件通常是静态随机存取存储器(SRAM)或动态随机存取存储器(DRAM)。

缓存存储器被划分为多个缓存行,每个缓存行包含一块数据以及一个与之对应的标签。

当计算机需要访问内存中的数据时,它首先检查缓存中是否存在该数据。

这是通过比较数据的标签与缓存行中存储的标签来实现的。

如果缓存行中的标签与所需数据的标签匹配,说明数据已经存储在缓存中,这被称为缓存命中。

计算机可以直接从缓存中读取数据,而无需访问较慢的主内存。

如果缓存行中的标签与所需数据的标签不匹配,说明数据不在缓存中,这被称为缓存未命中。

在这种情况下,计算机需要从主内存中读取数据,并将其存储到缓存行中,以供后续访问使用。

在存储数据之前,计算机可能会根据特定的缓存替换策略选择要替换的缓存行。

常见的替换策略包括最近最少使用(LRU)和最不经常使用(LFU)。

缓存的有效性是由一种叫作缓存一致性协议的机制来确保的。

缓存一致性协议定义了当多个处理器或核心同时访问相同数据时,应如何保持缓存的一致性。

常见的缓存一致性协议有总线嗅探协议和目录协议。

总之,缓存通过存储最近使用的数据来提高计算机系统的性能。

它利用了局部性原理,并通过缓存命中和替换策略来管理数据的存储和访问。

缓存一致性协议确保多个处理器或核心同时访问数据时的数据一致性。

缓存先进先出原理

缓存先进先出原理

缓存先进先出原理宝子!今天咱们来唠唠缓存先进先出这个超有趣的原理。

你可以把缓存想象成一个超级小的便利店的货架,空间有限得很呢。

咱先说啥是缓存哈。

你知道手机或者电脑有时候打开一些软件,为啥第二次打开就快很多吗?这就是缓存的功劳啦。

缓存就像是一个小助手,偷偷把一些你可能会再用到的数据啊、信息啥的先存起来。

就好比你喜欢喝的那家奶茶店,店员知道你经常点珍珠奶茶,就提前把珍珠煮好放在一边,等你一来下单,就能很快给你做出来。

那这个先进先出是怎么回事呢?这就像是排队买奶茶。

你想啊,一群人在奶茶店门口排队。

先到的人先点单,先拿到奶茶然后离开。

缓存也是这样的。

最早进入缓存这个小空间的数据呢,就像是最早排队的人。

当缓存满了,需要腾出空间来放新的数据的时候,最早进来的那个数据就得先被“请出去”啦。

比如说,缓存就像一个小盒子,只能放5个小玩具(这里的小玩具就相当于数据)。

第一个放进去的是小皮球,然后是小汽车、小娃娃、小积木、小口哨。

当又有一个新的小飞机要放进这个盒子的时候,因为盒子满了呀,那最先放进去的小皮球就得被拿出来,给小飞机腾地方。

这就是先进先出的简单道理啦。

再给你举个更生活的例子。

你有一个小小的收纳盒,专门用来放你每天要用的小物件,像头绳啊、唇膏啊啥的。

这个收纳盒只能放5样东西。

你周一放进去了头绳、周二放进去了唇膏、周三放进去了小镜子、周四放进去了护手霜、周五放进去了创可贴。

到了下周一,你又有一个新的小梳子想放进这个收纳盒,那最先放进去的头绳就只能被拿出来啦。

在电脑里呢,缓存的先进先出也是这样运作的。

那些最早被缓存起来的数据,可能是你刚刚打开网页浏览过的图片或者文字。

当电脑需要缓存新的内容,比如你又打开了一个新的视频,而缓存空间不够的时候,那些最早的网页数据就会被清除掉,给新的视频数据腾地方。

这个原理其实很人性化的呢。

它就像是一个小小的管理员,在有限的空间里尽量做到公平。

不会让后来的数据一直挤不进来,也不会让最早的数据一直霸占着空间不走。

视频缓存原理

视频缓存原理

视频缓存原理
视频缓存原理是指将网上的视频内容临时保存在用户的设备中,以便用户在以后的观看中能够更顺畅地播放视频。

视频缓存的原理主要包括以下几个方面:
1. 预加载:当用户打开一个视频网站时,网站会根据用户的浏览历史、兴趣等信息,自动为用户缓存一部分与其相关的视频内容。

这些视频可能是用户曾经观看过的、感兴趣的、近期热门的等等。

通过这种方式,用户在访问这些视频时会具有更快的加载速度,提高用户体验。

2. 边下边播:当用户选择观看一个尚未缓存的视频时,视频播放器会首先将视频的部分内容下载到本地设备中进行缓存,然后再开始播放。

这种方式可以保证用户在观看视频的同时可以实时加载后续的视频内容,避免因为网络不稳定导致的视频卡顿、加载缓慢等问题。

3. 本地缓存:视频缓存机制还包括将用户曾经观看过的视频内容保存在本地设备中。

当用户再次进入这些视频页面时,网站会自动检测用户本地是否已缓存该视频,如果有,则直接播放缓存的视频,而不需要再次下载和加载。

这样在节省用户的流量,同时提高视频播放的速度和稳定性。

4. 智能管理:视频缓存机制还可以根据用户的设备存储空间、网络状况等因素进行智能管理。

当用户的设备存储空间不足或者网络环境不稳定时,系统可以自动清理过期的缓存内容,或者停止预加载新的视频,以确保用户设备的正常运行和网络速
度的稳定。

综上所述,视频缓存原理主要通过预加载、边下边播、本地缓存和智能管理等方式来提高用户观看视频的体验,并且可以根据用户的需求和网络环境进行灵活的调整和优化。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

爱奇艺的Java缓存之路,你应该知道的缓存进化史!本文是上周去技术沙龙听了一下爱奇艺的Java缓存之路有感写出来的。

先简单介绍一下爱奇艺的java缓存道路的发展吧。

可以看见图中分为几个阶段:第一阶段:数据同步加redis通过消息队列进行数据同步至redis,然后Java应用直接去取缓存这个阶段优点是:由于是使用的分布式缓存,所以数据更新快。

缺点也比较明显:依赖Redis的稳定性,一旦redis 挂了,整个缓存系统不可用,造成缓存雪崩,所有请求打到DB。

第二、三阶段:JavaMap到Guava cache这个阶段使用进程内缓存作为一级缓存,redis作为二级。

优点:不受外部系统影响,其他系统挂了,依然能使用。

缺点:进程内缓存无法像分布式缓存那样做到实时更新。

由于java内存有限,必定缓存得设置大小,然后有些缓存会被淘汰,就会有命中率的问题。

第四阶段: Guava Cache刷新为了解决上面的问题,利用Guava Cache可以设置写后刷新时间,进行刷新。

解决了一直不更新的问题,但是依然没有解决实时刷新。

第五阶段: 外部缓存异步刷新这个阶段扩展了Guava Cache,利用redis作为消息队列通知机制,通知其他java应用程序进行刷新。

这里简单介绍一下爱奇艺缓存发展的五个阶段,当然还有一些其他的优化,比如GC调优,缓存穿透,缓存覆盖的一些优化等等。

有兴趣的同学可以关注公众号,联系我进行交流。

上面说的是爱奇艺的一个进化线路,但是在大家的一般开发过程中,第一步一般都没有redis,而是直接查库。

在流量不大的时候,查数据库或者读取文件是最为方便,也能完全满足我们的业务要求。

当我们应用有一定流量之后或者查询数据库特别频繁,这个时候就可以祭出我们的java中自带的HashMap或者ConcurrentHashMap。

我们可以在代码中这么写:但是这样做就有个问题HashMap无法进行数据淘汰,内存会无限制的增长,所以hashMap 很快也被淘汰了。

当然并不是说他完全就没用,就像我们古代社会也不是所有的东西都是过时的,比如我们中华名族的传统美德是永不过时的,就像这个hashMap一样的可以在某些场景下作为缓存,当不需要淘汰机制的时候,比如我们利用反射,如果我们每次都通过反射去搜索Method,field,性能必定低效,这时我们用HashMap将其缓存起来,性能能提升很多。

在古代社会中难住我们的问题无法进行数据淘汰,这样会导致我们内存无限膨胀,显然我们是不可以接受的。

有人就说我把一些数据给淘汰掉呗,这样不就对了,但是怎么淘汰呢?随机淘汰吗?当然不行,试想一下你刚把A装载进缓存,下一次要访问的时候就被淘汰了,那又会访问我们的数据库了,那我们要缓存干嘛呢?所以聪明的人们就发明了几种淘汰算法,下面列举下常见的三种FIFO,LRU,LFU(还有一些ARC,MRU感兴趣的可以自行搜索):FIFO:先进先出,在这种淘汰算法中,先进入缓存的会先被淘汰。

这种可谓是最简单的了,但是会导致我们命中率很低。

试想一下我们如果有个访问频率很高的数据是所有数据第一个访问的,而那些不是很高的是后面再访问的,那这样就会把我们的首个数据但是他的访问频率很高给挤出。

LRU:最近最少使用算法。

在这种算法中避免了上面的问题,每次访问数据都会将其放在我们的队尾,如果需要淘汰数据,就只需要淘汰队首即可。

但是这个依然有个问题,如果有个数据在1个小时的前59分钟访问了1万次(可见这是个热点数据),再后一分钟没有访问这个数据,但是有其他的数据访问,就导致了我们这个热点数据被淘汰。

LFU:最近最少频率使用。

在这种算法中又对上面进行了优化,利用额外的空间记录每个数据的使用频率,然后选出频率最低进行淘汰。

这样就避免了LRU不能处理时间段的问题。

上面列举了三种淘汰策略,对于这三种,实现成本是一个比一个高,同样的命中率也是一个比一个好。

而我们一般来说选择的方案居中即可,即实现成本不是太高,而命中率也还行的LRU,如何实现一个LRUMap呢?我们可以通过继承LinkedHashMap,重写removeEldestEntry方法,即可完成一个简单的LRUMap。

在LinkedHashMap中维护了一个entry(用来放key和value的对象)链表。

在每一次get 或者put的时候都会把插入的新entry,或查询到的老entry放在我们链表末尾。

可以注意到我们在构造方法中,设置的大小特意设置到max*1.4,在下面的removeEldestEntry 方法中只需要size>max就淘汰,这样我们这个map永远也走不到扩容的逻辑了,通过重写LinkedHashMap,几个简单的方法我们实现了我们的LruMap。

在近代社会中已经发明出来了LRUMap,用来进行缓存数据的淘汰,但是有几个问题:锁竞争严重,可以看见我的代码中,Lock是全局锁,在方法级别上面的,当调用量较大时,性能必然会比较低。

不支持过期时间不支持自动刷新所以谷歌的大佬们对于这些问题,按捺不住了,发明了Guava cache,在Guava cache中你可以如下面的代码一样,轻松使用:我将会从guava cache原理中,解释guava cache是如何解决LRUMap的几个问题的。

5.1、锁竞争guava cache采用了类似ConcurrentHashMap的思想,分段加锁,在每个段里面各自负责自己的淘汰的事情。

在Guava根据一定的算法进行分段,这里要说明的是,如果段太少那竞争依然很严重,如果段太多会容易出现随机淘汰,比如大小为100的,给他分100个段,那也就是让每个数据都独占一个段,而每个段会自己处理淘汰的过程,所以会出现随机淘汰。

在guava cache中通过如下代码,计算出应该如何分段。

上面segmentCount就是我们最后的分段数,其保证了每个段至少10个Entry。

如果没有设置concurrencyLevel这个参数,那么默认就会是4,最后分段数也最多为4,例如我们size为100,会分为4段,每段最大的size是25。

在guava cache中对于写操作直接加锁,对于读操作,如果读取的数据没有过期,且已经加载就绪,不需要进行加锁,如果没有读到会再次加锁进行二次读,如果还没有需要进行缓存加载,也就是通过我们配置的CacheLoader,我这里配置的是直接返回Key,在业务中通常配置从数据库中查询。

如下图所示:5.2、过期时间相比于LRUMap多了两种过期时间,一个是写后多久过期expireAfterWrite,一个是读后多久过期expireAfterAccess。

很有意思的事情是,在guava cache中对于过期的Entry 并没有马上过期(也就是并没有后台线程一直在扫),而是通过进行读写操作的时候进行过期处理,这样做的好处是避免后台线程扫描的时候进行全局加锁。

看下面的代码:从这个结果中我们知道,在put的时候才进行的过期处理。

特别注意的是我上面concurrencyLevel(1)我这里将分段最大设置为1,不然不会出现这个实验效果的,在上面一节中已经说过,我们是以段位单位进行过期处理。

在每个Segment中维护了两个队列:writeQueue维护了写队列,队头代表着写得早的数据,队尾代表写得晚的数据。

accessQueue维护了访问队列,和LRU一样,用来我们进行访问时间的淘汰,如果当这个Segment超过最大容量,比如我们上面所说的25,超过之后,就会把accessQueue这个队列的第一个元素进行淘汰。

上面就是guava cache处理过期Entries的过程,会对两个队列一次进行peek操作,如果过期就进行删除。

一般处理过期Entries可以在我们的put操作的前后,或者读取数据时发现过期了,然后进行整个Segment的过期处理,又或者进行二次读lockedGetOrLoad操作的时候调用。

上面是我们驱逐Entry的时候的代码,可以看见访问的是accessQueue对其队头进行驱逐。

而驱逐策略一般是在对segment中的元素发生变化时进行调用,比如插入操作,更新操作,加载数据操作。

5.3、自动刷新自动刷新操作,在guava cache中实现相对比较简单,直接通过查询,判断其是否满足刷新条件,进行刷新。

5.4、其他特性在Guava cache中还有一些其他特性:虚引用在Guava cache中,key和value都能进行虚引用的设定,在Segment中的有两个引用队列:这两个队列用来记录被回收的引用,其中每个队列记录了每个被回收的Entry的hash,这样回收了之后通过这个队列中的hash值就能把以前的Entry进行删除。

删除监听器在guava cache中,当有数据被淘汰时,但是你不知道他到底是过期,还是被驱逐,还是因为虚引用的对象被回收?这个时候你可以调用这个方法removalListener(RemovalListener listener)添加监听器进行数据淘汰的监听,可以打日志或者一些其他处理,可以用来进行数据淘汰分析。

在RemovalCause记录了所有被淘汰的原因:被用户删除,被用户替代,过期,驱逐收集,由于大小淘汰。

guava cache的总结细细品读guava cache的源码总结下来,其实就是一个性能不错的,api丰富的LRU Map。

爱奇艺的缓存的发展也是基于此之上,通过对guava cache的二次开发,让其可以进行java 应用服务之间的缓存更新。

guava cache的功能的确是很强大,满足了绝大多数的人的需求,但是其本质上还是LRU 的一层封装,所以在众多其他较为优良的淘汰算法中就相形见绌了。

而caffeine cache实现了W-TinyLFU(LFU+LRU算法的变种)。

下面是不同算法的命中率的比较:其中Optimal是最理想的命中率,LRU和其他算法相比的确是个弟弟。

而我们的W-TinyLFU 是最接近理想命中率的。

当然不仅仅是命中率caffeine优于了guava cache,在读写吞吐量上面也是完爆guava cache。

这个时候你肯定会好奇为啥这么caffeine这么牛逼呢?别着急下面慢慢给你道来。

6.1、W-TinyLFU上面已经说过了传统的LFU是怎么一回事。

在LFU中只要数据访问模式的概率分布随时间保持不变时,其命中率就能变得非常高。

这里我还是拿爱奇艺举例,比如有部新剧出来了,我们使用LFU给他缓存下来,这部新剧在这几天大概访问了几亿次,这个访问频率也在我们的LFU中记录了几亿次。

但是新剧总会过气的,比如一个月之后这个新剧的前几集其实已经过气了,但是他的访问量的确是太高了,其他的电视剧根本无法淘汰这个新剧,所以在这种模式下是有局限性。

相关文档
最新文档