SpringBoot集成Redis开启缓存机制的方法
本文小编为大家详细介绍“SpringBoot集成Redis开启缓存机制的方法”,内容详细,步骤清晰,细节处理妥当,希望这篇“SpringBoot集成Redis开启缓存机制的方法”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。
集成springboot+redis+mybatis plus的一个小demo
pom文件
4.0.0com.wlientspringboot_mq_redis0.0.1-SNAPSHOTspringboot_mq_redisDemoprojectforSpringBoot1.8UTF-8UTF-82.3.7.RELEASEorg.springframework.bootspring-boot-starter-amqporg.springframework.bootspring-boot-starter-data-redisorg.springframework.bootspring-boot-starter-webcom.baomidoumybatis-plus-boot-starter3.4.2org.springframework.bootspring-boot-devtoolsruntimetruemysqlmysql-connector-javaruntimeorg.projectlomboklomboktrueorg.springframework.bootspring-boot-starter-testtestorg.junit.vintagejunit-vintage-enginejunitjunittestorg.springframework.amqpspring-rabbit-testtestorg.aspectjaspectjweaver1.9.6redis.clientsjedis3.2.0com.github.xiaoyminknife4j-spring-boot-starter2.0.7com.alibabafastjson1.2.76org.springframework.bootspring-boot-dependencies${spring-boot.version}pomimportorg.apache.maven.pluginsmaven-compiler-plugin3.8.11.81.8UTF-8org.springframework.bootspring-boot-maven-plugin2.3.7.RELEASEcom.wlient.springboot_mq_redis.SpringbootMqRedisApplicationrepackagerepackage
yaml文件
spring:redis:host:1.117.89.11port:6378password:Terry123456.timeout:60sdatabase:2lettuce:pool:#连接池中的最小空闲连接min-idle:0#连接池中的最大空闲连接max-idle:8#连接池的最大数据库连接数max-active:8##连接池最大阻塞等待时间(使用负值表示没有限制)max-wait:-1ms#springcache配置cache:type:redisredis:#key过期时间半小时time-to-live:1800000#毫秒
CacheConfig
@ConfigurationpublicclassCacheConfig{@BeanCacheManagercacheManager(RedisConnectionFactoryconnectionFactory){RedisCacheConfigurationdefaultCacheConfig=RedisCacheConfiguration.defaultCacheConfig();//common信息缓存配置RedisCacheConfigurationuserCacheConfiguration=defaultCacheConfig//设置key为string序列化.serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(newStringRedisSerializer()))//设置value为json序列化.serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(newGenericJackson2JsonRedisSerializer())).disableCachingNullValues();MapredisCacheConfigurationMap=newHashMap<>();//entryTtl设置缓存失效时间,单位是秒redisCacheConfigurationMap.put("common",userCacheConfiguration.entryTtl(Duration.ofSeconds(30)));//设置CacheManager的值序列化方式为JdkSerializationRedisSerializer,但其实RedisCacheConfiguration默认就是使用StringRedisSerializer序列化key,JdkSerializationRedisSerializer序列化value,所以以下注释代码为默认实现//ClassLoaderloader=this.getClass().getClassLoader();//JdkSerializationRedisSerializerjdkSerializer=newJdkSerializationRedisSerializer(loader);//RedisSerializationContext.SerializationPair
RedisConfig
packagecom.wlient.springboot_mq_redis.Configuar;importcom.fasterxml.jackson.annotation.JsonAutoDetect;importcom.fasterxml.jackson.annotation.PropertyAccessor;importcom.fasterxml.jackson.databind.ObjectMapper;importorg.springframework.context.annotation.Bean;importorg.springframework.context.annotation.Configuration;importorg.springframework.data.redis.connection.RedisConnectionFactory;importorg.springframework.data.redis.core.RedisTemplate;importorg.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;importorg.springframework.data.redis.serializer.StringRedisSerializer;@ConfigurationpublicclassRedisConfig{@Bean@SuppressWarnings("all")publicRedisTemplateredisTemplate(RedisConnectionFactoryfactory){RedisTemplatetemplate=newRedisTemplate();template.setConnectionFactory(factory);Jackson2JsonRedisSerializerjackson2JsonRedisSerializer=newJackson2JsonRedisSerializer(Object.class);ObjectMapperom=newObjectMapper();om.setVisibility(PropertyAccessor.ALL,JsonAutoDetect.Visibility.ANY);om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);jackson2JsonRedisSerializer.setObjectMapper(om);StringRedisSerializerstringRedisSerializer=newStringRedisSerializer();//key采用String的序列化方式template.setKeySerializer(stringRedisSerializer);//hash的key也采用String的序列化方式template.setHashKeySerializer(stringRedisSerializer);//value序列化方式采用jacksontemplate.setValueSerializer(jackson2JsonRedisSerializer);//hash的value序列化方式采用jacksontemplate.setHashValueSerializer(jackson2JsonRedisSerializer);template.afterPropertiesSet();returntemplate;}}
SpringCacheConfig
packagecom.wlient.springboot_mq_redis.Configuar;importorg.springframework.boot.autoconfigure.cache.CacheProperties;importorg.springframework.boot.context.properties.EnableConfigurationProperties;importorg.springframework.cache.annotation.EnableCaching;importorg.springframework.context.annotation.Bean;importorg.springframework.context.annotation.Configuration;importorg.springframework.data.redis.cache.RedisCacheConfiguration;importorg.springframework.data.redis.serializer.RedisSerializationContext;importorg.springframework.data.redis.serializer.RedisSerializer;/***springcache配置*/@EnableConfigurationProperties(CacheProperties.class)@Configuration@EnableCachingpublicclassSpringCacheConfig{@BeanpublicRedisCacheConfigurationredisCacheConfiguration(CachePropertiescacheProperties){RedisCacheConfigurationconfig=RedisCacheConfiguration.defaultCacheConfig().serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(RedisSerializer.string())).serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(RedisSerializer.json()));CacheProperties.RedisredisProperties=cacheProperties.getRedis();//将配置文件中所有的配置都生效if(redisProperties.getTimeToLive()!=null){config=config.entryTtl(redisProperties.getTimeToLive());}if(redisProperties.getKeyPrefix()!=null){config=config.prefixKeysWith(redisProperties.getKeyPrefix());}if(!redisProperties.isCacheNullValues()){config=config.disableCachingNullValues();}if(!redisProperties.isUseKeyPrefix()){config=config.disableKeyPrefix();}returnconfig;}}
RedisService
packagecom.wlient.springboot_mq_redis.service;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.data.redis.core.RedisTemplate;importorg.springframework.stereotype.Service;importorg.springframework.util.CollectionUtils;importjavax.annotation.Resource;importjava.util.Collection;importjava.util.List;importjava.util.Map;importjava.util.Set;importjava.util.concurrent.TimeUnit;@ServicepublicclassRedisService{@ResourceprivateRedisTemplateredisTemplate;//=============================common============================/***指定缓存失效时间*@paramkey键*@paramtime时间(秒)*@return*/publicbooleanexpire(Stringkey,longtime){try{if(time>0){redisTemplate.expire(key,time,TimeUnit.SECONDS);}returntrue;}catch(Exceptione){e.printStackTrace();returnfalse;}}/***根据key获取过期时间*@paramkey键不能为null*@return时间(秒)返回0代表为永久有效*/publiclonggetExpire(Stringkey){returnredisTemplate.getExpire(key,TimeUnit.SECONDS);}/***判断key是否存在*@paramkey键*@returntrue存在false不存在*/publicbooleanhasKey(Stringkey){try{returnredisTemplate.hasKey(key);}catch(Exceptione){e.printStackTrace();returnfalse;}}/***删除缓存*@paramkey可以传一个值或多个*/@SuppressWarnings("unchecked")publicvoiddel(String...key){if(key!=null&&key.length>0){if(key.length==1){redisTemplate.delete(key[0]);}else{redisTemplate.delete(CollectionUtils.arrayToList(key));}}}//============================String=============================/***普通缓存获取*@paramkey键*@return值*/publicObjectget(Stringkey){returnkey==null?null:redisTemplate.opsForValue().get(key);}/***普通缓存放入*@paramkey键*@paramvalue值*@returntrue成功false失败*/publicbooleanset(Stringkey,Objectvalue){try{redisTemplate.opsForValue().set(key,value);returntrue;}catch(Exceptione){e.printStackTrace();returnfalse;}}/***普通缓存放入并设置时间*@paramkey键*@paramvalue值*@paramtime时间(秒)time要大于0如果time小于等于0将设置无限期*@returntrue成功false失败*/publicbooleanset(Stringkey,Objectvalue,longtime){try{if(time>0){redisTemplate.opsForValue().set(key,value,time,TimeUnit.SECONDS);}else{set(key,value);}returntrue;}catch(Exceptione){e.printStackTrace();returnfalse;}}/***递增*@paramkey键*@paramdelta要增加几(大于0)*@return*/publiclongincr(Stringkey,longdelta){if(delta<0){thrownewRuntimeException("递增因子必须大于0");}returnredisTemplate.opsForValue().increment(key,delta);}/***递减*@paramkey键*@paramdelta要减少几(小于0)*@return*/publiclongdecr(Stringkey,longdelta){if(delta<0){thrownewRuntimeException("递减因子必须大于0");}returnredisTemplate.opsForValue().increment(key,-delta);}//================================Map=================================/***HashGet*@paramkey键不能为null*@paramitem项不能为null*@return值*/publicObjecthget(Stringkey,Stringitem){returnredisTemplate.opsForHash().get(key,item);}/***获取hashKey对应的所有键值*@paramkey键*@return对应的多个键值*/publicMap
Application
@SpringBootApplication@MapperScan("com.wlient.springboot_mq_redis.dao")@EnableCachingpublicclassSpringbootMqRedisApplication{publicstaticvoidmain(String[]args){SpringApplication.run(SpringbootMqRedisApplication.class,args);}}
主要是添加@EnableCaching注解开启缓存
缓存有两种方式:
方式一:直接使用对RedisTemplate进行封装的RedisService进行缓存操作
controller层
@AutowiredRedisServiceredisService;@GetMapping("selectOne2")publicServiceResultselectOne2(Integerid){Useruser=(User)redisService.get("selectOne2::"+id);if(user==null){user=userService.queryById2(id);redisService.set("selectOne2::"+id,user);}System.out.println(user);returnServiceResult.ok(user);}
方式二:使用注解
作用于Service层
@Service("userService")@CacheConfig(cacheNames="departmentsService")publicclassUserServiceImplimplementsUserService{@ResourceprivateUserDaouserDao;/***通过ID查询单条数据**@paramid主键*@return实例对象*/@Override@Cacheable(key="#root.methodName+':'+#id")publicUserqueryById(Integerid){Useruser=this.userDao.selectById(id);returnuser;}}
使用注解比较方便,但是不够灵活。
使用封装类增加了代码量,但是可以满足大部分需求
配置文件详解
RedisConfig:redis cache,设置key,value的序列化方式等
SpringCacheConfig:spring cache 配置
这两个文件缺一不可,缺失SpringCacheConfig配置文件,那么存入redis的数据会乱码
CacheConfig:可有可无,只是根据需求采用的配置(从项目里copy的)
读到这里,这篇“SpringBoot集成Redis开启缓存机制的方法”文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注恰卡编程网行业资讯频道。