首页 > 其他分享 >缓存

缓存

时间:2023-07-16 17:45:55浏览次数:33  
标签:map 缓存 读取 数据库 使用 数据

缓存

缓存,是一种减少I/O读写和CPU计算,以提升性能的手段。

缓存的使用

主要用在需要频繁读某些不变动,或者变动较少的数据的场景。一般使用场景是:应用中使用缓存,需要读数据时,先去缓存中查询。缓存中没有的话,再查数据库,查到数据后返回结果,并将结果写到缓存中。

缓存分类

本地缓存

指应用中的缓存,缓存与应用在同一个进程内部,请求快,无网络开销。缺点是多个应用间无法共享。

实现方式:

  • 使用成员变量,或者局部变量
  • 使用静态变量,进程间可共享

一般使用Map实现,考虑多线程安全,则使用ConcurrentHashMap。ID作为key,每次使用id去查缓存。

分布式缓存

缓存是一个独立的应用,多个应用可以共享缓存,可实现持久化。一般使用redis实现

缓存更新问题

如果数据库中的数据有更新,如何更新缓存?

可以采用缓存过期策略,或者定期将数据从数据库中更新到缓存中。

有几种缓存过期策略:

  1. 先进先出。先缓存的数据,先清理。
  2. 最少使用。统计缓存的使用情况,最少使用的数据说明不是热点数据,可以清理掉。
  3. 最近最少使用。最近最少使用的数据,说明数据已经不再是热点数据了,可以清理掉。

满足上述策略的数据会被清理掉,下次访问缓存时再从数据库中读取并更新到缓存中。当然上述策略也是为了释放内存。

另外一种策略是,使用定时任务,在系统负载较低的时候,比如说晚上系统使用人数较少时,从数据库中读取数据,更新到缓存。

如果是应用内的缓存,或者缓存使用并不是很多的情况,并不需要考虑这么复杂的操作。

可以缩小缓存的使用范围,例如缩小到某个方法中,每次请求都清空缓存,再从数据库中读取或者从缓存中读取。这种针对需要在方法中循环处理大量数据,且这批数据中有需要大量读取某个相同值的情况。

例如需要处理一批数据,这批数据中有个字段需要从数据库中获取值,这个字段的值可能相同,不必要处理每条数据时都从数据库中读取,可以每次读取数据后,将值缓存起来,下一条数据先从缓存中读取。

这里定义一个成员变量map作为缓存

private Map<String,String> map;

这个map在什么时候初始化呢?如果在类初始化的时候进行初始化,则存储在map中的数据只有在重启服务后才能清空,重启才能从数据库中获取最新的数据,在此之前读取的数据都是旧。这对数据有变化的情况是不能接受的。

只能在每次处理数据前,初始化map,即是清空map,使得缓存只在这次的请求中生效,这样能保证这次的请求获取的是最新的数据。当然,性能的提升也只是在这次的请求中,下次请求还是先从数据库中读取数据。

标签:map,缓存,读取,数据库,使用,数据
From: https://www.cnblogs.com/leanfish/p/17558221.html

相关文章

  • 实现concurrentHashMap与redis两级缓存
    一、实现concurrentHashMap与redis两级缓存以下是一种使用ConcurrentHashMap和Redis实现两级缓存的示例代码:importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.cache.annotation.CacheEvict;importorg.springframework.cache.ann......
  • 如何使用C#中的Lambda表达式操作Redis Hash结构,简化缓存中对象属性的读写操作
    Redis是一个开源的、高性能的、基于内存的键值数据库,它支持多种数据结构,如字符串、列表、集合、散列、有序集合等。其中,Redis的散列(Hash)结构是一个常用的结构,今天跟大家分享一个我的日常操作,如何使用Redis的散列(Hash)结构来缓存和查询对象的属性值,以及如何用Lambda表达式树来简化......
  • 如何提高缓存命中率
    这种问题的话,肯定是要提前设置好缓存的第二要有相对严格的双写一致策略,只要数据库数据发生变化,就要主动更新缓存,可以用binlog,代码层面可以用读写锁限制写的请求第三要使用定时任务固定刷新第四要有判空操作,一般的缓存使用,如果不存在的key,可能会前往db进行查询,可以打破这一规则,......
  • 67.requireJS的核心原理是什么(如何动态加载的如何避免多次加载的如何缓存的)
    67.requireJS的核心原理是什么?(如何动态加载的?如何避免多次加载的?如何缓存的?)require.js的核心原理是通过动态创建script脚本来异步引入模块,然后对每个脚本的load事件进行监听,如果每个脚本都加载完成了,再调用回调函数。详细资料可以参考:《requireJS的用法和原理分析》......
  • 122.get和post请求在缓存方面的区别
    122.get和post请求在缓存方面的区别相关知识点:get请求类似于查找的过程,用户获取数据,可以不用每次都与数据库连接,所以可以使用缓存。post不同,post做的一般是修改和删除的工作,所以必须与数据库交互,所以不能使用缓存。因此get请求适合于请求缓存。回答:缓存一般只适用......
  • springboot 使用caffeine 并监控本地缓存
    1、添加依赖<dependency><groupId>com.github.ben-manes.caffeine</groupId><artifactId>caffeine</artifactId></dependency> 2、添加配置packagecom.example.demo.config;importcom.github.ben......
  • 如何实现redis 缓存数据的过期时间设置随机化的具体操作步骤
    Redis缓存数据的过期时间设置随机化在大型应用程序中,缓存是提高性能和减少数据库负载的重要技术。Redis是一种流行的内存缓存数据库,能够快速地存储和检索数据。在使用Redis缓存数据时,设置缓存数据的过期时间是很常见的需求。为什么要设置缓存数据的过期时间缓存数据的过期时......
  • python实现ttl缓存
      importtimeimportfunctoolsimportthreadingdefttl_cache(func):cache={}lock=threading.Lock()@functools.wraps(func)defwrapper(*args,**kwargs):key=argsforiteminkwargs.items():key+=it......
  • springboot 自定义整合caffeine 本地缓存
    1、自定义缓存配置类@Data@ConfigurationProperties(prefix="page.cache")publicclassPageCacheProperties{privateCaffeineConfigPropertiescaffeine=newCaffeineConfigProperties();//本地缓存配置privatePageCacheAsyncExecutorConfigpool=newP......
  • Mybatis里面的缓存机制
    1.mybatis的SqlSession是什么MyBatis的SqlSession是MyBatis框架提供的一个关键接口,它代表了和数据库的一次会话。SqlSession提供了执行SQL语句、管理事务以及获取映射器(Mapper)等操作。在一般情况下,每次查询都会创建一个新的SqlSession实例。这是因为SqlSession代表......