irpas技术客

springboot整合redis_渔光一点萤@_springboot整合redis

网络投稿 1005

准备工作:创建一个springboot项目,建好controller,service,config

第一步:添加依赖

<!-- redis --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> <!--spring2.X集成redis所需common-pool2--> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-pool2</artifactId> <version>2.6.0</version> </dependency>

再config包下创建redisConfig配置类

package com.zjw.config; import com.fasterxml.jackson.annotation.JsonAutoDetect; import com.fasterxml.jackson.annotation.PropertyAccessor; import com.fasterxml.jackson.databind.ObjectMapper; 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.RedisCacheConfiguration; 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.serializer.Jackson2JsonRedisSerializer; import org.springframework.data.redis.serializer.RedisSerializationContext; import org.springframework.data.redis.serializer.RedisSerializer; import org.springframework.data.redis.serializer.StringRedisSerializer; import java.time.Duration; @EnableCaching //开启缓存 @Configuration public class redisConfig extends CachingConfigurerSupport { @Bean public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) { RedisTemplate<String, Object> template = new RedisTemplate<>(); RedisSerializer<String> redisSerializer = new StringRedisSerializer(); 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.setConnectionFactory(factory); //key序列化方式 template.setKeySerializer(redisSerializer); //value序列化 template.setValueSerializer(jackson2JsonRedisSerializer); //value hashmap序列化 template.setHashValueSerializer(jackson2JsonRedisSerializer); return template; } @Bean public CacheManager cacheManager(RedisConnectionFactory factory) { RedisSerializer<String> redisSerializer = new StringRedisSerializer(); 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); // 配置序列化(解决乱码的问题),过期时间600秒 RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig() .entryTtl(Duration.ofSeconds(600)) //设置数据过期时间600秒 .serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(redisSerializer)) .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(jackson2JsonRedisSerializer)) .disableCachingNullValues(); RedisCacheManager cacheManager = RedisCacheManager.builder(factory) .cacheDefaults(config) .build(); return cacheManager; } }

定义好controller,service方法 然后在需要的方法上添加缓存注解, @Cacheable ----根据方法对其返回结果进行缓存,下次请求时,如果缓存存在,则直接读取缓存数据返回;如果缓存不存在,则执行方法,并把返回的结果存入缓存中。一般用在查询方法上。 @CachePut ----使用该注解标志的方法,每次都会执行,并将结果存入指定的缓存中。其他方法可以直接从响应的缓存中读取缓存数据,而不需要再去查询数据库。一般用在新增方法上。 @CacheEvict —使用该注解标志的方法,会清空指定的缓存。一般用在更新或者删除方法上。

RedisService

package com.zjw.service; import java.util.List; public interface RedisService { List<String> getAllDogName(); }

RedisServiceImpl

package com.zjw.service.impl; import com.zjw.service.RedisService; import org.springframework.stereotype.Service; import java.util.Arrays; import java.util.List; @Service public class RedisServiceImpl implements RedisService { @Override public List<String> getAllDogName() { //这里我没有连接数据库,所以模拟一个方法当作从数据库中取数据 List<String> list = getAllDogNameFromMySQL(); return list; } //这里我没有连接数据库,所以模拟一个方法当作从数据库中取数据 public List<String> getAllDogNameFromMySQL(){ //下面是我自己造的,为了知道有没有从数据库取数据,在控制台打印一下 System.out.println("=============================从mysql数据库取数据"); List<String> list = Arrays.asList("ADog", "BDog", "CDog", "DDog"); System.out.println("==================================取数据完成"); return list; } }

RedisController

package com.zjw.controller; import com.zjw.service.RedisService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.cache.annotation.Cacheable; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import java.util.List; @RestController @RequestMapping("/Dog") public class RedisController { @Autowired private RedisService redisService; @Cacheable(key = "'allDogName'",value = "selectList") @GetMapping(value = "getAllDogName") public List<String> getAllDogName(){ return redisService.getAllDogName(); } }

还有一个重要的配置文件

# 服务端口 server.port=8855 # 环境设置:dev、test、prod spring.profiles.active=dev spring.redis.host=127.0.0.1 spring.redis.port=6379 spring.redis.database= 0 spring.redis.timeout=1800000 spring.redis.lettuce.pool.max-active=20 spring.redis.lettuce.pool.max-wait=-1 #最大阻塞等待时间(负数表示没限制) spring.redis.lettuce.pool.max-idle=5 spring.redis.lettuce.pool.min-idle=0

然后启动服务,redis 浏览器访问 http://localhost:8855/Dog/getAllDogName 我们可以注意到 第一次访问的时候,页面有数据返回,控制台有打印,说明第一次进了数据库,并且redis多了一对键值对 而第二次访问的时候,控制台没有打印,说明没有走mysql数据库,也就是redis起作用了 后言,我上面用的是电脑本地安装的redis(window版本),如果你的是服务器的就继续往下看

配置文件地址要改

redis的配置文件要改: bind 127.0.0.1 ------> bind 0.0.0.0

阿里云服务器的防火墙开放6379 然后测试也是成功的


1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,会注明原创字样,如未注明都非原创,如有侵权请联系删除!;3.作者投稿可能会经我们编辑修改或补充;4.本站不提供任何储存功能只提供收集或者投稿人的网盘链接。