SpringBoot使用Redis緩存的實(shí)現(xiàn)方法
(1)pom.xml引入jar包,如下:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
(2)修改項(xiàng)目啟動(dòng)類(lèi),增加注解@EnableCaching,開(kāi)啟緩存功能,如下:
package springboot;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.scheduling.annotation.EnableScheduling;
@SpringBootApplication
@EnableScheduling
@EnableCaching
public class SpringbootApplication{
public static void main(String[] args) {
SpringApplication.run(SpringbootApplication.class, args);
}
}
?。?)application.properties中配置Redis連接信息,如下:
# Redis數(shù)據(jù)庫(kù)索引(默認(rèn)為0) spring.redis.database=0 # Redis服務(wù)器地址 spring.redis.host=172.31.19.222 # Redis服務(wù)器連接端口 spring.redis.port=6379 # Redis服務(wù)器連接密碼(默認(rèn)為空) spring.redis.password= # 連接池最大連接數(shù)(使用負(fù)值表示沒(méi)有限制) spring.redis.pool.max-active=8 # 連接池最大阻塞等待時(shí)間(使用負(fù)值表示沒(méi)有限制) spring.redis.pool.max-wait=-1 # 連接池中的最大空閑連接 spring.redis.pool.max-idle=8 # 連接池中的最小空閑連接 spring.redis.pool.min-idle=0 # 連接超時(shí)時(shí)間(毫秒) spring.redis.timeout=0
?。?)新建Redis緩存配置類(lèi)RedisConfig,如下:
package springboot.config;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cache.CacheManager;
import org.springframework.cache.annotation.CachingConfigurerSupport;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.cache.RedisCacheManager;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.ObjectMapper;
/**
* Redis緩存配置類(lèi)
* @author szekinwin
*
*/
@Configuration
@EnableCaching
public class RedisConfig extends CachingConfigurerSupport{
@Value("${spring.redis.host}")
private String host;
@Value("${spring.redis.port}")
private int port;
@Value("${spring.redis.timeout}")
private int timeout;
//自定義緩存key生成策略
// @Bean
// public KeyGenerator keyGenerator() {
// return new KeyGenerator(){
// @Override
// public Object generate(Object target, java.lang.reflect.Method method, Object... params) {
// StringBuffer sb = new StringBuffer();
// sb.append(target.getClass().getName());
// sb.append(method.getName());
// for(Object obj:params){
// sb.append(obj.toString());
// }
// return sb.toString();
// }
// };
// }
//緩存管理器
@Bean
public CacheManager cacheManager(@SuppressWarnings("rawtypes") RedisTemplate redisTemplate) {
RedisCacheManager cacheManager = new RedisCacheManager(redisTemplate);
//設(shè)置緩存過(guò)期時(shí)間
cacheManager.setDefaultExpiration(10000);
return cacheManager;
}
@Bean
public RedisTemplate<String, String> redisTemplate(RedisConnectionFactory factory){
StringRedisTemplate template = new StringRedisTemplate(factory);
setSerializer(template);//設(shè)置序列化工具
template.afterPropertiesSet();
return template;
}
private void setSerializer(StringRedisTemplate template){
@SuppressWarnings({ "rawtypes", "unchecked" })
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);
}
}
?。?)新建UserMapper,如下:
package springboot.dao;
import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update;
import org.springframework.cache.annotation.CacheConfig;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.CachePut;
import org.springframework.cache.annotation.Cacheable;
import springboot.domain.User;
@Mapper
@CacheConfig(cacheNames = "users")
public interface UserMapper {
@Insert("insert into user(name,age) values(#{name},#{age})")
int addUser(@Param("name")String name,@Param("age")String age);
@Select("select * from user where id =#{id}")
@Cacheable(key ="#p0")
User findById(@Param("id") String id);
@CachePut(key = "#p0")
@Update("update user set name=#{name} where id=#{id}")
void updataById(@Param("id")String id,@Param("name")String name);
//如果指定為 true,則方法調(diào)用后將立即清空所有緩存
@CacheEvict(key ="#p0",allEntries=true)
@Delete("delete from user where id=#{id}")
void deleteById(@Param("id")String id);
}
@Cacheable將查詢(xún)結(jié)果緩存到redis中,(key="#p0")指定傳入的第一個(gè)參數(shù)作為redis的key。
@CachePut,指定key,將更新的結(jié)果同步到redis中
@CacheEvict,指定key,刪除緩存數(shù)據(jù),allEntries=true,方法調(diào)用后將立即清除緩存
?。?)service層與controller層跟上一篇整合一樣,啟動(dòng)redis服務(wù)器,redis服務(wù)器的安裝與啟動(dòng)可以參考之前的博客,地址如下:
http://www.cnblogs.com/gdpuzxs/p/6623171.html
?。?)配置log4j日志信息,如下:
## LOG4J配置
log4j.rootCategory=DEBUG,stdout
## 控制臺(tái)輸出
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} %5p %c{1}:%L - %m%n
?。?)驗(yàn)證redis緩存
首先我們向user表總插入一條數(shù)據(jù),數(shù)據(jù)庫(kù)顯示如下:
現(xiàn)在,我們查詢(xún)一下user表中id=24的數(shù)據(jù),觀擦控制臺(tái)輸出的信息,如下:
通過(guò)控制臺(tái)輸出信息我們可以知道,這次執(zhí)行了數(shù)據(jù)庫(kù)查詢(xún),并開(kāi)啟了Redis緩存查詢(xún)結(jié)果。接下來(lái)我們?cè)俅尾樵?xún)user表中id=24的數(shù)據(jù),觀察控制臺(tái),如下:
通過(guò)控制臺(tái)輸出信息我們可以知道,這次并沒(méi)有執(zhí)行數(shù)據(jù)庫(kù)查詢(xún),而是從Redis緩存中查詢(xún),并返回查詢(xún)結(jié)果。我們查看redis中的信息,如下:
方法finduser方法使用了注解@Cacheable(key="#p0"),即將id作為redis中的key值。當(dāng)我們更新數(shù)據(jù)的時(shí)候,應(yīng)該使用@CachePut(key="#p0")進(jìn)行緩存數(shù)據(jù)的更新,否則將查詢(xún)到臟數(shù)據(jù)。
總結(jié)
以上所述是小編給大家介紹的SpringBoot使用Redis緩存的實(shí)現(xiàn)方法,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)歡迎給我留言,小編會(huì)及時(shí)回復(fù)大家的!
相關(guān)文章
淺談DetachedCriteria和Criteria的使用方法(必看)
下面小編就為大家?guī)?lái)一篇淺談DetachedCriteria和Criteria的使用方法(必看)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-05-05
dubbo服務(wù)注冊(cè)到nacos的過(guò)程剖析
這篇文章主要為大家介紹了dubbo服務(wù)注冊(cè)到nacos的過(guò)程剖析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職極限2022-02-02
java實(shí)現(xiàn)構(gòu)造無(wú)限層級(jí)樹(shù)形菜單
這篇文章主要介紹了java實(shí)現(xiàn)構(gòu)造無(wú)限層級(jí)樹(shù)形菜單,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-09-09
Spring Boot Shiro在Web應(yīng)用中的作用詳解
這篇文章主要為大家介紹了Spring Boot Shiro在Web應(yīng)用中的作用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-02-02
SpringBoot項(xiàng)目打jar包與war包的詳細(xì)步驟
SpringBoot和我們之前學(xué)習(xí)的web應(yīng)用程序不一樣,其本質(zhì)上是一個(gè) Java應(yīng)用程序,那么又如何部署呢?這篇文章主要給大家介紹了關(guān)于SpringBoot項(xiàng)目打jar包與war包的詳細(xì)步驟,需要的朋友可以參考下2023-02-02

