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(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。