首页 > 数据库 >为什么要使用分布式锁(通过redis实现)

为什么要使用分布式锁(通过redis实现)

时间:2023-05-02 14:33:27浏览次数:32  
标签:为什么 缓存 lock 数据库 redis redisson 分布式

如果需要使用到缓存机制,那就存在着这三个问题:
* 1、缓存穿透问题:(全部访问redis中不存在的信息),解决方式:在redis中将数据库中没有的数据暂时赋值为null
* 2、缓存雪崩问题:(redis中的key在同一时间大幅度的过期),解决方式:在redis中存入数据的时候,传入一个随机值作为存活时间
* 3、缓存击穿问题:(在大量请求访问一个高频词汇的时候,这个信息突然过期了),解决方式:通过在数据库查询的时候添加分布式锁可以解决
 
 
在这里我们重点谈一下缓存击穿问题,他的解决方案就是使用分布式锁。
 
再出现缓存击穿问题的时候,redis中存放的缓存突然过期了,如果不使用任何机制的话,就会导致大量请求去访问数据库,从而使得数据库压力骤然增大,甚至导致宕机。
如图所示:

 
如果我们使用分布式锁,就会形成以下效果:

 
 
由此可以看出,使用分布式锁可以大量减少访问数据库的次数,降低数据库的压力。
 
 
分布式锁的机制:
就是在redis中设置一个锁(一对键值对),只有在当前线程获取到锁的时候才会执行访问数据库的操作,在执行完相应的查询操作之后,需要将锁进行释放,在设置锁和释放锁的时候需要原子性问题,可通过lua脚本进行实现。

 
 
 
通过redisson实现分布式锁:
代码如下:
引入依赖

<dependency>
    <groupId>org.redisson</groupId>
    <artifactId>redisson</artifactId>
    <version>3.15.5</version>
</dependency>
    public String test() {
        //创建一个锁的对象,锁与锁之间的区分就在于所得名字
        RLock lock = redisson.getLock("lockName");
        String result="";
        try {
            //进行一些操作(例如查询数据库中的信息)
            //进行加锁操作,这是一个阻塞等待的方式,只有获取到锁之后,才会继续往下执行
            lock.lock();//在加完锁之后,会自动自旋去去获取锁,当获取到锁之后,继续往下执行
            result = doSomeFromDB();
        } finally {
            //通过lock进行解锁操作
            lock.unlock();
        }
        return result;
    }

标签:为什么,缓存,lock,数据库,redis,redisson,分布式
From: https://www.cnblogs.com/just1t/p/17367656.html

相关文章

  • Redis 是在CentOS 5.7上学习入门文章起步
    Redis是在CentOS5.7上学习入门文章起步  Rdis和JQuery一样是纯粹为应用而产生的,这里记录:1.Redis简介Redis是一个key-value存储系统。和Memcached类似,但是解决了断电后数据完全丢失的情况,而且她支持更多无化的value类型,除了和string外,还支持lists(链表)、sets(集合)和zsets(有......
  • stack为什么叫做2-sheaf
    设\(\mathcal{C}\)是一个site,我们知道\(\mathcal{C}\)上的sheaf定义为满足下列条件的presheaf\(F\):对于任意sieve\(R\hookrightarrowX\),典范映射\[\mathrm{Hom}(X,F)\to\mathrm{Hom}(R,F)\]是双射.其中右侧的Hom集合定义为presheaf范畴中的Hom,即\(\mathrm{PSh}(\mathcal{C......
  • ubuntu20安装docker、redis、mysql及部署net6应用
    一、更新系统软件包索引sudoaptupdate二、安装dockersudoaptinstalldocker.io三、在docker中安装Mysql拉取mysql镜像dockerpullmysql:latest查看镜像dockerpullmysql:latest运行容器dockerrun-itd-p3306:3306-eMYSQL_RO......
  • 一天吃透Redis面试八股文
    Redis连环40问,绝对够全!Redis是什么?Redis(RemoteDictionaryServer)是一个使用C语言编写的,高性能非关系型的键值对数据库。与传统数据库不同的是,Redis的数据是存在内存中的,所以读写速度非常快,被广泛应用于缓存方向。Redis可以将数据写入磁盘中,保证了数据的安全不丢失,而且Redis......
  • linux下安装redis
    1.安装gccyuminstall-ygcc-c++2.下载安装包https://download.redis.io/releases/redis-6.2.0.tar.gz3.解压tar-zxvfredis-6.2.0.tar.gz4.编译安装cdredis-6.2.0make##/home/redis为安装目录##makeinstallPREFIX=/home/redis5.拷贝配置文件并授权mkdir-......
  • 从CPU的视角看 多线程代码为什么那么难写!
      当我们提到多线程、并发的时候,我们就会回想起各种诡异的bug,比如各种线程安全问题甚至是应用崩溃,而且这些诡异的bug还很难复现。我们不禁发出了灵魂拷问“为什么代码测试环境运行好好的,一上线就不行了?”。为了解决线程安全的问题,我们的先辈们在编程语言中引入了各种各样新名......
  • Dockers下php容器中安装redis扩展
    首先进入php容器dockerexec-it容器ID或名称查看php安装位置  whichphp查看php已安装扩展  php-m1、下载redis扩展包   redis扩展下载地址【https://pecl.php.net/package/redis 】下载相应版本的扩展2、解压扩展包   tar-zxvfredis-5.1.1.tg......
  • CentOs7:如何安装jdk、mysql、redis、gti、maven?
       一、JDK使用压缩包安装,jdk-8u361-linux-x64.tar.gz。//1、解压tar-zvxf....tar.gz//2、配置环境变量vim/etc/profile//新增内容JAVA_HOME=/soft/jdk1.8.0_361PATH=$JAVA_HOME/bin:$PATH//3、重新加载文件profilesource/etc/profile//4、测试ja......
  • 分布式任务调度
     1、什么是任务调度? 我们可以先思考一下下面业务场景的解决方案:某电商系统需要在每天上午10点,下午3点,晚上8点发放一批优惠券。某银行系统需要在信用卡到期还款日的前三天进行短信提醒。某财务系统需要在每天凌晨0:10结算前一天的财务数据,统计汇总。12306会根......
  • 为什么 Go for-range 的 value 值地址每次都一样?
    原文链接:为什么Gofor-range的value值地址每次都一样?循环语句是一种常用的控制结构,在Go语言中,除了for关键字以外,还有一个range关键字,可以使用for-range循环迭代数组、切片、字符串、map和channel这些数据类型。但是在使用for-range循环迭代数组和切片的时候,......