SpringBoot使用Redis缓存的实现方法
(1)pom.xml引入jar包,如下:
org.springframework.boot spring-boot-starter-data-redis
(2)修改项目启动类,增加注解@EnableCaching,开启缓存功能,如下:
packagespringboot;
importorg.springframework.boot.SpringApplication;
importorg.springframework.boot.autoconfigure.SpringBootApplication;
importorg.springframework.cache.annotation.EnableCaching;
importorg.springframework.scheduling.annotation.EnableScheduling;
@SpringBootApplication
@EnableScheduling
@EnableCaching
publicclassSpringbootApplication{
publicstaticvoidmain(String[]args){
SpringApplication.run(SpringbootApplication.class,args);
}
}
(3)application.properties中配置Redis连接信息,如下:
#Redis数据库索引(默认为0) spring.redis.database=0 #Redis服务器地址 spring.redis.host=172.31.19.222 #Redis服务器连接端口 spring.redis.port=6379 #Redis服务器连接密码(默认为空) spring.redis.password= #连接池最大连接数(使用负值表示没有限制) spring.redis.pool.max-active=8 #连接池最大阻塞等待时间(使用负值表示没有限制) spring.redis.pool.max-wait=-1 #连接池中的最大空闲连接 spring.redis.pool.max-idle=8 #连接池中的最小空闲连接 spring.redis.pool.min-idle=0 #连接超时时间(毫秒) spring.redis.timeout=0
(4)新建Redis缓存配置类RedisConfig,如下:
packagespringboot.config;
importorg.springframework.beans.factory.annotation.Value;
importorg.springframework.cache.CacheManager;
importorg.springframework.cache.annotation.CachingConfigurerSupport;
importorg.springframework.cache.annotation.EnableCaching;
importorg.springframework.context.annotation.Bean;
importorg.springframework.context.annotation.Configuration;
importorg.springframework.data.redis.cache.RedisCacheManager;
importorg.springframework.data.redis.connection.RedisConnectionFactory;
importorg.springframework.data.redis.core.RedisTemplate;
importorg.springframework.data.redis.core.StringRedisTemplate;
importorg.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
importcom.fasterxml.jackson.annotation.JsonAutoDetect;
importcom.fasterxml.jackson.annotation.PropertyAccessor;
importcom.fasterxml.jackson.databind.ObjectMapper;
/**
*Redis缓存配置类
*@authorszekinwin
*
*/
@Configuration
@EnableCaching
publicclassRedisConfigextendsCachingConfigurerSupport{
@Value("${spring.redis.host}")
privateStringhost;
@Value("${spring.redis.port}")
privateintport;
@Value("${spring.redis.timeout}")
privateinttimeout;
//自定义缓存key生成策略
//@Bean
//publicKeyGeneratorkeyGenerator(){
//returnnewKeyGenerator(){
//@Override
//publicObjectgenerate(Objecttarget,java.lang.reflect.Methodmethod,Object...params){
//StringBuffersb=newStringBuffer();
//sb.append(target.getClass().getName());
//sb.append(method.getName());
//for(Objectobj:params){
//sb.append(obj.toString());
//}
//returnsb.toString();
//}
//};
//}
//缓存管理器
@Bean
publicCacheManagercacheManager(@SuppressWarnings("rawtypes")RedisTemplateredisTemplate){
RedisCacheManagercacheManager=newRedisCacheManager(redisTemplate);
//设置缓存过期时间
cacheManager.setDefaultExpiration(10000);
returncacheManager;
}
@Bean
publicRedisTemplateredisTemplate(RedisConnectionFactoryfactory){
StringRedisTemplatetemplate=newStringRedisTemplate(factory);
setSerializer(template);//设置序列化工具
template.afterPropertiesSet();
returntemplate;
}
privatevoidsetSerializer(StringRedisTemplatetemplate){
@SuppressWarnings({"rawtypes","unchecked"})
Jackson2JsonRedisSerializerjackson2JsonRedisSerializer=newJackson2JsonRedisSerializer(Object.class);
ObjectMapperom=newObjectMapper();
om.setVisibility(PropertyAccessor.ALL,JsonAutoDetect.Visibility.ANY);
om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
jackson2JsonRedisSerializer.setObjectMapper(om);
template.setValueSerializer(jackson2JsonRedisSerializer);
}
}
(5)新建UserMapper,如下:
packagespringboot.dao;
importorg.apache.ibatis.annotations.Delete;
importorg.apache.ibatis.annotations.Insert;
importorg.apache.ibatis.annotations.Mapper;
importorg.apache.ibatis.annotations.Param;
importorg.apache.ibatis.annotations.Select;
importorg.apache.ibatis.annotations.Update;
importorg.springframework.cache.annotation.CacheConfig;
importorg.springframework.cache.annotation.CacheEvict;
importorg.springframework.cache.annotation.CachePut;
importorg.springframework.cache.annotation.Cacheable;
importspringboot.domain.User;
@Mapper
@CacheConfig(cacheNames="users")
publicinterfaceUserMapper{
@Insert("insertintouser(name,age)values(#{name},#{age})")
intaddUser(@Param("name")Stringname,@Param("age")Stringage);
@Select("select*fromuserwhereid=#{id}")
@Cacheable(key="#p0")
UserfindById(@Param("id")Stringid);
@CachePut(key="#p0")
@Update("updateusersetname=#{name}whereid=#{id}")
voidupdataById(@Param("id")Stringid,@Param("name")Stringname);
//如果指定为true,则方法调用后将立即清空所有缓存
@CacheEvict(key="#p0",allEntries=true)
@Delete("deletefromuserwhereid=#{id}")
voiddeleteById(@Param("id")Stringid);
}
@Cacheable将查询结果缓存到redis中,(key="#p0")指定传入的第一个参数作为redis的key。
@CachePut,指定key,将更新的结果同步到redis中
@CacheEvict,指定key,删除缓存数据,allEntries=true,方法调用后将立即清除缓存
(6)service层与controller层跟上一篇整合一样,启动redis服务器,redis服务器的安装与启动可以参考之前的博客,地址如下:
http://www.cnblogs.com/gdpuzxs/p/6623171.html
(7)配置log4j日志信息,如下:
##LOG4J配置
log4j.rootCategory=DEBUG,stdout
##控制台输出
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-ddHH:mm:ss,SSS}%5p%c{1}:%L-%m%n
(8)验证redis缓存
首先我们向user表总插入一条数据,数据库显示如下:
现在,我们查询一下user表中id=24的数据,观擦控制台输出的信息,如下:
通过控制台输出信息我们可以知道,这次执行了数据库查询,并开启了Redis缓存查询结果。接下来我们再次查询user表中id=24的数据,观察控制台,如下:
通过控制台输出信息我们可以知道,这次并没有执行数据库查询,而是从Redis缓存中查询,并返回查询结果。我们查看redis中的信息,如下:
方法finduser方法使用了注解@Cacheable(key="#p0"),即将id作为redis中的key值。当我们更新数据的时候,应该使用@CachePut(key="#p0")进行缓存数据的更新,否则将查询到脏数据。
总结
以上所述是小编给大家介绍的SpringBoot使用Redis缓存的实现方法,希望对大家有所帮助,如果大家有任何疑问欢迎给我留言,小编会及时回复大家的!
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。