(Redis)缓存处理的几个问题

目录

目录

问题一: 缓存穿透

问题二: 缓存击穿

问题三: 缓存雪崩

测试代码


问题一: 缓存穿透

说明: 利用redis与mysql数据库的机制(redis中一旦不存在查询的ksy, 就访问mysql), 直接绕过缓存, 访问myslq, 而制造db的请求压力;

解决: 将从mysql请求出的空存入redis一定时间;

问题二: 缓存击穿

说明: 某一热点key在高并发访问的情况下, 突然失效, 导致大量的并发直接访问mysql数据库的情况;

解决1: 使用redis的分布式suo解决mysql的访问压力问题;

问题三: 缓存雪崩

说明: 缓存时大量的key采用了相同的过期时间, 导致缓存存在某一时刻同时失效, 导致大量访问db, db崩溃;

解决: 设置不同的失效时间;

测试代码

 @Override
    public PmsSkuInfo getSkuById(String skuId) {

        PmsSkuInfo pmsSkuInfo = new PmsSkuInfo();
        //1.連接緩存
        Jedis jedis = redisUtil.getJedis();
        System.out.println("jedis:"+jedis);
        //2.查看緩存
        String skuKey = "sku:"+skuId + ":info";
        String skuJson = jedis.get(skuKey);
        //3.如果緩存中沒有, 則查看mysql中(緩存穿透, 雪崩)
        if (StringUtil.isBlank(skuJson)){
            SetParams params = new SetParams().nx().px(10000);
            String OK = jedis.set("sku:"+skuId+":lock","1",params);
            System.out.println("nx加锁");
            if (StringUtil.isBlank(OK) && OK.equals("OK")){
                System.out.println("从mysql中获取数据");
                pmsSkuInfo = this.getSkuByIdFromDB(skuId);
                //4.mysql查詢數據保存在redis中
                if (pmsSkuInfo != null){
                    String json = JSON.toJSONString(pmsSkuInfo);
                    jedis.set(skuKey, json);
                    System.out.println("保存到redis");
                }else{
                    //防止穿透
                    jedis.setex(skuKey,60*3,JSON.toJSONString(""));
                }
                //从数据库获取到数据之后,接触锁
                jedis.decr("sku:"+skuId+":lock");

            }else{
                System.out.println("自旋:"+skuId);
                //自旋
                try {
                    Thread.sleep(3000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                return getSkuById(skuId);
            }


        }else{
            pmsSkuInfo = JSON.parseObject(skuJson, PmsSkuInfo.class);
            System.out.println("从redis获取数据");
        }
        jedis.close();
        return pmsSkuInfo;
    }

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值