IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> 【redis】缓存与分布式锁 -> 正文阅读

[大数据]【redis】缓存与分布式锁

缓存

哪些数据适合放入缓存?

  • 即时性,数据一致性要求不高的
  • 访问量大,且更新频率不高的数据(读多写少)

请添加图片描述

整合redis

  1. 引入data-redis-starter
  2. 简单配置redis的host信息
  3. 使用SpringBoot自动配置好的StringRedisTemplate来操作redis

堆外内存溢出异常

原因spring boot 2.0以后 默认使用lettuce作为操作redis的客户端。它使用netty进行网络通信
lettuce的bug导致堆外内存溢出 -Xmx300m 如果netty没有指定堆外内存大小,默认使用-Xmx300m ,可以通过-Dio.netty.maxDirectMemory 进行设置
解决方案:不能使用-Dio.netty.maxDirectMemory只去调大堆外内存

  1. 升级lettuce客户端
  2. 或切换使用jedis

问题

高并发下缓存失效问题-缓存穿透

指查询一个一定不存在的数据,由于缓存是不命中的,将去查询数据库,但是数据库也无次记录,我们没有将这次查询的null写入缓存,这将导致这个不存在的数据每次请求都要到存储层去查询,失去了缓存的意义
在这里插入图片描述
风险
利用不存在的数据进行攻击,数据库瞬时压力增大,最终导致崩溃
解决
null结果缓存,并加入短暂过期时间

高并发下缓存失效问题-缓存雪崩

缓存雪崩是指在我们设置缓存时key采用了相同的过期时间,导致缓存在某一时刻同时失效,请求全部转发到DB,DB瞬间压力过重雪崩
在这里插入图片描述
解决
在原有的失效时间基础上增加一个随机值,比如1-5分钟随机,这样每个缓存的过期时间的重复率就会降低就很难引发集体失效的事件

高并发下缓存失效问题-缓存击穿

对于一些设置了过期事件的key,如果这些key可能会在某些时间点被超高并发的访问,是一种非常"热点"的数据,
如果这个key在大量强强同时进来前刚好失效,那么对这个key的数据查询都将落到db上,我们称为缓存击穿
在这里插入图片描述
解决
加锁
大量并发只让一个人去查,其他人等待,查到以后释放锁,其他人获取到锁,先查缓存,就会有数据,不会去DB

本地锁

只要是同一把锁,就能锁住需要这个锁的所有线程,

  1. synchronized(this): SpringBoot 所有的组件在容器中都是单例的,this这个service也是单例的
    本地锁只能锁住当前进程,所以我们需要分布式锁

分布式锁

在这里插入图片描述
实现原理:
redis setnx(“lock”,1111) 能放进去所有占到坑了,占到坑返回ok就执行业务,占不到坑就自旋等待
一百个并发进来,缓存中没有数据,要去调数据库,多个服务先一起去redis抢坑,抢到的那个服务的那个线程去查数据库,然后给缓存放东西,剩下99个“排队”拿到redis的坑,然后发现缓存又有了,直接返回。
后面的数据再过来,缓存有东西就不会再去找redis占坑
在这里插入图片描述
问题:
setnx占好坑位了, 但是查数据库的时候出现异常或者程序宕机,没有执行删除锁的逻辑,这就造成了死锁
解决
设置锁的自动过期时间,即使没有删除,也会自动删除。
问题:
【设置过期时间的时候服务器断电了,还是死锁】
解决
所以占坑和设置过期时间,必须是一个原子命令
获取锁同时设置过期时间命令: setnxex(“lock”,111,10s)
问题:
【如果业务时间长,锁自己过期了,然后我们又删除锁,这可能把别人持有的锁删除了】
解决
占锁的时候,值指定为uuid,每个人匹配的是自己的锁才删除
在这里插入图片描述

问题:
【删除锁的时候查询到了是自己的锁,准备删的时候,自己锁过期了,别人拿到了锁】
解决
查询和删除这也必须是一个原子操作,不能分为两步
使用 lua 脚本删锁

String script = "if redis.call('get', KEYS[1]) == ARGV[1] then return redis.call('del', KEYS[1]) else return 0 end";
redisTemplate.execute(new DefaultRedisScript<Long>(script, Long.class), Collections.singletonList("lock"), uuid);

总结

保证加锁【占位+过期时间】 和 删除锁【判断+删除】的原子性
更复杂的锁自动续期, 这个可以把锁过期时间设长点

    /**
     * 分布式锁
     * @return
     */
    public Map<String, List<Catalog2Vo>> getCatalogJsonRedisLockFromDB() {
        //1.占分布式锁,去redis占坑
        String uuid = UUID.randomUUID().toString();
        Boolean lock = redisTemplate.opsForValue().setIfAbsent("lock", uuid, 300, TimeUnit.SECONDS);
        if (lock){
            System.out.println(" 获取分布式锁成功!");
            Map<String, List<Catalog2Vo>> dataFromDb;
            try {
                dataFromDb = getCatalogJsonFromDB();
            }finally {
                //删除锁
                String script = "if redis.call('get', KEYS[1]) == ARGV[1] then return redis.call('del', KEYS[1]) else return 0 end";
                Long lock1 = redisTemplate.execute(new DefaultRedisScript<Long>(script, Long.class), Collections.singletonList("lock"), uuid);
            }

            return dataFromDb;
        }else {
            //加锁失败..重试
            System.out.println("获取分布式锁失败,等待重试");
            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            return getCatalogJsonRedisLockFromDB();
        }
    }

如何保证redis和mysql双写一致性

  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2021-11-26 08:55:06  更:2021-11-26 08:55:54 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 7:32:24-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码