學而時習之,不亦說乎。今天總結一下Springboot集成Redis實現緩存功能。Redis這個NoSQL數據庫應用最廣泛的場景就是做緩存,分佈式系統有很多位置需要緩存,比如共享session,讀取業務數據緩存,分佈式鎖等。由於springboot已經對redis的操作深度封裝,今天主要總結一下共享session和業務數據的緩存。
先說共享session,分佈式系統共享session主要有三種方式,一種是session複製,一種是IP hash,一種是存儲共享,session複製需要配置tomcat,很簡單,網上教程大把的;IP hash只需設置nginx,也不講了,只講存儲共享,原因是相比於前兩種方法,它實時共享,可靠性高,擴展性好。實現起來需要三步:
1.導包
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.session</groupId>
<artifactId>spring-session-data-redis</artifactId>
</dependency>
2.配置
# Redis服務器地址
spring.redis.host=localhost
# Redis服務器連接端口
spring.redis.port=6379
# Redis服務器連接密碼(默認爲空)
spring.redis.password=
3.引用
springboot實現session共享非常的方便,只需要一個@EnableRedisHttpSession註解即可。把該註解加在springboot啓動類的上面。
session共享就實現了,你可以隨便寫個請求,從httprequest中操作session,此處就略了。
再說說業務數據緩存,用Redis緩存業務數據也有兩種方法,一種是用RedisTemplate直接操作需要緩存的業務數據,用@Autowired注入RedisTemplate來操作redis,好處是可控,自由度大,缺點是囉嗦,代碼量大;另一種是用註解操作,一般要先寫個配置類
/**
* @author hulonghai
* redis配置類
*/
@Configuration
@EnableCaching
public class CacheConfig extends CachingConfigurerSupport{
@SuppressWarnings("rawtypes")
@Bean
public CacheManager cacheManager(RedisTemplate redisTemplate) {
RedisCacheManager rcm = new RedisCacheManager(redisTemplate);
//設置緩存過期時間(秒)
rcm.setDefaultExpiration(600);
return rcm;
}
@Bean
public RedisTemplate<String, String> redisTemplate(RedisConnectionFactory factory) {
StringRedisTemplate template = new StringRedisTemplate(factory);
Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
ObjectMapper om = new ObjectMapper();
om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
jackson2JsonRedisSerializer.setObjectMapper(om);
template.setValueSerializer(jackson2JsonRedisSerializer);
template.afterPropertiesSet();
return template;
}
}
對於配置類,一定要加上@EnableCaching,如果你只想使用默認配置,可以把它打在啓動類上,不寫配置類,但是這樣一般無法滿足實際業務需求,因爲有些設置是必要的,比如緩存的過期時間,cacheManager方法配置了緩存過期時間,還有很多其他配置可以根據你的實際業務進行增加。
接下來就要在操作業務上通過增加註解來實現緩存了,註解常用的有三種:
@Cacheable:用於查詢和新增
可選屬性:
cacheNames/value:指定緩存組件的名字;
key:緩存數據使用的key,可以用來指定。默認即使用方法參數的值
@Cacheable(value="user", key="'users_'+#id")
public User findUser(Integer id) {
User user = new User();
user.setUsername("hlhdidi");
user.setPassword("123");
user.setUid(id.longValue());
System.out.println("log4j2壞啦?");
logger.info("輸入user,用戶名:{},密碼:{}",user.getUsername(),user.getPassword());
return user;
}
@CachePut:用於更新
既調用方法,又更新緩存數據,可達到同步更新緩存;
修改了數據庫的某個數據,同時更新緩存
運行時機:
1、先調用運行方法;
2、將目標方法的結果緩存起來
value:緩存名 key:緩存的key其中#result表示方法返回的結果(確保更新的key和查詢一致即可做到同時更新數據庫數據和緩存中的數據)
@CachePut(value="user",key = "#result.id")
public User updateUser(User user){
System.out.println("updateUser:"+user);
userMapper.updateUser(user);
return user;
}
@CacheEvict:用於刪除
緩存清除:目的是爲了刪除一個數據並刪掉緩存
key:指定要清除的數據(對應上key可實現目的即同時做到刪除數據庫和緩存中的數據)
allEntries =true:指定清楚這個緩存中所有的數據
beforeInvocation = false:緩存的清楚是否在方法之前執行,默認代表是在方法之後執行
@CacheEvict(value = "user",key = "#id")
public void deleteUser(Integer id){
System.out.println("deleteUser:"+id);
userMapper.deleteUserById(id);
}
這樣就可以實現在增刪改查數據時對業務數據的緩存功能了,代碼非常簡潔。
Redis的用途還有很多,比如可以發佈訂閱消息、做隊列、set還可以做一些去重工作比如冪等訪問、zset做排行榜等等,以後會繼續總結Redis的各種玩法。