.net core WebApi使用Redis教程(三)Redis缓存应用缓存穿透概念及解决办法
小白浏览:4602024-01-09 21:27:32本文累计收益:0我也要赚钱

本文讲解Redis在应用缓存领域的使用方法,实例代码基于 .net core WebApi进行实现。实例代码下载链接:http://www.80cxy.com/Blog/ResourceView?arId=202401110950583321kEqrCT 

一、缓存穿透定义

缓存穿透是指客户端请求的数据在缓存和数据库都不存在,这样缓存永远不会生效,这些请求都会到达数据库,造成后端负载增加。如用户通过ID获取商铺基本信息时,每次获取提交的商铺Id都是用户恶意篡改的,数据库中并不存在,这样缓存里面没有,再到数据库里面获取,每次提交的请求都会到达数据库,发生缓存穿透问题。

解决缓存穿透两种方案:

(一)缓存空对象

优点:实现简单,维护方便。

缺点:额外的内存消耗,可能造成短期的不一致,比如TTL有效期内,实际增加了一条数据,数据ID与缓存空对象的ID一致。

(二)布隆过滤

内存占用较少,没有多余key。实现复杂,存在误判可能,有一定的穿透可能性。

二、缓存穿透问题解决方法
(一)缓存穿透解决代码逻辑流程图

(二)获取商铺基本信息缓存穿透解决代码
        public async Task<ResponseContent> GetShopById(string id)
        {
            ResponseContent response = new ResponseContent();
            Shop shop = null;
            //1.从Redis缓存查询商品
            string shopJson = cacheService.Get(RedisConstants.CACHE_SHOP_KEY + id);
            //2.判断缓存是否存在
            if (!string.IsNullOrEmpty(shopJson))
            {
                //3.存在且不为空值直接返回
                shop = JsonConvert.DeserializeObject<Shop>(shopJson);
                return response.Ok(new { shop });
            }
            //判断命中的是否是空值(缓存穿透存入的空值)
            if (shopJson!=null) {
                //返回错误信息
                return response.Error(ResponseType.NoPermissions);
            }
            //4.不存在,根据Id查询数据库
            shop = await redisRepostory.GetShopById(id);
            //5.不存在,返回错误
            if (shop == null)
            {
                //将空值写入Redis(解决缓存穿透)
                cacheService.Add(RedisConstants.CACHE_SHOP_KEY + id, "", RedisConstants.CACHE_NULL_TTL);
                //返回错误信息
                return response.Error(ResponseType.ParameterVerificationError);
            }
            //6.存在写入Redis,并设置缓存超时时间
            cacheService.Add(RedisConstants.CACHE_SHOP_KEY + id, JsonConvert.SerializeObject(shop), RedisConstants.CACHE_SHOP_TTL);
            //7.返回
            return response.Ok(shop);
        }

 

评论列表
发表评论
+ 关注