栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

SpringBoot整合Redis

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

SpringBoot整合Redis

首先:保证你要保证redis是启动状态,打开你redis目录中的redis-server.exe

我习惯用cmd,输入命令redis-server.exe

弹出下面的窗口证明正常启动了,默认端口是6379

1.在你的pom文件中导入redis的依赖,我这里还导了一份连接池的依赖(可以使性能更好一点)


    org.springframework.boot
    spring-boot-starter-data-redis




    org.apache.commons
    commons-pool2




    com.alibaba
    fastjson
    1.2.67

2.在application.yml文件中加入配置,主机我写的是本机,

但是在公司里面可能会根据公司服务器的进行配置

spring:
  redis:
    port: 6379
    host: localhost
  cache:
    cache-names: xxx,yyy        # 缓存前缀
    type: redis                 # 缓存类型
    redis:
      cache-null-values: true  # 允许Redis缓存空值
      key-prefix: dacai_
      time-to-live: 0ms         # 缓存超时时间戳,配置为0则永不过期
      use-key-prefix: true      # 启用Redis的键前缀

3.创建一个redis配置类

@Configuration          //标识这是一个配置类
@EnableCaching          //启动缓存注解
//  继承缓存配置的支持类
public class RedisConfig extends CachingConfigurerSupport {

    @Autowired        //可注入,也可以直接写在方法中
    private RedisConnectionFactory connectionFactory;

    @Bean
    public RedisTemplate redisTemplate(){
        RedisTemplate redisTemplate = new RedisTemplate<>();
        redisTemplate.setConnectionFactory(connectionFactory);

        // 指定k/v的序列化方式
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        Jackson2JsonRedisSerializer serializer = new Jackson2JsonRedisSerializer<>(Object.class);
        redisTemplate.setValueSerializer(serializer);

        ObjectMapper om = new ObjectMapper();
        om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
        om.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));
        om.setTimeZone(TimeZone.getDefault());
        om.configure(MapperFeature.USE_ANNOTATIONS, false);
        om.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
        om.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);
        // 此项必须配置,否则会报java.lang.ClassCastException: java.util.linkedHashMap cannot be cast to XXX
        //om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL, JsonTypeInfo.As.PROPERTY);//过时方法,用activateDefaultTyping替代
        om.activateDefaultTyping(LaissezFaireSubTypevalidator.instance , ObjectMapper.DefaultTyping.NON_FINAL, JsonTypeInfo.As.PROPERTY);
        om.setSerializationInclusion(JsonInclude.Include.NON_NULL);
        serializer.setObjectMapper(om);
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        redisTemplate.setValueSerializer(serializer);

        return  redisTemplate;
    }

    @Bean
    public RedisCacheManager redisCacheManager(RedisTemplate redisTemplate) {
        RedisCacheWriter redisCacheWriter = RedisCacheWriter.nonLockingRedisCacheWriter(redisTemplate.getConnectionFactory());
        RedisCacheConfiguration redisCacheConfiguration = RedisCacheConfiguration.defaultCacheConfig()
                .serializevaluesWith(RedisSerializationContext.SerializationPair.fromSerializer(redisTemplate.getValueSerializer()));
        return new RedisCacheManager(redisCacheWriter, redisCacheConfiguration);
    }
} 

4.创建一个简单的redis控制器类

@RestController
public class RedisController {
    //Redis操作模板
    @Autowired
    private RedisTemplate redisTemplate;

    //set数据
    @GetMapping("/set/{key}/{value}")
    public Object set(@PathVariable("key") String key,
                      @PathVariable("value") String value){
        redisTemplate.opsForValue().set(key,value);
        return "set ok";
    }

    //get数据
    @GetMapping("/get/{key}")
    public Object get(@PathVariable("key") String key){
        return redisTemplate.opsForValue().get(key);
    }

    //set数据
    @GetMapping("/set/{key}")
    public Object setObj(@PathVariable("key") String key){
        redisTemplate.opsForValue().set(key,new Emp(100L,18,new Date(),"张三",20000.0,"北京"));
        return "set ok";
    }
}

注: 我的实体类:

@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder                        //  可以在测试类直接点属性
@Accessors(chain = true)        // 开启链式编程
public class Emp implements Serializable {
    private Long id;
    private Integer age;
    @JsonFormat(pattern = "yyyy-MM-dd" )
    private Date birthday;
    private String name;
    private Double sal;
    private String homeAddress;
}

 5.在业务层加上缓存注解:,(下面还用了另一种方式操作缓存)

@Service
@Slf4j
public class EmpServiceImpl implements EmpService {

    @Resource
    private EmpMapper empMapper;

    @Autowired
    private RedisTemplate redisTemplate;


    @Override
    @Cacheable(cacheNames = "xxx",key = "'getEmpList'")
    public List getEmpList() {
        return empMapper.getAllEmp();
    }

    @Override
    @CachePut(cacheNames = "xxx",key = "'emp:id:' + #emp.id")
    public Emp addEmp(Emp emp) {
        empMapper.addEmp(emp);
        return  emp;
    }

    @Override
    @Cacheable(cacheNames = "xxx",key = "'emp:id:'+ #id")
    public Emp getEmpById(Long id) {
        return empMapper.getEmpById(id);
    }

    

    @Override
    @CachePut(cacheNames = "xxx",key = "'emp:id:' + #emp.id")
    // 想将数据写入缓存,方法必须有返回值
    public Emp updateEmp(Emp emp) {
        empMapper.updateEmp(emp);
        redisTemplate.delete("xxx::getEmpList");
        return emp;
    }

    @Override
    @CacheEvict(cacheNames = "xxx",key = "'emp:id:' + #id")
    public Long deleteEmpById(Long id) {
        empMapper.deleteEmpById(id);
        redisTemplate.delete("xxx::getEmpList");
        return id;
    }
}

转载请注明:文章转载自 www.mshxw.com
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号