来自 威尼斯国际官方网站 2019-10-18 23:14 的文章
当前位置: 威尼斯国际官方网站 > 威尼斯国际官方网站 > 正文

ehcache实现快速查询,继续吐槽在net下没有合适的

  

项目中需要用到一些查询,数据的修改很少但查询度很大。有时还是按频率查询的。

         说起缓存,大家可能口若悬河,各种类型的缓存都能一一分析,但在net下找到一款合适的Disk Cache貌似还是有一点难度的。

 无论如何缓存都是针对查询远远大于更新和插入的情况

 

mybatis 有自带的缓存,一级缓存是session级别,二级缓存是namespace 。

一:背景

开启二级缓的缺点:1)只有在一个namespace操作单表时使用,比如:user,和user_role两张表,如果user_role修改了,利用user的namespace去查询的结果就是脏数据。

  事情是这样的,最近的一个项目中,需要在web端绘制一些报表,因为报表的基础数据源都是全内存式的,所以内存相对我们来说是比较吃紧的,大家可能

         2)在更新其中一条的时候,整个namespace都会被刷新。我们其实知道只要刷新一条就好。

大家知道,比如一些散点图,这种类型的报表数据非常的多,为了加速,我需要缓存两种数据:

个人觉得业务层自己控制会比较好。

 

我目前项目中遇到2种情况,

1. 根据基础数据源计算出中间结果,为了下一次加速,缓存个几十分钟,这个数据量相对来说比较大。

1)业务只查询最近半小时的数据,数据时常更新,不断会有数据插入。就是一些临时的性能数据。

2. 将服务的Response进行30分钟缓存,这个数据量也相对比较大,大概10-50M的样子。

方案:给个ehcache,保存最近半小时的数据,设置定时任务,把之前的数据批量入库。查询优先在缓存中进行。

 

2)数据库的数据是配置型的,比如用户的个人信息,然后多个地方需要用到。并且用到的频率都很大。

      刚才也说了,内存比较吃紧,如果把这些数据再放到内存里面就比较尴尬,也是业务不允许的,如果把这么大的数据块放在分布式缓存中,流量起来之后带

方案:业务层使用ehcache和mybatis 缓存。当然,你也可以单独写一个ehcache缓存类来操作这个缓存。然后随着业务的增大,感觉好多表的数据都需要这类缓存的时候,你就开始思考人生了。

宽也是一个问题,会更多的面临超时的风险,所以最好的方式就是使用本机磁盘缓存,这样就可以在性能和内存中取一个平衡点~威尼斯国际官方网站 ,~~

 

 

单独写ehcache类,保存数据。

二:寻找解决方案

spring-boot +mybaits +ehcache (缓存注解,你想放哪里就哪里。如果考虑到会直接修改数据库,写个后门,直接刷新缓存,注意安全!)

  

maven构建。

           平衡点找到了,貌似在.net领域中很少听说有磁盘缓存这种概念,既然听说的少,那就在nuget中浪一浪,然后就找到了一个top1的diskcache,如下图:

关键依赖的包(具体版本按最新的来)

 

    <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context-support</artifactId>
        </dependency>
      <dependency>
        <groupId>net.sf.ehcache</groupId>
        <artifactId>ehcache</artifactId>
    </dependency>        

威尼斯国际官方网站 1

 

 

ehcache.xml配置

拉下来一测试,卧槽,就的一个CURD操作,连TTL和TTI的功能都没有,还要捐啥比特币,O(∩_∩)O

<?xml version="1.0" encoding="UTF-8"?>
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd"
    updateCheck="false">
    <diskStore path="user.dir/sqlEhCache" />

    <defaultCache eternal="false" maxElementsInMemory="1000"
        overflowToDisk="false" diskPersistent="false" timeToIdleSeconds="0"
        timeToLiveSeconds="600" memoryStoreEvictionPolicy="LRU" />

    <cache name="baseCache" eternal="true" maxElementsInMemory="1000" maxElementsOnDisk="10000"
        overflowToDisk="true" diskPersistent="false" timeToIdleSeconds="0"
        timeToLiveSeconds="300" memoryStoreEvictionPolicy="LRU" />

</ehcache>

威尼斯国际官方网站 2

 

 

 

既然net下没有啥好的解决方案,目光只能投到java下面看看,很快就找到了ehCache,看下官方说明挺牛叉的,介入方式还是和上一篇一样,使用thrift做C#

(1).diskStore: 为缓存路径,ehcache分为内存和磁盘两级,此属性定义磁盘的缓存位置。参数解释如下:    
             user.home – 用户主目录
             user.dir  – 用户当前工作目录
             java.io.tmpdir – 默认临时文件路径

和Java之间的交互媒介就可以了。(thrift的具体使用方法,大概可以看上一篇)如下图:

  (2).defaultCache:默认缓存策略,当ehcache找不到定义的缓存时,则使用这个缓存策略。只能定义一个。

威尼斯国际官方网站 3 

       (3).cache:自定缓存策略,为自定义的缓存策略。参数解释如下:

三:Ehcache的配置

cache元素解释:

本文由威尼斯国际官方网站发布于威尼斯国际官方网站,转载请注明出处:ehcache实现快速查询,继续吐槽在net下没有合适的

关键词: