百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术教程 > 正文

Redis 应用实践:读写锁进行性能优化

mhr18 2025-03-24 18:13 14 浏览 0 评论

锁优化-读写锁

public Product getProductByReadWriteLock(Long productId) {
        String redisId = SystemConstants.REDIS_KEY_PREFIX + productId;
        // 1. 先查redis缓存
        Product product = getProductFromRedis(redisId);
        if (product != null) {
            return product;
        }
        // 加写锁
        ReadWriteLock readWriteLock = redisson.getReadWriteLock(SystemConstants.LOCK_HOT_UPDATE_PREFIX + productId);
        Lock writeLock = readWriteLock.writeLock();
        writeLock.lock();

        // 2. DCL再查redis,因为只要有一次查询数据库操作,redis就已经有缓存数据了
        Product productMysql;
        try {
            product = getProductFromRedis(redisId);
            if (product != null) {
                return product;
            }
            // 3. 加读锁 读数据库
            ReadWriteLock readWriteLock2 = redisson.getReadWriteLock(SystemConstants.LOCK_HOT_UPDATE_PREFIX + productId);
            Lock readLock = readWriteLock2.readLock();
            readLock.lock();
            productMysql = getProductFromMysql(productId);
            readLock.unlock();
        } finally {
            writeLock.unlock();
        }
        return productMysql;
    }  

这是一段 Java 代码,主函数为 "getProductByReadWriteLock",该函数接收一个名为 productId 的参数,用于在 Redis 数据库和 MySQL 数据库中获取 Product 对象。

当函数被调用时,首先会根据 productId 生成一个唯一的 Redis 键值,然后尝试在 Redis 缓存中获取 Product 对象。如果 Redis 缓存中存在 Product 对象,那么函数会直接返回这个对象。

如果在 Redis 缓存中找不到该 Product 对象,那么函数会使用 Redisson 库获取另一个唯一的 Redis 键值对应的写锁。写锁在这里用于保护即将进行的可能会改变数据状态的操作,确保这些操作是原子性执行的。

获取到写锁后,函数将再次尝试从 Redis 缓存中获取 Product 对象。这是因为在获取写锁的过程中,可能已经有其他的线程获取到该 Product 对象并已经更新到了 Redis 缓存中。如果此时能在 Redis 缓存中找到 Product 对象,那么函数将直直接返回这个对象,并释放已经获取的写锁。

如果在 Redis 缓存中仍然找不到 Product 对象,那么函数将使用 Redisson 库获取相同的 Redis 键值对应的读锁。读锁在这里主要用于保护即将从 MySQL 数据库中读取的 Product 数据,确保在读取数据的过程中,MySQL 数据库中的这个 Product 数据不会被其他函数写入或修改。

当获取到读锁后,函数将从 MySQL 数据库中根据 productId 读取 Product 对象,然后释放读锁,并返回从 MySQL 数据库中获取的 Product 对象。

不论在执行过程中遇到怎样的情况,函数在最后都会确保释放已经获取的锁,防止发生死锁的情况。

通过使用 Redisson 库实现的读写锁,可以优化数据在高并发环境下的读写操作,提高系统的读写效率,从而提高系统的整体性能。

优点:

  1. 并发性:使用读写锁,当读操作的数量大于写操作时,可以大大提高系统的并发能力。
  2. 缓存一致性:通过在读取数据库之前先获取写锁再进行二次Redis检查,可以保证缓存和数据库之间的数据一致性。
  3. 避免死锁:代码中正确地在finally块中释放了锁,能有效地防止因异常情况而导致的死锁。

缺点:

  1. 对锁管理的依赖性较高:如果Redis缓存或Redisson锁服务无法正常工作,会直接影响到系统的正常运行。
  2. 锁粒度较大: 在这个例子中,读写锁的粒度是以整个产品对象为单位,在高并发的场景下,如果对同一productId的请求非常频繁,可能会导致其他请求需要等待释放锁而造成性能瓶颈。
  3. 可能会引发其他问题:使用读写锁可能会引发其他问题,比如惊群现象,在写锁释放后,大量读请求同时唤醒来争抢锁,导致过大的CPU使用率。

相关推荐

Java培训机构,你选对了吗?(java培训机构官网)

如今IT行业发展迅速,不仅是大学生,甚至有些在职的员工都想学习java开发,需求量的扩大,薪资必定增长,这也是更多人选择java开发的主要原因。不过对于没有基础的学员来说,java技术不是一两天就能...

产品经理MacBook软件清单-20个实用软件

三年前开始使用MacBookPro,从此再也不想用Windows电脑了,作为生产工具,MacBook可以说是非常胜任。作为产品经理,值得拥有一台MacBook。MacBook是工作平台,要发挥更大作...

RAD Studio(Delphi) 本月隆重推出新的版本12.3

#在头条记录我的2025#自2024年9月,推出Delphi12.2版本后,本月隆重推出新的版本12.3,RADStudio12.3,包含了Delphi12.3和C++builder12.3最...

图解Java垃圾回收机制,写得非常好

什么是自动垃圾回收?自动垃圾回收是一种在堆内存中找出哪些对象在被使用,还有哪些对象没被使用,并且将后者删掉的机制。所谓使用中的对象(已引用对象),指的是程序中有指针指向的对象;而未使用中的对象(未引用...

Centos7 初始化硬盘分区、挂载(针对2T以上)添加磁盘到卷

1、通过命令fdisk-l查看硬盘信息:#fdisk-l,发现硬盘为/dev/sdb大小4T。2、如果此硬盘以前有过分区,则先对磁盘格式化。命令:mkfs.文件系统格式-f/dev/sdb...

半虚拟化如何提高服务器性能(虚拟化 半虚拟化)

半虚拟化是一种重新编译客户机操作系统(OS)将其安装在虚拟机(VM)上的一种虚拟化类型,并在主机操作系统(OS)运行的管理程序上运行。与传统的完全虚拟化相比,半虚拟化可以减少开销,并提高系统性能。虚...

HashMap底层实现原理以及线程安全实现

HashMap底层实现原理数据结构:HashMap的底层实现原理主要依赖于数组+链表+红黑树的结构。1、数组:HashMap最底层是一个数组,称为table,它存放着键值对。2、链...

long和double类型操作的非原子性探究

前言“深入java虚拟机”中提到,int等不大于32位的基本类型的操作都是原子操作,但是某些jvm对long和double类型的操作并不是原子操作,这样就会造成错误数据的出现。其实这里的某些jvm是指...

数据库DELETE 语句,还保存原有的磁盘空间

MySQL和Oracle的DELETE语句与数据存储MySQL的DELETE操作当你在MySQL中执行DELETE语句时:逻辑删除:数据从表中标记为删除,不再可见于查询结果物理...

线程池—ThreadPoolExecutor详解(线程池实战)

一、ThreadPoolExecutor简介在juc-executors框架概述的章节中,我们已经简要介绍过ThreadPoolExecutor了,通过Executors工厂,用户可以创建自己需要的执...

navicat如何使用orcale(详细步骤)

前言:看过我昨天文章的同鞋都知道最近接手另一个国企项目,数据库用的是orcale。实话实说,也有快三年没用过orcale数据库了。这期间问题不断,因为orcale日渐消沉,网上资料也是真真假假,难辨虚...

你的程序是不是慢吞吞?GraalVM来帮你飞起来性能提升秘籍大公开

各位IT圈内外的朋友们,大家好!我是你们的老朋友,头条上的IT技术博主。不知道你们有没有这样的经历:打开一个软件,半天没反应;点开一个网站,图片刷不出来;或者玩个游戏,卡顿得想砸电脑?是不是特别上火?...

大数据正当时,理解这几个术语很重要

目前,大数据的流行程度远超于我们的想象,无论是在云计算、物联网还是在人工智能领域都离不开大数据的支撑。那么大数据领域里有哪些基本概念或技术术语呢?今天我们就来聊聊那些避不开的大数据技术术语,梳理并...

秒懂列式数据库和行式数据库(列式数据库的特点)

行式数据库(Row-Based)数据按行存储,常见的行式数据库有Mysql,DB2,Oracle,Sql-server等;列数据库(Column-Based)数据存储方式按列存储,常见的列数据库有Hb...

AMD发布ROCm 6.4更新:带来了多项底层改进,但仍不支持RDNA 4

AMD宣布,对ROCm软件栈进行了更新,推出了新的迭代版本ROCm6.4。这一新版本里,AMD带来了多项底层改进,包括更新改进了ROCm的用户空间库和AMDKFD内核驱动程序之间的兼容性,使其更容易...

取消回复欢迎 发表评论: