1. 程式人生 > >spring boot 整合 mybatis 使用redis做二級快取

spring boot 整合 mybatis 使用redis做二級快取

1引入(mybatis和redis)

<dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
    <version>1.3.2</version>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
    <exclusions>
        <exclusion>
           <groupId>io.lettuce</groupId>
           <artifactId>lettuce-core</artifactId>
        </exclusion>
    </exclusions>
</dependency>
<dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
</dependency>

2.給redis伺服器設定密碼和埠

在redis目錄下,開啟redis.windows.conf,在配置檔案中有個引數:requirepass  這個就是配置redis訪問密碼的引數,去掉#

比如 requirepass 123qweasd

然後新建一個start.txt,輸入redis-server.exe redis.windows.conf,指向配置檔案,然後改成start.bat,開啟服務端後,再開啟

redis-cli.exe,就需要輸入密碼了,比如auth 123qweasd

埠同理

3.配置屬性檔案

mybatis.mapper-locations=classpath:/mapperxml/*Mapper.xml
mybatis.type-aliases-package=com.mapper
#使全域性的對映器啟用或禁用快取。(開啟二級快取)
mybatis.configuration.cache-enabled=true
#全域性啟用或禁用延遲載入。當禁用時,所有關聯物件都會即時載入。
mybatis.configuration.lazy-loading-enabled=true
#用來顯示sql語句
logging.level.com.mapper=debug

# Redis資料庫索引(預設為0)
spring.redis.database=0
# Redis伺服器地址
spring.redis.host=127.0.0.1
# Redis伺服器連線埠
spring.redis.port=6379
# Redis伺服器連線密碼(預設為空)
spring.redis.password=123qweasd
# 連線池最大連線數(使用負值表示沒有限制)
spring.redis.jedis.pool.max-active=8
# 連線池最大阻塞等待時間(使用負值表示沒有限制)
spring.redis.jedis.pool.max-wait=-1
# 連線池中的最大空閒連線
spring.redis.jedis.pool.max-idle=8
# 連線池中的最小空閒連線
spring.redis.jedis.pool.min-idle=0
# 連線超時時間(毫秒)
spring.redis.timeout=1000

#如果由底層的快取管理器支援建立,以逗號分隔的列表來快取名稱
spring.cache.cache-names=redisCache
#是否允許redis快取空值
spring.cache.redis.cache-null-values=true
#redis的鍵字首
spring.cache.redis.key-prefix=redisCache_
#快取超時時間戳,設定為0不設定超時時間
spring.cache.redis.time-to-live=600000ms
#是否啟用redis的鍵字首
spring.cache.redis.use-key-prefix=true
#快取型別,在預設的情況下,redis會根據上下文自動探測
spring.cache.type=redis

4.整合mybatis使用MybatisCodeHelper外掛https://mp.csdn.net/postedit/85013465

5.使用註解@EnableCaching

@SpringBootApplication
@EnableCaching
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }

}

5.在實現類的方法上使用@Cache註解,有三種,具體看http://www.cnblogs.com/junzi2099/p/8301796.html#_label2

(1)CachePut,表示將結果返回存放到快取中,key可以定義為#result.id,可以定義條件condition

@Override
@CachePut(value="ccc",key = "'eee_'+#result.id",condition="#result!=null")
public User eee(Integer id) {
   return userMapper.selectByPrimaryKey(id);
}

 

(2)Cacheable,表示先從快取中通過定義的鍵查詢,找到就直接返回,找不到執行該方法,並將結果寫入快取,所以key不能定義為#result,只能定義為#id之類的引數,可以定義條件condition

@Override
@Cacheable(value="redisCache",key="'bbb_'+#minId+'_'+#maxId")
public List<User> bbb(Integer minId, Integer maxId) {
    PageHelper.startPage(2,3,"Id asc,Name desc");
    List<User> list1 = userMapper.findByIdGreaterThanEqualAndIdLessThanEqual(minId,maxId);
    return list1;
}

(3)CacheEvict通過定義的鍵移除快取,allEntries刪除全部,也可以用key刪除指定

@Override
@CacheEvict(value="redisCache",allEntries = true)
public void delete(Integer id) {
    userMapper.deleteById(id);
}

那個value必須有值,但是好像沒用,不管寫啥都沒區別

6.使用二級快取很容易讀到髒資料,可以設定快取失效時間比如10分鐘,對於一些準確性要求不高的資料,10分鐘的延遲關係不大,但是對於更新,最好能直接從資料庫讀取資料,可以採用在實現類中用this.方法呼叫或直接自己寫,自呼叫是不會啟動事務和快取的,另外對於命中率低的資料和返回結果集大的資料也不建議採用快取

7.也可以自己完成redis的快取,這樣比較自由,例如可以設定不同的快取失效時間,我自己想的一個辦法,就是不管什麼資料,先轉成json,然後用redis的字串儲存儲存,stringRedisTemplate是spring自動生成的bean,直接注入就可以了,expire用來設定超時時間

@Override
public User ddd(Integer id)  {
   String key="User_id_"+id;
   String s=stringRedisTemplate.opsForValue().get(key);
   User user;
   if (s!=null){
       user=JSON.parseObject(s,User.class);
       stringRedisTemplate.expire(key,10,TimeUnit.MINUTES);
       return user;
   }
   else {
       user=userMapper.selectByPrimaryKey(id);
       s=JSON.toJSONString(user);
       stringRedisTemplate.opsForValue().set(key,s);
       stringRedisTemplate.expire(key,10,TimeUnit.MINUTES);
       return user;
   }
}