Mybatis cache (12)

Mybatis cache


查询:连接数据库,耗资源!
		一次查询的结果,给他暂存在一个可以直接取到的地方!=》内存:缓存
我们再次查询相同数据的时候,直接走缓存,就不用走数据库了

1. What is cache [Cache]?

  • Temporary data stored in memory
  • Put the data frequently queried by users in the cache (memory), and users do not need to query from the disk (relational database data files) to query the data, and query from the cache, thereby improving query efficiency and solving the performance problem of high-concurrency systems .

2. Why use caching?

  • Reduce the number of interactions with the database, reduce system overhead, and improve system efficiency.

3. What kind of data can be cached?

  • Data that is frequently queried and not frequently changed. [Cache can be used]

1.Mybatis cache

  • MyBatis includes a very powerful query cache feature, it can be very convenient to customize and configure the cache. Caching can greatly improve query efficiency.
  • Two levels of cache are defined by default in the MyBatis system: the first level cache and the second level cache
  • By default, only the first level cache is enabled. (SqlSession level cache, also known as local cache)
  • The second-level cache needs to be manually opened and configured. It is based on the namespace-level cache.
  • In order to improve scalability, MyBatis defines a cache interface Cache. We can customize the second-level cache by implementing the Cache interface

2. Level 1 cache

  • The first level cache is also called the local cache: SqlSession
  • The data queried during the same session with the database will be placed in the local cache.
  • If you need to get the same data in the future, you can get it directly from the cache, there is no need to query the database;
    test steps:
    1. Turn on the log!
    2. Test to query the same record twice in a session.
    3. View log output.
Insert picture description here


Cache invalidation:
1. Query different things
2. Add, delete and modify operations, which may change the original data, so the cache must be refreshed!
3. Query different Mappers
4. Manually clear the cache!

        sqlSession.clearCache();//手动清理缓存

Summary: The first level cache is enabled by default, and it is only valid in one SqlSession, that is, the interval between getting the connection and closing the connection!
The first level cache is a Map.

3. Secondary cache

  • The second-level cache is also called the global cache. The scope of the first-level cache is too low, so the second-level cache was born.
  • Based on the namespace-level cache, a namespace corresponds to a second-level cache;
  • Working Mechanism
  • A session queries a piece of data, this data will be placed in the current session's first-level cache;
  • If the current session is closed, the first-level cache corresponding to this session is gone; but what we want is that the session is closed and the data in the first-level cache is saved to the second-level cache;
  • The new session query information can get the content from the second-level cache;
  • The data detected by different mappers will be placed in their corresponding cache (map);

Steps:
1. Turn on the global cache

<!--       显示的开启全局缓存 -->
        <setting name="cacheEnabled" value="true"/>

2. Open in the Mapper that you want to use the second-level cache

<!--    在当前Mapper.xml中使用二级缓存-->
    <cache ></cache>
    ```
 也可以自定义参数
 ```xml
   <cache  eviction="FIFO"
    flushInterval="60000"
    size="512"
    readOnly="true" />

3. Test

1. Question: We need to serialize the entity class! Otherwise, an error will be reported!

Caused by:java.io.NotSerializableException:com.yang.pojo.User

summary:

  • As long as the second level cache is turned on, it will work under the same Mapper
  • All data will be placed in the first level cache;
  • Only when the session is submitted or closed will it be submitted to the second-level cache!

4. Cache principle

Insert picture description here

5. Custom cache-ehcache

Ehcache是一种广泛使用的开源java分布式缓存。主要面向通用缓存

To use ehcache in the program, you must first import the package!

        <dependency>
            <groupId>org.mybatis.caches</groupId>
            <artifactId>mybatis-ehcache</artifactId>
            <version>1.1.0</version>
        </dependency>

Specify our ehcache cache implementation in the mapper!

<!--    在当前Mapper.xml中使用二级缓存-->
    <cache type="org.mybatis.caches.ehcache.EhcacheCache"></cache>

ehcache.xml

<?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:为缓存路径,ehcache分为内存和磁盘两级,此属性定义磁盘的缓存位置。参数解释如下:
       user.home – 用户主目录
       user.dir – 用户当前工作目录
       java.io.tmpdir – 默认临时文件路径
     -->
    <diskStore path="./tmpdir/Tmp_EhCache"/>

    <defaultCache
            eternal="false"
            maxElementsInMemory="10000"
            overflowToDisk="false"
            diskPersistent="false"
            timeToIdleSeconds="1800"
            timeToLiveSeconds="259200"
            memoryStoreEvictionPolicy="LRU"/>

    <cache
            name="cloud_user"
            eternal="false"
            maxElementsInMemory="5000"
            overflowToDisk="false"
            diskPersistent="false"
            timeToIdleSeconds="1800"
            timeToLiveSeconds="1800"
            memoryStoreEvictionPolicy="LRU"/>
    <!--
       defaultCache:默认缓存策略,当ehcache找不到定义的缓存时,则使用这个缓存策略。只能定义一个。
     -->
    <!--
      name:缓存名称。
      maxElementsInMemory:缓存最大数目
      maxElementsOnDisk:硬盘最大缓存个数。
      eternal:对象是否永久有效,一但设置了,timeout将不起作用。
      overflowToDisk:是否保存到磁盘,当系统宕机时
      timeToIdleSeconds:设置对象在失效前的允许闲置时间(单位:秒)。仅当eternal=false对象不是永久有效时使用,可选属性,默认值是0,也就是可闲置时间无穷大。
      timeToLiveSeconds:设置对象在失效前允许存活时间(单位:秒)。最大时间介于创建时间和失效时间之间。仅当eternal=false对象不是永久有效时使用,默认是0.,也就是对象存活时间无穷大。
      diskPersistent:是否缓存虚拟机重启期数据 Whether the disk store persists between restarts of the Virtual Machine. The default value is false.
      diskSpoolBufferSizeMB:这个参数设置DiskStore(磁盘缓存)的缓存区大小。默认是30MB。每个Cache都应该有自己的一个缓冲区。
      diskExpiryThreadIntervalSeconds:磁盘失效线程运行时间间隔,默认是120秒。
      memoryStoreEvictionPolicy:当达到maxElementsInMemory限制时,Ehcache将会根据指定的策略去清理内存。默认策略是LRU(最近最少使用)。你可以设置为FIFO(先进先出)或是LFU(较少使用)。
      clearOnFlush:内存数量最大时是否清除。
      memoryStoreEvictionPolicy:可选策略有:LRU(最近最少使用,默认策略)、FIFO(先进先出)、LFU(最少访问次数)。
      FIFO,first in first out,这个是大家最熟的,先进先出。
      LFU, Less Frequently Used,就是上面例子中使用的策略,直白一点就是讲一直以来最少被使用的。如上面所讲,缓存的元素有一个hit属性,hit值最小的将会被清出缓存。
      LRU,Least Recently Used,最近最少使用的,缓存的元素有一个时间戳,当缓存容量满了,而又需要腾出地方来缓存新的元素的时候,那么现有缓存元素中时间戳离当前时间最远的元素将被清出缓存。
   -->
</ehcache>

Redis database for caching! KV