Redis、Spring Cache缓存

一、Redis

1.1 Redis命令

  • 启动Redis:
    redis-server [–port 6379]
  • 查看已启动的redis
    ps -ef|grep redis
  • 登陆节点(连接redis)
    进入redis目录下
    • redis-cli -p 端口号 -a 密码
    • auth 密码(若未输入密码,需用这个指令输入密码,否则ping不了)
  • 停止Redis:
    shutdown
  • Note
    Redis 命令用于在 redis 服务上执行操作。
    要在 redis 服务上执行命令需要一个 redis 客户端。Redis 客户端在下载的 redis 的安装包中。

1.2 SpringBoot集成Redis

链接: SpringBoot集成Redis

1.3 Redis 缓存实现用户验证码登录

链接: Redis 缓存实现用户验证码登录

1.4 Redis缓存菜品、套餐数据

1.4.1 Redis缓存菜品数据

  • 需改造DishController的list、update、save方法
    • list方法:因为查询时是根据分类查询多个菜品,每个分类下面的菜品对应一份缓存数据。
      • 先从redis中获取缓存数据 (key设置为:dish_菜品id_status)
        • 如果存在,直接返回,不需要查询数据库
        • 如果不存在,需要查询数据库,将查询到的菜品数据缓存到Redis,60分钟
    • update方法:清理某个分类下面的菜品缓存数据 保证数据库的数据与缓存中的数据一致
    • save方法:清理某个分类下面的菜品缓存数据 保证数据库的数据与缓存中的数据一致

链接: Redis缓存菜品、套餐数据

1.4.2 Redis缓存套餐数据

二、Spring Cache

可以简化上述1.4用Redis缓存菜品

2.1 Spring Cache介绍

Spring Cache是一个框架,实现了基于注解的缓存功能,只需要简单地加一个注解,就能实现缓存功能。(Spring Cache其实就是一个缓存框架,可以整合其他具体的缓存产品,使用较为简单,只需要加注解)
Spring Cache提供了一层抽象,底层可以切换不同的cache实现,具体就是通过CacheManager接口来统一不同的缓存技术。
CacheManager是Spring提供的各种缓存技术抽象接口。

针对不同的缓存技术需要实现不同的CacheManager:
在这里插入图片描述

2.2 Spring Cache 常用注解

  • 在spring boot项目中,使用缓存技术只需要在项目中导入相关缓存技术的依赖包,并在启动类上使用@EnableCaching开启缓存技术支持即可。

例如,使用Redis作为缓存技术,只需要导入Spring data Redis的maven坐标即可。
在这里插入图片描述

1)@EnableCaching 开启

  • 开启缓存注解功能;
  • 启动类上加入@EnableCaching注解

2)@Cacheable

  • @Cacheable(value = “缓存的名称” , key = “缓存的key” , unless= “条件”):在方法执行前,Spring先查看缓存中是否有数据,如果有数据,则直接返回缓存数据;没有则调用方法并将方法返回值放到缓存中;
    • condition:条件,当满足条件时缓存数据
    • unless:条件,当满足条件时不缓存数据
  • 一般放在查询方法上;
  • 例如:@Cacheable(value = “userCache” , key = “#行参名.属性” , unless = “#result ==null”)
    key = “#user.id + ‘_’ + #user.name”:保证不同的查询条件对应不同的缓存数据
    在这里插入图片描述

3)@CachePut 放入缓存

  • @CachePut(value = “缓存的名称”,key = “缓存的key”):将方法的返回值放到缓存中;
  • 一般放在新增方法上。
    • value:相当于一类缓存,每个缓存名称下面可以有多个key。比如所有用户的缓存分成一个类叫userCache,这个分类下面可能有多个缓存数据,需要用key来区分这多个缓存数据。
    • key:#result代表方法的返回值;
    • 例如:@CachePut(value = “userCache” , key = “#result.id”)

4)@CacheEvict 删除

  • @CacheEvict(value = “缓存的名称”,key = “缓存的key”) :将一条或多条数据从缓存中删除;
    • allEntries = true:所有value下的缓存数据都清理掉。
      • 例如:@CacheEvict(value = “userCache”,allEntries = true)
  • 一般放在删除方法、更新方法上。
  • 例如:@CacheEvict(value=“userCache” , key = “#行参名.属性”)

2.3 使用Redis作为缓存技术

1)导入Spring Cache和Redis相关的maven坐标

		<!-- redis依赖  -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>
        <!-- Spring Cache -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-cache</artifactId>
        </dependency>

2)在appilcation.yml中配置redis、缓存数据的过期时间

  redis:
    host: 127.0.0.1 # Redis服务器地址
    port: 6379      # Redis服务器连接端口
    password: 123456
    database: 0     # Redis数据库索引(默认为0)
  cache:
    redis:
      time-to-live: 1800000 # 设置缓存有效期(1800000毫秒=30分钟) 不设置则永久有效

3)在启动类上加入@EnableCaching注解,开启缓存注解功能

4)在Controller方法上加入@Cache…注解,进行缓存操作

  • list方法上加 @Cacheable注解
    在SetmealController的list方法上加入@Cacheable注解
    @GetMapping("/list")
    @Cacheable(value = "setmealCache", key = "#setmeal.categoryId + '_' + setmeal.status")
    public R<List<Setmeal>> list(Setmeal setmeal) {
        List<Setmeal> list = null;
        //动态构造key
        String key = "setmeal_" + setmeal.getCategoryId() + "_" + setmeal.getStatus();   //setmeal_1524731277968793602_1
        //先从redis中获取数据;
        list = (List<Setmeal>) redisTemplate.opsForValue().get(key);

        if (list != null) {
            //如果存在,直接返回,无需查询数据库
            return R.success(list);
        }

        LambdaQueryWrapper<Setmeal> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(setmeal.getCategoryId() != null, Setmeal::getCategoryId, setmeal.getCategoryId());
        queryWrapper.eq(setmeal.getStatus() != null, Setmeal::getStatus, setmeal.getStatus());
        queryWrapper.orderByDesc(Setmeal::getUpdateTime);

        list = setmealService.list(queryWrapper);
        //如果不存在,需要查询数据库,将查询到的菜品数据缓存到Redis
        redisTemplate.opsForValue().set(key, list, 60, TimeUnit.MINUTES);

        return R.success(list);
    }
  • save、delete方法上加@CacheEvict注解
    /**
     * 新增套餐
     *
     * @param setmealDto
     * @return
     */

    @PostMapping
    @CacheEvict(value = "setmealCache", allEntries = true)
    public R<String> save(@RequestBody SetmealDto setmealDto) {
        log.info("套餐信息:{}", setmealDto);

        setmealService.saveWithDish(setmealDto);

        return R.success("新增套餐成功");
    }
    /**
     * 删除套餐
     *
     * @param ids
     * @return
     */
    @DeleteMapping
    @CacheEvict(value = "setmealCache", allEntries = true)
    public R<String> delete(@RequestParam List<Long> ids) {
        log.info("ids:{}", ids);

        setmealService.removeWithDish(ids);

        return R.success("套餐数据删除成功");
    }

Note: R需实现序列化

public class R<T> implements Serializable {
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值