詳解Spring boot使用Redis集群替換mybatis二級緩存
1 . pom.xml添加相關(guān)依賴
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.1.RELEASE</version> </parent> <!-- 依賴 --> <dependencies> <!-- mybatis --> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>1.2.0</version> </dependency> <!-- redis相關(guān) --> <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> </dependency> <dependency> <groupId>org.springframework.data</groupId> <artifactId>spring-data-redis</artifactId> </dependency> <dependencies>
2 . 配置Redis集群,參考spring-data-redis官方文檔
@Component @ConfigurationProperties(prefix = "spring.redis.cluster") public class ClusterConfigurationProperties { /* * spring.redis.cluster.nodes[0] = 127.0.0.1:7379 * spring.redis.cluster.nodes[1] = 127.0.0.1:7380 * ... */ List<String> nodes; /** * Get initial collection of known cluster nodes in format {@code host:port}. * * @return */ public List<String> getNodes() { return nodes; } public void setNodes(List<String> nodes) { this.nodes = nodes; } } @Configuration public class AppConfig { /** * Type safe representation of application.properties */ @Autowired ClusterConfigurationProperties clusterProperties; public @Bean RedisConnectionFactory connectionFactory() { return new JedisConnectionFactory( new RedisClusterConfiguration(clusterProperties.getNodes())); } }
3 . 自定義二級緩存類
public class RedisCache implements Cache { private static final String PREFIX = "SYS_CONFIG:"; private final ReadWriteLock readWriteLock = new ReentrantReadWriteLock(true); private String id; private JdkSerializationRedisSerializer jdkSerializer = new JdkSerializationRedisSerializer(); private static RedisConnectionFactory redisConnectionFactory; public RedisCache(final String id) { if (id == null) { throw new IllegalArgumentException("Cache instances require an ID"); } this.id = id; } @Override public String getId() { return this.id; } @Override public void putObject(Object key, Object value) { RedisClusterConnection conn = redisConnectionFactory .getClusterConnection(); if (key == null) return; String strKey = PREFIX + key.toString(); conn.set(strKey.getBytes(), jdkSerializer.serialize(value)); conn.close(); } @Override public Object getObject(Object key) { if (key != null) { String strKey = PREFIX + key.toString(); RedisClusterConnection conn = redisConnectionFactory .getClusterConnection(); byte[] bs = conn.get(strKey.getBytes()); conn.close(); return jdkSerializer.deserialize(bs); } return null; } @Override public Object removeObject(Object key) { if (key != null) { RedisClusterConnection conn = redisConnectionFactory .getClusterConnection(); conn.del(key.toString().getBytes()); conn.close(); } return null; } @Override public void clear() { // 關(guān)鍵代碼,data更新時清理緩存 RedisClusterConnection conn = redisConnectionFactory .getClusterConnection(); Set<byte[]> keys = conn.keys((PREFIX+"*").getBytes()); for (byte[] bs : keys) { conn.del(bs); } conn.close(); } @Override public int getSize() { // TODO Auto-generated method stub return 0; } @Override public ReadWriteLock getReadWriteLock() { return this.readWriteLock; } public static void setRedisConnectionFactory(RedisConnectionFactory redisConnectionFactory) { RedisCache.redisConnectionFactory = redisConnectionFactory; } }
使用一個Transfer類間接注入RedisConnectionFactory
@Component public class RedisCacheTransfer { @Autowired public void setJedisConnectionFactory( RedisConnectionFactory jedisConnectionFactory) { RedisCache.setRedisConnectionFactory(jedisConnectionFactory); } }
4 . 在application.propreties中開啟二級緩存
開啟mybatis的二級緩存
spring.datasource.cachePrepStmts=true
5 . 基于注解的使用
@CacheNamespace(implementation = RedisCache.class) public interface ConfigDaoMapper { ..... }
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Spring Cloud @RefreshScope 原理及使用
這篇文章主要介紹了Spring Cloud @RefreshScope 原理及使用,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-01-01springboot websocket集群(stomp協(xié)議)連接時候傳遞參數(shù)
這篇文章主要介紹了springboot websocket集群(stomp協(xié)議)連接時候傳遞參數(shù),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-07-07實(shí)例詳解Spring Boot實(shí)戰(zhàn)之Redis緩存登錄驗證碼
本章簡單介紹redis的配置及使用方法,本文示例代碼在前面代碼的基礎(chǔ)上進(jìn)行修改添加,實(shí)現(xiàn)了使用redis進(jìn)行緩存驗證碼,以及校驗驗證碼的過程。感興趣的的朋友一起看看吧2017-08-08Springboot如何使用logback實(shí)現(xiàn)多環(huán)境配置?
上一篇文章中老顧介紹了logback基本配置,了解了日志配置的基本方式.我們平時在系統(tǒng)開發(fā)時,開發(fā)環(huán)境與生產(chǎn)環(huán)境的日志配置會不一樣;那今天老顧就跟大家介紹一下如何實(shí)現(xiàn)多環(huán)境配置,需要的朋友可以參考下2021-06-06基于Java編寫一個實(shí)用的ExcelUtil工具類
在項目中經(jīng)常遇到excel表格導(dǎo)入導(dǎo)出功能,每次都要重復(fù)寫有關(guān)excel 的邏輯,所以本文直接使用Java編寫一個實(shí)用的ExcelUtil工具類,希望對大家有所幫助2024-04-04Spring MVC前后端的數(shù)據(jù)傳輸?shù)膶?shí)現(xiàn)方法
這篇文章主要介紹了Spring MVC前后端的數(shù)據(jù)傳輸?shù)膶?shí)現(xiàn)方法,需要的朋友可以參考下2017-10-10如何實(shí)現(xiàn)Spring?Event(異步事件)
這篇文章主要介紹了如何實(shí)現(xiàn)Spring?Event(異步事件)問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-02-02詳解Mybatis逆向工程中使用Mysql8.0版本驅(qū)動遇到的問題
今天在使用 8.0.12 版的 mysql 驅(qū)動時遇到了各種各樣的坑。這篇文章主要介紹了詳解Mybatis逆向工程中使用Mysql8.0版本驅(qū)動遇到的問題,感興趣的小伙伴們可以參考一下2018-10-10