使用Redis实现业务信息缓存(缓存详解,缓存更新策略,缓存三大问题)

发布于:2025-02-13 ⋅ 阅读:(16) ⋅ 点赞:(0)

一、什么是缓存?

        缓存是一种高效的数据存储方式,它通过将数据保存在内存中来提供快速的读写访问。这种机制特别适用于需要高速数据访问的应用场景,如网站、应用程序和服务。在处理大量数据和高并发请求时, 缓存能显著提高性能和用户体验。

        Redis就是一款常用的缓存中间件。

二、如何在业务中结合Redis进行缓存(代码模版)?

1.基本步骤

在业务中结合Redis进行缓存主要有以下步骤:

(1)根据key到redis中查找对应值

(2)若查找到,则直接返回。若redis中没有,则在数据库中进行查找

(3)数据库查找完毕后,先存储查找到的数据到redis中,便于下次查找同样数据的时候,可以直接从redis中获取,不用走数据库,减轻数据库的压力

(4)最后将数据进行返回即可

2.代码模版

这里以查找商铺信息为例,给出结合redis进行商铺信息缓存的代码:

(1)Controller层:

    /**
     * 根据id查询商铺信息
     * @param id 商铺id
     * @return 商铺详情数据
     */
    @GetMapping("/{id}")
    public Result queryShopById(@PathVariable("id") Long id) {
       return shopService.queryById(id);
    }

(2)Service层:

    @Autowired
    StringRedisTemplate stringRedisTemplate;
    /**
     * 根据id查询商铺信息
     * @param id
     * @return
     */
    @Override
    public Result queryById(Long id) {
        //1.从redis查询商铺缓存
        String key = RedisConstants.CACHE_SHOP_KEY + id;
        String shopFromRedis = stringRedisTemplate.opsForValue().get(key);

        //2.判断是否存在
        if(!StringUtils.isEmpty(shopFromRedis)){
            //3.redis存在此商铺,返回结果
            Shop shop = JSONUtil.toBean(shopFromRedis, Shop.class);
            return Result.ok(shop);
        }
        //4.不存在,到数据库中去查询
        Shop shop = getById(id);
        //5.数据库不存在,返回错误
        if(shop == null){
            return Result.fail("店铺不存在");
        }
        //6.数据库存在,写入redis
        stringRedisTemplate.opsForValue().set(key,JSONUtil.toJsonStr(shop),RedisConstants.CACHE_SHOP_TTL, TimeUnit.MINUTES);
        //7.返回结果
        return Result.ok(shop);
    }

三、缓存更新策略

1.三种缓存更新策略

        缓存更新策略主要有:内存淘汰超时剔除主动更新这三种。

1.内存淘汰:

        简单来说就是Redis根据其内存大小,其淘汰策略(如:键值对的访问频率)等,对键值对进行淘汰。 可以对redis进行配置(如:设置redis内存大小),来控制其内存淘汰。这种方法一般由redis自主控制,因此其一致性也比较差。

2.超时剔除:

        简单来说,就是在向redis存入键值对的时候,为这个键值对赋予一个TTL(超时时间),如果超过这个时间,redis就会将这个键值对进行删除。其一致性相较于内存淘汰策略会好一些。

3.主动更新:

        也就是在修改数据库的时候对缓存也进行修改。这种方法一致性相较于前两种会好很多,但是需要由程序员自主编码进行控制,会复杂一些。

        一般使用主动更新策略为主,结合超时剔除作为兜底,来实现缓存的更新

2.主动更新详解

2.1.三种主动更新策略

(1)Cache Aside Pattern:

        由缓存的调用者,在更新数据库的同时更新缓存

(2)Read/Write Through Pattern:

        缓存与数据库整合为一个服务,由服务维护一致性,调用者调用该服务,无需关心缓存一致性问题。但这种方式较为复杂,市面上提供这种服务的框架较少。

(3)Wri