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;
}
}