为什么数据库缓存如此重要?

您在数据库中拥有的信息越多,它随着时间的推移就会越慢。即使是为支持许多并发请求而精心设计的数据库管理系统也将最终达到极限。

数据库缓存是处理这些性能问题的最常见策略之一。缓存涉及将数据库查询的结果保存在更快,更容易访问的位置。正确完成后,缓存将减少查询响应时间,减少数据库负载并降低成本。

但是,缓存也需要小心处理,因为它们实际上是在另一个位置创建另一个信息副本。保持数据库和缓存同步并保持最新可能比您预期的更棘手。在下一节中,我们将讨论一些最常见的数据库缓存策略。

图片标题

什么是不同的缓存策略?

手动缓存(也称为缓存搁置策略)涉及直接管理数据库和缓存。您的应用程序在启动数据库查询之前检查缓存,并在对数据库进行任何更改后更新缓存。

虽然如果正确实现有效,但手动缓存可能非常繁琐,尤其是在您需要查询多个数据库时。出于这些原因,开发人员发明了许多替代缓存策略。

直读缓存策略

在读取缓存中,应用程序首先查询缓存以查看其所需的信息是否在内部。如果没有,它将从数据库中检索信息并使用它来更新缓存。缓存提供程序或缓存库负责查询和更新缓存的详细逻辑。

当应用程序重复请求相同的数据时,读取策略最适合读取繁重的工作负载:例如,一遍又一遍地加载相同文章的新闻网站。

读取策略的一个缺点是对缓存的第一次查询将始终导致未命中,因为保证所请求的信息不在内部。为了解决这个问题,开发人员通常会使用用户可能要求的信息提前“加热”缓存。

直写缓存策略

在直写式高速缓存中,首先对高速缓存进行更新,然后对数据库进行更新。从应用程序到缓存以及从缓存到数据库都有一条直接线。与直读式缓存结合使用时,直写式策略可确保您的数据保持一致,从而无需手动缓存失效。

写缓存策略

在后写式缓存(也称为回写式高速缓存)中,应用程序首先将数据写入高速缓存。经过一段设定的延迟后,缓存也会将此信息写入数据库。后写缓存最适合写入繁重的工作负载,即使出现一些故障和停机也可以很好地执行。

基于Java的Redis缓存与Redisson

Redis是NoSQL数据库最受欢迎的选项之一,它使用键值系统来存储数据。Redisson是Java编程语言中的Redis客户端库,可以使用所有熟悉的Java集合轻松访问Redis功能。

Redisson允许您将数据放在外部存储中的地图中。您可以使用此功能实现数据库,Web服务或任何其他数据源的缓存。

Redis中的直读缓存

下面是一个Java示例,说明如何在Redis和Redisson中使用直读缓存。 

如果请求的条目在缓存中不存在,则它将由MapLoader对象加载:

MapLoader < String,String >  mapLoader  =  new  MapLoader < String,String >(){
 
    @覆盖
    public  Iterable < String >  loadAllKeys(){
        List < String >  list  =  new  ArrayList < String >();
        声明 声明 =  conn。createStatement();
        尝试 {
            ResultSet  结果 =  语句。executeQuery(“SELECT id FROM student”);
            而(结果。下一个()){
                清单。添加(结果。的getString(1));
            }
        } finally {
            声明。close();
        }
 
        返回 清单 ;
    }
 
    @覆盖
    public  String  load(String  key){
        PreparedStatement  preparedStatement  =  conn。prepareStatement(“SELECT name FROM student where id =?”);
        尝试 {
            preparedStatement。setString(1,key);
            ResultSet  result  =  preparedStatement。executeQuery();
            如果(结果。下一个()){
                返回 结果。getString(1);
            }
            return  null ;
        } finally {
            preparedStatement。close();
        }
    }
};

配置示例:

MapOptions < K,V >  options  =  MapOptions。< K,V > 默认值()
                              。loader(mapLoader);
 
RMap < K,V >  map  =  redisson。getMap(“test”,options);
// 要么
RMapCache < K,V >  map  =  redisson。getMapCache(“test”,options);
//或者提升高达45倍 
RLocalCachedMap < K,V >  map  =  redisson。getLocalCachedMap(“test”,options);
//或者提升高达45倍 
RLocalCachedMapCache < K,V >  map  =  redisson。getLocalCachedMapCache(“test”,options);

Redis中的直写缓存

下面是一个Java示例,说明如何在Redis中使用Redis中的Redis使用直写缓存。

在MapWriter对象更新缓存和数据库之前,缓存更新方法不会返回:

MapWriter < String,String >  mapWriter  =  new  MapWriter < String,String >(){
 
    @覆盖
    public  void  write(Map < String,String >  map){
        PreparedStatement  preparedStatement  =  conn。prepareStatement(“INSERT INTO student(id,name)values(?,?)”);
        尝试 {
            对于(条目< 字符串,字符串>  条目:地图。的entrySet()){
                preparedStatement。的SetString(1,条目。信息getKey());
                preparedStatement。的SetString(2,条目。的getValue());
                preparedStatement。addBatch();
            }
            preparedStatement。executeBatch();
        } finally {
            preparedStatement。close();
        }
    }
 
    @覆盖
    public  void  delete(Collection < String >  keys){
        PreparedStatement  preparedStatement  =  conn。prepareStatement(“DELETE FROM student where id =?”);
        尝试 {
            for(String  key:keys){
                preparedStatement。setString(1,key);
                preparedStatement。addBatch();
            }
            preparedStatement。executeBatch();
        } finally {
            preparedStatement。close();
        }
    }
};

配置示例:

MapOptions < K,V >  options  =  MapOptions。< K,V > 默认值()
                              。writer(mapWriter)
                              。writeMode(WriteMode。WRITE_THROUGH);
 
RMap < K,V >  map  =  redisson。getMap(“test”,options);
// 要么
RMapCache < K,V >  map  =  redisson。getMapCache(“test”,options);
//或者提升高达45倍 
RLocalCachedMap < K,V >  map  =  redisson。getLocalCachedMap(“test”,options);
//或者提升高达45倍 
RLocalCachedMapCache < K,V >  map  =  redisson。getLocalCachedMapCache(“test”,options);

Redis中的写缓存

MapWriter接口还用于异步提交对Map对象(缓存)和外部存储(数据库)的更新。所有映射更新都按批次累积,并以定义的延迟异步写入。

writeBehindDelay - 批量写入或删除操作的延迟。默认值为1000毫秒。

writeBehindBatchSize  - 批量大小。每个批处理包含Map Entry写入或删除命令。默认值为50。

下面,我们看到Redisson中基于Redis的后写缓存实现的配置的Java示例:

MapOptions < K,V >  options  =  MapOptions。< K,V > 默认值()
                              。writer(mapWriter)
                              。writeMode(WriteMode。WRITE_BEHIND)
                              。writeBehindDelay(5000)
                              。writeBehindBatchSize(100);
 
RMap < K,V >  map  =  redisson。getMap(“test”,options);
// 要么
RMapCache < K,V >  map  =  redisson。getMapCache(“test”,options);
//或者提升高达45倍 
RLocalCachedMap < K,V >  map  =  redisson。getLocalCachedMap(“test”,options);
//或者提升高达45倍 
RLocalCachedMapCache < K,V >  map  =  redisson。getLocalCachedMapCache(“test”,options);

所有讨论的策略可用于在旋转地图,RMapCache,RLocalCachedMap和RLocalCachedMapCache对象Redisson。使用后两个对象可以使Redis中的读取操作速度提高45倍。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
WordPress 博客程序有许多优秀的插件可以拓展博客的功能,但也会在你的数据库里插入大量的数据,包括一些可能会拖垮你的博客的垃圾数据,所谓的垃圾数据,就是那些残留在你数据库表中的数据,例如:当你停用并删除某些插件或是主题的时候,也许你会认为它们已经彻底被删除。其实不然,还有或多或少的残留文件还悄悄地隐藏在你Wordpress数据库中的wp_options表中,如此长此发展下去,我们的数据库会在不知不觉中,变的越来越越庞大。 而且,WordPress管理后台的首页或其它页面,还会自动生成一些rss的缓存,并保存到wp_options里面,而这些内容往往也不容小窥,当WordPress通过get_option()函数查询wp_options表里的数据时,这些垃圾数据会严重影响博客的速度。所以,清理这些垃圾数据变的尤为重要, Clean Options plugin 提供了一个管理数据库中wp_options数据表的简便方法。并且它有许多内置的安全机制,这将有助于防止因意外删除的表行而造成博客运行的错误。它的目的就是让插件用户轻松和安全地维护wp_options数据表,从而提高其博客运行的速度,并保持这种状态! Clean Options 插件按照: 1.下载Clean Options 插件,然后上传插件到/wp-content/plugins/下的文件夹 2.在后台激活插件后,你可以在"Tools"--->"CleanOptions"选项,点击“CleanOption”链接,页面如下图: 选择适当的选项,点击“Find Orphaned Options” --->进入“To double-check options in the Orphaned Options list”页面--->单击下方的“Select All“ ,选择页面中的内容---->点击”View Selected Options Information“ 。进入删除页面,根据页面提示,选择是否删除相关信息,选择好后,点击”Submit“清除表中内容。 Clean Options 插件还提供了预警信息,以提醒用户可能会遇到的潜在问题,这款插件对于我们博主来说是非常实用且有效的工具。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值