SpringBoot + Redis 实现增删改查的缓存

本文介绍如何在Spring Boot项目中引入Redis依赖并进行配置。包括配置文件设置、使用注解注入RedisTemplate对象、序列化配置及实现缓存读取与更新的策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Redis 依赖引入

<!--使用redis服务-->
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-data-redis</artifactId>
    </dependency>
  • application.yml文件配置
    设置redis的连接地址和端口号,如果有密码可设置密码
  redis:
    host: 127.0.0.1
    port: 6379
    #password: 123456
    database: 0     #操作的是0号数据库
  cache:
    redis:
      time-to-live: 1800000  #设置缓存数据的过期时间

在springboot中可直接创建变量使用注解注入,springboot会自动将操作redis的对象bean创建出来注入。

@Resource
    private RedisTemplate redisTemplate;
  • 新建key序列化配置类
    在直接使用RedisTemplate 对象时创建key和value会使用自带的序列化器,会使key和value前面上传一串字符,可使用配置类重新定义序列化器,使创建key时恢复成设置的名称,value则不用,因为在代码中get出值的时候会自动反序列化,恢复正常。
/**
 * Redis配置类
 */

import org.springframework.cache.annotation.CachingConfigurerSupport;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.StringRedisSerializer;

import javax.annotation.Resource;

@Configuration
public class RedisConfig extends CachingConfigurerSupport {
    @Resource
    RedisConnectionFactory redisConnectionFactory;

    @Bean
    public RedisTemplate<Object,Object> redisTemplate(){
        RedisTemplate<Object, Object> redisTemplate = new RedisTemplate<>();

        //默认的Key序列化器为:JdkSerializationRedisSerializer
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        redisTemplate.setHashKeySerializer(new StringRedisSerializer());

        redisTemplate.setConnectionFactory(redisConnectionFactory);

        return redisTemplate;
    }
}
  • 查询的时候,先从redis中查找数据,没有则在数据库中查询,然后保存到redis中,第二次查找时就可以从redis中找到数据。
@GetMapping("/list")
    public R<List<DishDto>> list(Dish dish){
        List<DishDto> listDishDto = null;

        String key = "dish_" + dish.getCategoryId() + "_" + dish.getStatus();
        //根据key先从redis中获取缓存数据
        listDishDto = (List<DishDto>) redisTemplate.opsForValue().get(key);
        //如果存在,直接返回,无需查询数据库
        if (listDishDto != null){
            return R.success(listDishDto);
        }

        //构造查询条件
        LambdaQueryWrapper<Dish> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(dish.getCategoryId() != null,Dish::getCategoryId,dish.getCategoryId());
        //添加查询条件
        queryWrapper.eq(Dish::getStatus,1);
        //添加排序条件
        queryWrapper.orderByAsc(Dish::getSort).orderByDesc(Dish::getUpdateTime);

        List<Dish> list = dishService.list(queryWrapper);

        listDishDto = list.stream().map((item) -> {
            DishDto dishDto = new DishDto();
            BeanUtils.copyProperties(item,dishDto);

            LambdaQueryWrapper<DishFlavor> queryWrapper1 = new LambdaQueryWrapper<>();
            queryWrapper1.eq(DishFlavor::getDishId,dishDto.getId());
            //根据id查询分类
            List<DishFlavor> dishFlavors = dishFlavorService.list(queryWrapper1);
            dishDto.setFlavors(dishFlavors);

            return dishDto;
        }).collect(Collectors.toList());

        //如果不存在需要查询数据库,将查询到的菜品数据缓存到redis,设置过期时间为60分钟
        redisTemplate.opsForValue().set(key,listDishDto,60, TimeUnit.MINUTES);

        return R.success(listDishDto);

    }

  • 删除、新增、修改操作时因为数据改变,所以需要根据保存的key将redis中的缓存数据删除。
 /**
     * 停售、批量停售菜品
     * @param ids
     */
    @PostMapping("/status/{status}")
    public R<String> StopById(@RequestParam List<Long> ids,@PathVariable Integer status){
        //获取所有以setmeal_*开头的key
        Set setmealKeys = redisTemplate.keys("setmeal_*");
        //清理这些key中的所有缓存数据
        redisTemplate.delete(setmealKeys);
        //在数据库中删除
        dishService.stopByIdWithdish(ids, status);
        return R.success("成功");
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值