SpringBoot集成Redis开启缓存机制的方法

SpringBoot集成Redis开启缓存机制的方法

本文小编为大家详细介绍“SpringBoot集成Redis开启缓存机制的方法”,内容详细,步骤清晰,细节处理妥当,希望这篇“SpringBoot集成Redis开启缓存机制的方法”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。

集成springboot+redis+mybatis plus的一个小demo

pom文件

<?xmlversion="1.0"encoding="UTF-8"?><projectxmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.wlient</groupId><artifactId>springboot_mq_redis</artifactId><version>0.0.1-SNAPSHOT</version><name>springboot_mq_redis</name><description>DemoprojectforSpringBoot</description><properties><java.version>1.8</java.version><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding><spring-boot.version>2.3.7.RELEASE</spring-boot.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.4.2</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId><scope>runtime</scope><optional>true</optional></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><scope>runtime</scope></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope><exclusions><exclusion><groupId>org.junit.vintage</groupId><artifactId>junit-vintage-engine</artifactId></exclusion></exclusions></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><scope>test</scope></dependency><dependency><groupId>org.springframework.amqp</groupId><artifactId>spring-rabbit-test</artifactId><scope>test</scope></dependency><dependency><groupId>org.aspectj</groupId><artifactId>aspectjweaver</artifactId><version>1.9.6</version></dependency><!--jedis--><dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>3.2.0</version></dependency><!--swagger--><dependency><groupId>com.github.xiaoymin</groupId><artifactId>knife4j-spring-boot-starter</artifactId><version>2.0.7</version></dependency><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.76</version></dependency></dependencies><dependencyManagement><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-dependencies</artifactId><version>${spring-boot.version}</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement><build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.8.1</version><configuration><source>1.8</source><target>1.8</target><encoding>UTF-8</encoding></configuration></plugin><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><version>2.3.7.RELEASE</version><configuration><mainClass>com.wlient.springboot_mq_redis.SpringbootMqRedisApplication</mainClass></configuration><executions><execution><id>repackage</id><goals><goal>repackage</goal></goals></execution></executions></plugin></plugins></build></project>

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();Map<String,RedisCacheConfiguration>redisCacheConfigurationMap=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<Object>pair=RedisSerializationContext.SerializationPair.fromSerializer(jdkSerializer);//RedisCacheConfigurationdefaultCacheConfig=RedisCacheConfiguration.defaultCacheConfig().serializeValuesWith(pair);Set<String>cacheNames=newHashSet<>();cacheNames.add("common");//初始化RedisCacheManagerRedisCacheManagercacheManager=RedisCacheManager.builder(connectionFactory).cacheDefaults(defaultCacheConfig).initialCacheNames(cacheNames).withInitialCacheConfigurations(redisCacheConfigurationMap).build();returncacheManager;}}

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")publicRedisTemplate<String,Object>redisTemplate(RedisConnectionFactoryfactory){RedisTemplate<String,Object>template=newRedisTemplate<String,Object>();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{@ResourceprivateRedisTemplate<String,Object>redisTemplate;//=============================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<Object,Object>hmget(Stringkey){returnredisTemplate.opsForHash().entries(key);}/***HashSet*@paramkey键*@parammap对应多个键值*@returntrue成功false失败*/publicbooleanhmset(Stringkey,Map<String,Object>map){try{redisTemplate.opsForHash().putAll(key,map);returntrue;}catch(Exceptione){e.printStackTrace();returnfalse;}}/***HashSet并设置时间*@paramkey键*@parammap对应多个键值*@paramtime时间(秒)*@returntrue成功false失败*/publicbooleanhmset(Stringkey,Map<String,Object>map,longtime){try{redisTemplate.opsForHash().putAll(key,map);if(time>0){expire(key,time);}returntrue;}catch(Exceptione){e.printStackTrace();returnfalse;}}/***向一张hash表中放入数据,如果不存在将创建*@paramkey键*@paramitem项*@paramvalue值*@returntrue成功false失败*/publicbooleanhset(Stringkey,Stringitem,Objectvalue){try{redisTemplate.opsForHash().put(key,item,value);returntrue;}catch(Exceptione){e.printStackTrace();returnfalse;}}/***向一张hash表中放入数据,如果不存在将创建*@paramkey键*@paramitem项*@paramvalue值*@paramtime时间(秒)注意:如果已存在的hash表有时间,这里将会替换原有的时间*@returntrue成功false失败*/publicbooleanhset(Stringkey,Stringitem,Objectvalue,longtime){try{redisTemplate.opsForHash().put(key,item,value);if(time>0){expire(key,time);}returntrue;}catch(Exceptione){e.printStackTrace();returnfalse;}}/***删除hash表中的值*@paramkey键不能为null*@paramitem项可以使多个不能为null*/publicvoidhdel(Stringkey,Object...item){redisTemplate.opsForHash().delete(key,item);}/***删除hash表中的值*@paramkey键不能为null*@paramitems项可以使多个不能为null*/publicvoidhdel(Stringkey,Collectionitems){redisTemplate.opsForHash().delete(key,items.toArray());}/***判断hash表中是否有该项的值*@paramkey键不能为null*@paramitem项不能为null*@returntrue存在false不存在*/publicbooleanhHasKey(Stringkey,Stringitem){returnredisTemplate.opsForHash().hasKey(key,item);}/***hash递增如果不存在,就会创建一个并把新增后的值返回*@paramkey键*@paramitem项*@paramdelta要增加几(大于0)*@return*/publicdoublehincr(Stringkey,Stringitem,doubledelta){if(delta<0){thrownewRuntimeException("递增因子必须大于0");}returnredisTemplate.opsForHash().increment(key,item,delta);}/***hash递减*@paramkey键*@paramitem项*@paramdelta要减少记(小于0)*@return*/publicdoublehdecr(Stringkey,Stringitem,doubledelta){if(delta<0){thrownewRuntimeException("递减因子必须大于0");}returnredisTemplate.opsForHash().increment(key,item,-delta);}//============================set=============================/***根据key获取Set中的所有值*@paramkey键*@return*/publicSet<Object>sGet(Stringkey){try{returnredisTemplate.opsForSet().members(key);}catch(Exceptione){e.printStackTrace();returnnull;}}/***根据value从一个set中查询,是否存在*@paramkey键*@paramvalue值*@returntrue存在false不存在*/publicbooleansHasKey(Stringkey,Objectvalue){try{returnredisTemplate.opsForSet().isMember(key,value);}catch(Exceptione){e.printStackTrace();returnfalse;}}/***将数据放入set缓存*@paramkey键*@paramvalues值可以是多个*@return成功个数*/publiclongsSet(Stringkey,Object...values){try{returnredisTemplate.opsForSet().add(key,values);}catch(Exceptione){e.printStackTrace();return0;}}/***将数据放入set缓存*@paramkey键*@paramvalues值可以是多个*@return成功个数*/publiclongsSet(Stringkey,Collectionvalues){try{returnredisTemplate.opsForSet().add(key,values.toArray());}catch(Exceptione){e.printStackTrace();return0;}}/***将set数据放入缓存*@paramkey键*@paramtime时间(秒)*@paramvalues值可以是多个*@return成功个数*/publiclongsSetAndTime(Stringkey,longtime,Object...values){try{Longcount=redisTemplate.opsForSet().add(key,values);if(time>0)expire(key,time);returncount;}catch(Exceptione){e.printStackTrace();return0;}}/***获取set缓存的长度*@paramkey键*@return*/publiclongsGetSetSize(Stringkey){try{returnredisTemplate.opsForSet().size(key);}catch(Exceptione){e.printStackTrace();return0;}}/***移除值为value的*@paramkey键*@paramvalues值可以是多个*@return移除的个数*/publiclongsetRemove(Stringkey,Object...values){try{Longcount=redisTemplate.opsForSet().remove(key,values);returncount;}catch(Exceptione){e.printStackTrace();return0;}}//===============================list=================================/***获取list缓存的内容*@paramkey键*@paramstart开始*@paramend结束0到-1代表所有值*@return*/publicList<Object>lGet(Stringkey,longstart,longend){try{returnredisTemplate.opsForList().range(key,start,end);}catch(Exceptione){e.printStackTrace();returnnull;}}/***获取list缓存的长度*@paramkey键*@return*/publiclonglGetListSize(Stringkey){try{returnredisTemplate.opsForList().size(key);}catch(Exceptione){e.printStackTrace();return0;}}/***通过索引获取list中的值*@paramkey键*@paramindex索引index>=0时,0表头,1第二个元素,依次类推;index<0时,-1,表尾,-2倒数第二个元素,依次类推*@return*/publicObjectlGetIndex(Stringkey,longindex){try{returnredisTemplate.opsForList().index(key,index);}catch(Exceptione){e.printStackTrace();returnnull;}}/***将list放入缓存*@paramkey键*@paramvalue值*@return*/publicbooleanlSet(Stringkey,Objectvalue){try{redisTemplate.opsForList().rightPush(key,value);returntrue;}catch(Exceptione){e.printStackTrace();returnfalse;}}/***将list放入缓存*@paramkey键*@paramvalue值*@paramtime时间(秒)*@return*/publicbooleanlSet(Stringkey,Objectvalue,longtime){try{redisTemplate.opsForList().rightPush(key,value);if(time>0)expire(key,time);returntrue;}catch(Exceptione){e.printStackTrace();returnfalse;}}/***将list放入缓存*@paramkey键*@paramvalue值*@return*/publicbooleanlSet(Stringkey,List<Object>value){try{redisTemplate.opsForList().rightPushAll(key,value);returntrue;}catch(Exceptione){e.printStackTrace();returnfalse;}}/***将list放入缓存**@paramkey键*@paramvalue值*@paramtime时间(秒)*@return*/publicbooleanlSet(Stringkey,List<Object>value,longtime){try{redisTemplate.opsForList().rightPushAll(key,value);if(time>0)expire(key,time);returntrue;}catch(Exceptione){e.printStackTrace();returnfalse;}}/***根据索引修改list中的某条数据*@paramkey键*@paramindex索引*@paramvalue值*@return*/publicbooleanlUpdateIndex(Stringkey,longindex,Objectvalue){try{redisTemplate.opsForList().set(key,index,value);returntrue;}catch(Exceptione){e.printStackTrace();returnfalse;}}/***移除N个值为value*@paramkey键*@paramcount移除多少个*@paramvalue值*@return移除的个数*/publiclonglRemove(Stringkey,longcount,Objectvalue){try{Longremove=redisTemplate.opsForList().remove(key,count,value);returnremove;}catch(Exceptione){e.printStackTrace();return0;}}}

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")publicServiceResult<User>selectOne2(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开启缓存机制的方法”文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注恰卡编程网行业资讯频道。

发布于 2022-03-29 22:28:45
收藏
分享
海报
0 条评论
24
上一篇:Redis+SpringBoot案例分析 下一篇:Redis分布式锁实例分析
目录

    0 条评论

    本站已关闭游客评论,请登录或者注册后再评论吧~

    忘记密码?

    图形验证码