免費(fèi)微信網(wǎng)站開發(fā)seo網(wǎng)絡(luò)推廣外包公司
背景
?????? 現(xiàn)實(shí)中,本地環(huán)境(dev)和開發(fā)環(huán)境(feature)會共同使用相同的中間件(本篇拿Redis舉例),對于不同環(huán)境中的,圖片、視頻、語音等資源類型的預(yù)覽地址url,需要配置不同的ip和port地址;如何優(yōu)美的解決它?
解決方案
- 使用配置,不同環(huán)境配置不同的 數(shù)據(jù)庫索引:database: 0-15;但隨之引起的問題就是,如果Redis是集群怎么辦?Redis 集群不像單機(jī)版本的 Redis 那樣支持多個(gè)數(shù)據(jù)庫,集群只有數(shù)據(jù)庫 0,而且也不支持 SELECT 命令。
- 對于資源型url數(shù)據(jù),使用相對路徑,到門戶層,或者前端自己拼接;這種深入業(yè)務(wù)的使用方式,需要很多程序員的協(xié)作,并且花費(fèi)很多溝通、文檔、測試時(shí)間,最不可取;話分兩頭:如果是大型項(xiàng)目,并且無法保證公網(wǎng)ip或域名唯一的項(xiàng)目,也只能通過業(yè)務(wù)方式解決;
- 使用@Cacheable 的keyGenerator 屬性;不同環(huán)境生成不同的緩存key, 從而保證不同公網(wǎng)訪問的數(shù)據(jù)中 圖片、視頻等預(yù)覽地址不同;這樣順便解決不同公網(wǎng)的跨域問題;
keyGenerator 使用
項(xiàng)目中添加下方類CacheKeyGenerator:
import java.lang.reflect.Method;import org.springframework.beans.factory.annotation.Value;
import org.springframework.cache.interceptor.KeyGenerator;
import org.springframework.stereotype.Component;import lombok.extern.slf4j.Slf4j;@Component
@Slf4j
public class CacheKeyGenerator implements KeyGenerator {@Value("${spring.profiles.active}")private String profilesActive;@Overridepublic Object generate(Object target, Method method, Object... params) {Long id = (Long) params[0];String cacheKey = new StringBuilder(profilesActive).append("_").append(id).toString();log.info("[cacheKeyGenerate],cacheKey={}", cacheKey);return cacheKey;}}
在需要緩存的Service方法上添加@Cacheable注解:
@Cacheable(cacheNames = CacheNames.DETAIL, keyGenerator = "cacheKeyGenerator")
public XXXXVo queryById(Long id){XXXX;return vo;
}
//請?jiān)彶荒苜N源碼出來;
redis下存儲最終效果: