首页 > 编程知识 正文

java实现缓存,无法更新java

时间:2023-05-06 16:37:43 阅读:30440 作者:2759

外部存储:

也就是说,我们常说的“CDEF磁盘大小”外部存储器是指计算机存储器和CPU缓存以外的存储器,这种存储器一般即使关闭电源也能够保存数据。 典型的外部存储器包括硬盘、软盘、光盘和u盘等,典型的软件安装在外部存储器上

内存:

内存是计算机的重要部件之一,是与CPU沟通的桥梁。 由于计算机中的所有程序都在内存中运行,因此内存性能对计算机的影响非常大。 存储器(Memory )也称为内置存储器,作为用于临时存储CPU内的运算数据和与硬盘等外部存储器交换的数据发挥作用。 只要计算机运行,CPU就会将需要运算的数据传输到存储器中进行运算。 运算完成后,CPU传输结果时,内存行为决定计算机的稳定运行。 这样的内存一般关闭电源后数据会变空

缓存:

缓存是为了调整CPU和主内存之间的访问速度差异而设置的。 一般而言,CPU的动作速度较高,但存储器的动作速度相对较低。 为了解决这个问题,通常使用缓存,并且缓存的访问速度在CPU和主存储器之间。 系统通过将几个CPU在最近几个小时内频繁访问的内容保存在高速缓存中,在CPU需要使用数据时先在高速缓存中查找,找到后不需要访问内存,在找不到时查找内存,从而实现主

------------- -请参阅

虽然我不了解此缓存的缓存,但实际上缓存只是将一些外部存储器上的数据存储在内存中。 怎么保存在内存中呢? 我们运行的所有程序,其内部变量值都位于内存中,要将一个值放在内存中,实质上就是在获取此变量后,用生存期长的变量保存想要保存的值。 在java中,一些缓存通常是在map集合中创建的。

Java经常使用缓存,而SSh框架也使用l1和l2缓存。 到底缓存是怎么实现的呢?

简而言之,如果系统外部存储的资源和数据(如数据库和硬盘文件)频繁使用,则每次处理数据时从数据库和硬盘检索数据的速度都将变慢,成为性能问题。

一种简单的解决方案是,将这些数据缓存在存储器中,每次操作时,首先在存储器中查找,看看是否有这些数据,如果有,就直接使用,否则将其获取并放入缓存,就进行下一次访问这样可以节省很多时间。 当然,缓存是典型的空间交换方案。

Java中最常见的缓存实现方法之一是使用Map,基本过程如下:

首先在缓存中查找,看看是否有要使用的数据

如果找不到,则创建满足要求的数据,并将设置返回到缓存以备下一次使用

如果找到了适当的数据,或者创建了适当的数据,则直接使用该数据。

3359 blog.csdn.net /郑赵杨122/article/details/82184029转载:

1、什么是现金?

高速缓存是指用于交换数据的缓冲区,称为高速缓存。 当一个硬件尝试读取数据时,它首先从缓存中汇总查询中的数据,如果有的话直接执行,如果没有,则从内存中检索。 缓存的数据比内存快,因此缓存的作用是帮助硬件加快速度。

由于缓存经常使用RAM (断电后不会消失的非持久存储),因此在用完之后,缓存会将文件发送到硬盘等存储器进行永久存储。 电脑中最大的缓存是记忆棒,硬盘上也有16M或32M的缓存。

缓存是为了调整CPU和主内存之间的访问速度差异而设置的。 CPU通常运行得很快,但内存运行速度相对较低。 为了解决这个问题,通常使用CPU和主内存之间的缓存。 最近几个小时,系统经常访问的部分CPU上有缓存,从而在一定程度上减少了由于主内存速度降低而导致的CPU“停机”。

缓存只是将一些外部存储器上的数据存储在内存中。 为什么要保存在内存中,因为我们运行的所有程序中的变量都保存在内存中,如果想把值放入内存中,可以用变量保存。 在JAVA中,一些缓存通常通过Map集合实现。

缓存根据场景的不同作用也不同的具体例子:

OS磁盘缓存——减少了磁盘的机械操作。

数据库高速缓存——减少文件系统IO。

高速APP应用程序高速缓存——减少了对数据库的查询。

Web服务器高速缓存——减少了对APP应用服务器的请求。

客户端缓存——减少了对网站的访问。

2、常见的现金策略是什么? 如何使缓存(例如redis )和数据库中的数据保持一致? 你的项目使用什么样的缓存系统? 你是怎么设计的?

1 )由于不同系统的数据访问模式不同,在同一缓存策略下难以在不同的数据访问模式下获得满意的性能,研究者提出了不同的缓存策略以满足不同的需求。

缓存策略分类:

1 )基于访问的时间)在每个缓存条目被访问时组织和确定缓存队列

替换对象。如LRU

2)、基于访问频率:此类算法用缓存项的被访问频率来组织缓存。如LFU、LRU2、2Q、LIRS。

3)、访问时间与频率兼顾:通过兼顾访问时间和频率。使得数据模式在变化时缓存策略仍有较好性能。如FBR、LRUF、ALRFU。多数此类算法具有一个可调或自适应参数,通过该参数的调节使缓存策略在基于访问时间与频率间取得一个平衡。

4)、基于访问模式:某些应用有较明确的数据访问特点,进而产生与其相适应的缓存策略。如专用的VoD系统设计的A&L缓存策略,同时适应随机、顺序两种访问模式的SARC策略。

2)、数据不一致性产生的原因:

【1】、先操作缓存,再写数据库成功之前,如果有读请求发生,可能导致旧数据入缓存,引发数据不一致。在分布式环境下,数据的读写都是并发的,一个服务多机器部署,对同一个数据进行读写,在数据库层面并不能保证完成顺序,就有可能后读的操作先完成(读取到的是脏数据),如果不采用给缓存设置过期时间策略,该数据永远都是脏数据。

【解决办法】:1)、可采用更新前后双删除缓存策略。

2)、可以通过“串行化”解决,保证同一个数据的读写落在同一个后端服务上。

【2】、先操作数据库,再清除缓存。如果删缓存失败了,就会出现数据不一致问题。

【解决办法】:1)、将删除失败的key值存入队列中重复删除,如下图:

(1)更新数据库数据。

(2)缓存因为种种问题删除失败。

(3)将需要删除的key发送至消息队列。

(4)自己消费消息,获得需要删除的key。

(5)继续重试删除操作,直到成功。

缺点:对业务线代码造成大量的侵入。于是有了方案二。

2)、方案二:通过订阅binlog获取需要重新删除的Key值数据。在应用程序中,另起一段程序,获得这个订阅程序传来的消息,进行删除缓存操作。

(1)更新数据库数据

(2)数据库会将操作信息写入binlog日志当中

(3)订阅程序提取出所需要的数据以及key

(4)另起一段非业务代码,获得该信息

(5)尝试删除缓存操作,发现删除失败

(6)将这些信息发送至消息队列

(7)重新从消息队列中获得该数据,重试操作。

3、如何防止缓存穿透、缓存击穿、缓存雪崩和缓存刷新。

【1】、缓存穿透:缓存穿透是说收到一个请求,但是该请求缓存中不存在,只能去数据库中查询,然后放进缓存。但当有好多请求同时访问同一个数据时,业务系统把这些请求全发到了数据库;或者恶意构造一个逻辑上不存在的数据,然后大量发送这个请求,这样每次都会被发送到数据库,最总导致数据库挂掉。

解决的办法:对于恶意访问,一种思路是先做校验,对恶意数据直接过滤掉,不要发送至数据库层;第二种思路是缓存空结果,就是对查询不存在的数据也记录在缓存中,这样就可以有效的减少查询数据库的次数。非恶意访问,结合缓存击穿说明。

【2】、缓存击穿:上面提到的某个数据没有,然后好多请求查询数据库,可以归为缓存击穿的范畴:对于热点数据,当缓存失效的一瞬间,所有的请求都被下放到数据库去请求更新缓存,数据库被压垮。

解决的办法:防范此类问题,一种思路是加全局锁,就是所有访问某个数据的请求都共享一个锁,获得锁的那个才有资格去访问数据库,其他线程必须等待。但现在大部分系统都是分布式的,本地锁无法控制其他服务器也等待,所以要用到全局锁,比如Redis的setnx实现全局锁。另一种思想是对即将过期的数据进行主动刷新,比如新起一个线程轮询数据,或者比如把所有的数据划分为不同的缓存区间,定期分区间刷新数据。第二个思路与缓存雪崩有点关系。

【3】、缓存雪崩:缓存雪崩是指当我们给所有的缓存设置了同样的过期时间,当某一时刻,整个缓存的数据全部过期了,然后瞬间所有的请求都被抛向了数据库,数据库就崩掉了。

解决的办法:解决思路要么是分治,划分更小的缓存区间,按区间过期;要么给每个key的过期时间加一个随机值,避免同时过期,达到错峰刷新缓存的目的。

【4】、缓存刷新:既清空缓存 ,一般在insert、update、delete操作后就需要刷新缓存,如果不执行就会出现脏数据。但当缓存请求的系统蹦掉后,返回给缓存的值为null。

————————————————

版权声明:本文为CSDN博主「程序猿进阶」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/zhengzhaoyang122/article/details/82184029

总结缓存的测试点:

1.缓存的读写与数据库是否一致;

2.缓存的降级逻辑;

3.缓存加入新的Key值后,会不会顺序不一致;

4.缓存的key是否过滤了恶意数据;

5.value为空的时候,缓存值是否也更新了;

6.缓存的过期时间设置,检查是否是同一个值,避免雪崩;

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。