摘要:至此,已完成整合獨(dú)立模塊做緩存詳情請(qǐng)看地址相關(guān)文章系列整合獨(dú)立模塊
項(xiàng)目github地址:https://github.com/5-Ason/aso...
具體可看 ./db/db-redis 和 ./db/db-cache 兩個(gè)模塊
// TODO 在整合redis之前需要先本地配置好redis環(huán)境,遲點(diǎn)有時(shí)間補(bǔ)一下linux下下載安裝配置redis
本文主要實(shí)現(xiàn)的是對(duì)數(shù)據(jù)操作進(jìn)行獨(dú)立模塊得整合,詳情請(qǐng)看我的另一篇博文:
【技術(shù)雜談】springcloud微服務(wù)之?dāng)?shù)據(jù)操作獨(dú)立模塊化
獨(dú)立部署Redis非關(guān)系型數(shù)據(jù)庫(kù)作為內(nèi)存緩存模塊,實(shí)現(xiàn)SpringBoot項(xiàng)目中依賴緩存模塊進(jìn)行緩存操作,并進(jìn)行簡(jiǎn)單測(cè)試。
2、添加依賴3、配置屬性org.springframework.boot spring-boot-starter-data-redis org.springframework.boot spring-boot-starter-cache
因?yàn)槲业捻?xiàng)目使用的是springcloud分布式配置
所以配置文件在 ./config-server/config-repo/data-dev.yml,具體配置如下:
# ====================redis==================== redis: # Redis服務(wù)器地址 host: ason-hostname # Redis服務(wù)器連接端口 port: 6379 # Redis服務(wù)器連接密碼(默認(rèn)為空) password: # 連接超時(shí)時(shí)間(毫秒) timeout: 0 # Redis數(shù)據(jù)庫(kù)索引(默認(rèn)為0) database: 0 pool: # 連接池最大連接數(shù)(使用負(fù)值表示沒(méi)有限制) max-active: 8 # 連接池最大阻塞等待時(shí)間(使用負(fù)值表示沒(méi)有限制) max-wait: -1 # 連接池中的最大空閑連接 max-idle: 8 # 連接池中的最小空閑連接 min-idle: 04、RedisConf配置
package com.ason; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.data.redis.connection.RedisConnectionFactory; import org.springframework.data.redis.connection.jedis.JedisConnectionFactory; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.serializer.StringRedisSerializer; import redis.clients.jedis.JedisPoolConfig; /** * Created by Ason on 2017-09-23. */ @Configuration public class RedisConf { private static final Log log = LogFactory.getLog(RedisConf.class); @Value("${redis.host}") private String host; // Redis服務(wù)器地址 @Value("${redis.port}") private int port; // Redis服務(wù)器連接端口 @Value("${redis.password}") private String password; // Redis服務(wù)器連接密碼(默認(rèn)為空) @Value("${redis.timeout}") private int timeout; // 連接超時(shí)時(shí)間(毫秒) @Value("${redis.database}") private int database; // 連接超時(shí)時(shí)間(毫秒) @Value("${redis.pool.max-active}") private int maxTotal; // 連接池最大連接數(shù)(使用負(fù)值表示沒(méi)有限制) @Value("${redis.pool.max-wait}") private int maxWaitMillis; // 連接池最大阻塞等待時(shí)間(使用負(fù)值表示沒(méi)有限制) @Value("${redis.pool.max-idle}") private int maxIdle; // 連接池中的最大空閑連接 @Value("${redis.pool.min-idle}") private int minIdle; // 連接池中的最小空閑連接 /** * 配置JedisPoolConfig * @return JedisPoolConfig實(shí)體 */ @Bean(name = "jedisPoolConfig") public JedisPoolConfig jedisPoolConfig() { log.info("初始化JedisPoolConfig"); JedisPoolConfig jedisPoolConfig = new JedisPoolConfig(); jedisPoolConfig.setMaxTotal(this.maxTotal); // 連接池最大連接數(shù)(使用負(fù)值表示沒(méi)有限制) jedisPoolConfig.setMaxWaitMillis(this.maxWaitMillis); // 連接池最大阻塞等待時(shí)間(使用負(fù)值表示沒(méi)有限制) jedisPoolConfig.setMaxIdle(this.maxIdle); // 連接池中的最大空閑連接 jedisPoolConfig.setMinIdle(this.minIdle); // 連接池中的最小空閑連接 // jedisPoolConfig.setTestOnBorrow(true); // jedisPoolConfig.setTestOnCreate(true); // jedisPoolConfig.setTestWhileIdle(true); return jedisPoolConfig; } /** * 實(shí)例化 RedisConnectionFactory 對(duì)象 * @param poolConfig * @return */ @Bean(name = "jedisConnectionFactory") public RedisConnectionFactory jedisConnectionFactory(@Qualifier(value = "jedisPoolConfig") JedisPoolConfig poolConfig) { log.info("初始化RedisConnectionFactory"); JedisConnectionFactory jedisConnectionFactory = new JedisConnectionFactory(poolConfig); jedisConnectionFactory.setHostName(this.host); jedisConnectionFactory.setPort(this.port); jedisConnectionFactory.setDatabase(this.database); return jedisConnectionFactory; } /** * 實(shí)例化 RedisTemplate 對(duì)象 * @return */ @Bean(name = "redisTemplate") public RedisTemplateRedisConf中涉及到的序列化相關(guān)的類 EntityRedisSerializerfunctionDomainRedisTemplate(@Qualifier(value = "jedisConnectionFactory") RedisConnectionFactory factory) { log.info("初始化RedisTemplate"); RedisTemplate redisTemplate = new RedisTemplate<>(); redisTemplate.setConnectionFactory(factory); redisTemplate.setKeySerializer(new StringRedisSerializer()); redisTemplate.setHashKeySerializer(new StringRedisSerializer()); redisTemplate.setHashValueSerializer(new EntityRedisSerializer()); redisTemplate.setValueSerializer(new EntityRedisSerializer()); redisTemplate.afterPropertiesSet(); redisTemplate.setEnableTransactionSupport(true); return redisTemplate; } }
package com.ason; import org.springframework.data.redis.serializer.RedisSerializer; import org.springframework.data.redis.serializer.SerializationException; /** * 自定義Redis序列化 * Created by Ason on 2017-09-23. */ public class EntityRedisSerializer implements RedisSerializerSerializeUtil
package com.ason; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; /** * 定義序列化 * Created by Ason on 2017-09-23. */ public class SerializeUtil { public static byte[] serialize(Object object) { ObjectOutputStream oos = null; ByteArrayOutputStream baos = null; try { // 序列化 baos = new ByteArrayOutputStream(); oos = new ObjectOutputStream(baos); oos.writeObject(object); byte[] bytes = baos.toByteArray(); return bytes; } catch (Exception e) { e.printStackTrace(); } return null; } public static Object unserialize(byte[] bytes) { ByteArrayInputStream bais = null; try { // 反序列化 bais = new ByteArrayInputStream(bytes); ObjectInputStream ois = new ObjectInputStream(bais); return ois.readObject(); } catch (Exception e) { e.printStackTrace(); } return null; } }5、RedisCacheConf配置
package com.ason; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.cache.CacheManager; import org.springframework.cache.annotation.CachingConfigurerSupport; import org.springframework.cache.annotation.EnableCaching; import org.springframework.cache.interceptor.KeyGenerator; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.data.redis.cache.RedisCacheManager; import org.springframework.data.redis.core.RedisTemplate; import java.lang.reflect.Method; /** * Created by Ason on 2017/9/25. * 這里實(shí)現(xiàn)CachingConfigurerSupport主要是方便使用自定義keyGenerator */ @Configuration @EnableCaching // 啟用緩存 public class RedisCacheConf extends CachingConfigurerSupport { @Autowired private RedisTemplate redisTemplate; private static final Log log = LogFactory.getLog(RedisConf.class); /** * 配置redis緩存管理對(duì)象 * @return */ @Bean(name = "cacheManager") public CacheManager cacheManager() { log.info("初始化CacheManager"); RedisCacheManager cacheManager = new RedisCacheManager(redisTemplate); // Map6、具體使用expires = new HashMap<>(); // expires.put("cache:user", 36000L); // cacheManager.setExpires(expires); //設(shè)置緩存過(guò)期時(shí)間 //cacheManager.setDefaultExpiration(10000); return cacheManager; } /** * 生成key的策略 * 此方法將會(huì)根據(jù)類名+方法名+所有參數(shù)的值生成唯一的一個(gè)key,即使@Cacheable中的value屬性一樣,key也會(huì)不一樣。 * @return */ @Bean public KeyGenerator keyGenerator() { return new KeyGenerator() { @Override public Object generate(Object target, Method method, Object... params) { StringBuilder sb = new StringBuilder(); sb.append(target.getClass().getName()); sb.append(method.getName()); for (Object obj : params) { sb.append(obj.toString()); } return sb.toString(); } }; } }
因?yàn)槭菍edis的配置多帶帶作為一個(gè)模塊db-redis,CacheManager的配置模塊db-cache依賴db-redis:
com.ason db-redis 0.0.1-SNAPSHOT
所以我的rms-service微服務(wù)想進(jìn)行緩存的操作,需依賴db-cache模塊:
com.ason db-cache 0.0.1-SNAPSHOT
同時(shí),還需要讀取redis配置的屬性,上面我的配置是放在 ./config-server/config-repo/data-dev.yml 下,所以在rms-service微服務(wù)下的 bootstrap.yml 配置文件中,需要指定配置中心服務(wù)的地址以及配置文件的name和profile:
spring: # 配置中心服務(wù)的地址 cloud: config: name: data profile: ${spring.profiles.active} # 要讀取的配置文件profile屬性 # uri: http://127.0.0.1:7001 #label: ${spring.profiles.active} discovery: enabled: true # 默認(rèn)false,設(shè)為true表示使用注冊(cè)中心中的configserver配置而不自己配置configserver的uri serviceId: config-server profiles: active: dev
接下來(lái),即可使用緩存相關(guān)的注解在 rms-service 微服務(wù)下使用緩存,在 RmsUserController(僅為測(cè)試,實(shí)際開發(fā)中根據(jù)需求做調(diào)整) 添加:
/** * 查詢單個(gè)用戶 */ @Cacheable(value = "usercache", key = "#account") @PostMapping(value = "/account", produces = "application/json;charset=UTF-8") public String findUserByAccout(@RequestParam("account") String account) throws Exception { return ResultBody.success(rmsUserService.selectUserByAccout(account)); }
啟動(dòng)項(xiàng)目,post請(qǐng)求訪問(wèn) http://localhost:8888/rms/use...
接下來(lái),再去redis看一下,發(fā)現(xiàn)[email protected]已作為key保存起來(lái)了:
7、注意事項(xiàng)有些情形下注解式緩存會(huì)不起作用的(本人第一次整合測(cè)試遇到的坑):
同一個(gè)bean內(nèi)部方法調(diào)用、子類調(diào)用父類中有緩存注解的方法等。
至此,已完成 springboot 整合獨(dú)立模塊 redis 做緩存
詳情請(qǐng)看github地址:https://github.com/5-Ason/aso...
相關(guān)文章:
【springboot系列】springboot整合獨(dú)立模塊Druid + mybatis-plus
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/70620.html
摘要:至此,已完成整合獨(dú)立模塊做緩存詳情請(qǐng)看地址相關(guān)文章系列整合獨(dú)立模塊 項(xiàng)目github地址:https://github.com/5-Ason/aso...具體可看 ./db/db-redis 和 ./db/db-cache 兩個(gè)模塊 // TODO 在整合redis之前需要先本地配置好redis環(huán)境,遲點(diǎn)有時(shí)間補(bǔ)一下linux下下載安裝配置redis 本文主要實(shí)現(xiàn)的是對(duì)數(shù)據(jù)操作進(jìn)行獨(dú)立...
摘要:而在這個(gè)微服務(wù)下,同樣需要進(jìn)行數(shù)據(jù)操作,我不可能還要在下再一次進(jìn)行集成,這樣大大的增加了代碼量。其次,是將有關(guān)數(shù)據(jù)操作的都單獨(dú)部署成一個(gè)模塊,比如我集成的模塊,集成的模塊,使用作為內(nèi)存緩存模塊。 前言 相對(duì)于 spring 對(duì) mybatis 以及 redis 等的整合所需要的各種配置文件,在 springboot 下,已經(jīng)大大的簡(jiǎn)化了,你可能只是需要增加個(gè)依賴,加個(gè)注解,然后在配置文...
摘要:申請(qǐng)連接時(shí)執(zhí)行檢測(cè)連接是否有效,做了這個(gè)配置會(huì)降低性能。作者在版本中使用,通過(guò)監(jiān)控界面發(fā)現(xiàn)有緩存命中率記錄,該應(yīng)該是支持。允許和不允許單條語(yǔ)句返回多個(gè)數(shù)據(jù)集取決于驅(qū)動(dòng)需求使用列標(biāo)簽代替列名稱。需要驅(qū)動(dòng)器支持。將自動(dòng)映射所有復(fù)雜的結(jié)果。 項(xiàng)目github地址:https://github.com/5-Ason/aso... 具體可看 ./db/db-mysql 模塊 本文主要實(shí)現(xiàn)的是對(duì)...
閱讀 4186·2021-11-22 13:52
閱讀 2094·2021-09-22 15:12
閱讀 1133·2019-08-30 15:53
閱讀 3467·2019-08-29 17:12
閱讀 2198·2019-08-29 16:23
閱讀 1662·2019-08-26 13:56
閱讀 1778·2019-08-26 13:44
閱讀 1897·2019-08-26 11:56