redis缓存

一、redis缓存

①service

package com.slj.springbootrediscache.service;

import com.slj.springbootrediscache.entry.User;
import com.slj.springbootrediscache.mapper.UserMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.ValueOperations;
import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;

@Service
public class UserService2 {
    @Resource
    private UserMapper userMapper;

    @Autowired
    private RedisTemplate redisTemplate;

    public User findById(Long id){
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());

        ValueOperations valueOperations=redisTemplate.opsForValue();
        //1.先从redis中获取数据
        Object o = valueOperations.get("user::findById::" + id);
        //2.如果存在,则直接返回
        if(o!=null){
            return (User) o;
        }
        //3.如果不存在则查询数据库,并把查询的结果返回给redis中
        User user = userMapper.selectById(id);
        if(user!=null){
            valueOperations.set("user::findById::"+id,user);
        }
        return user;
    }

    public void delete(Long id){
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());

        ValueOperations valueOperations=redisTemplate.opsForValue();
        //先删除缓存中的数据
        redisTemplate.delete("user::findById::"+id);
        //再删除数据库的数据
        userMapper.deleteById(id);
    }

    public void update(User user){
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());

        ValueOperations valueOperations=redisTemplate.opsForValue();
        //先修改缓存中的数据
        valueOperations.set("user::findById::"+user.getId(),user);
        //在修改数据库的数据
        userMapper.updateById(user);
    }

    public void insert(User user){
        userMapper.insert(user);
    }
}

②、controller

package com.slj.springbootrediscache.controller;

import com.slj.springbootrediscache.entry.User;
import com.slj.springbootrediscache.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

@RestController
public class UserCotroller {
    @Autowired
    private UserService userService;

    @GetMapping("byId/{id}")
    public User byId(@PathVariable Long id)  {
        return userService.findById(id);
    }

    @PutMapping("update")
    public User update(User user){
        userService.update(user);
        return user;
    }

    @DeleteMapping("delete/{id}")
    public String delete(@PathVariable Long id){

        userService.delete(id);
        return "删除成功";
    }


    @PostMapping("insert")
    public String insert(User user){
        userService.insert(user);
        return "修改成功";
    }


}

③application.properties

二、注解的redis缓存

① service

package com.slj.springbootrediscache.service;


import com.slj.springbootrediscache.entry.User;
import com.slj.springbootrediscache.mapper.UserMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.CachePut;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;

@Service
public class UserService {
    @Resource
    private UserMapper userMapper;

    @Autowired
    private RedisTemplate redisTemplate;


    @Cacheable(cacheNames = "user::findById",key="#id")
    public User findById(Long id){

        //3.如果不存在则查询数据库,并把查询的结果返回给redis中
        User user = userMapper.selectById(id);
        return user;
    }

    @CacheEvict(cacheNames = "user::findById",key = "#id")
    public void delete(Long id){

        //再删除数据库的数据
        userMapper.deleteById(id);
    }

    @CachePut(cacheNames = "user::findById",key="#user.id")
    public User update(User user){

        //在修改数据库的数据
        userMapper.updateById(user);
        return user;
    }

    public void insert(User user){
        userMapper.insert(user);
    }
}

②controller

package com.slj.springbootrediscache.controller;

import com.slj.springbootrediscache.entry.User;
import com.slj.springbootrediscache.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

@RestController
public class UserCotroller {
    @Autowired
    private UserService userService;

    @GetMapping("byId/{id}")
    public User byId(@PathVariable Long id)  {
        return userService.findById(id);
    }

    @PutMapping("update")
    public User update(User user){
        userService.update(user);
        return user;
    }

    @DeleteMapping("delete/{id}")
    public String delete(@PathVariable Long id){

        userService.delete(id);
        return "删除成功";
    }


    @PostMapping("insert")
    public String insert(User user){
        userService.insert(user);
        return "修改成功";
    }


}

③加入缓存的配置类

package com.slj.springbootrediscache.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.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;

@Configuration
public class Redisconfig {
    //比如验证码
    @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)) //缓存过期10分钟 ---- 业务需求。
                .serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(redisSerializer))//设置key的序列化方式
                .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(jackson2JsonRedisSerializer)) //设置value的序列化
                .disableCachingNullValues();
        RedisCacheManager cacheManager = RedisCacheManager.builder(factory)
                .cacheDefaults(config)
                .build();
        return cacheManager;
    }
}

④启动缓存注解

⑤测试

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值