当前位置: 首页 > news >正文

Java并发编程中高效缓存设计的哲学

文章目录

    • 引言
    • 详解缓存的设计和演进
      • 基于缓存存储运算结果
      • 锁分段散列减小锁粒度
      • 异步化提升处理效率
      • 原子化避免重复运算
    • 小结
    • 参考

引言

本文将基于并发编程和算法中经典的哈希取模、锁分段、 异步化、原子化。这几个核心设计理念编写逐步推演出一个相对高效的缓存工具,希望对你有所启发。

我是 SharkChili ,Java 开发者,Java Guide 开源项目维护者。欢迎关注我的公众号:写代码的SharkChili,也欢迎您了解我的开源项目 mini-redis:https://github.com/shark-ctrl/mini-redis。

为方便与读者交流,现已创建读者群。关注上方公众号获取我的联系方式,添加时备注加群即可加入。

详解缓存的设计和演进

基于缓存存储运算结果

我们有一批数据需要通过运算才能获得结果,而每一次运算大约耗时是500ms,所以为了避免重复运算导致的等待,我们希望对应数据第一次运算的结果直接缓存到容器中,后续线程可直接通过容器获得结果:

在这里插入图片描述

于是我们就有了第一个版本,利用缓存避免非必要的重复计算,从而提升程序在单位时间内的吞吐量

public class ComputeCache {public final Map<Integer, Integer> cache = new HashMap<>();public synchronized int compute(int arg) {if (cache.containsKey(arg)) {//若存在直接返回结果return cache.get(arg);} else {//若不存在则计算后缓存并返回int result = doCompute(arg);cache.put(arg, result);return result;}}//模拟耗时的计算private int doCompute(int key) {ThreadUtil.sleep(500);return key << 1;}public synchronized int size() {return cache.size();}}

我们利用下面这段单元测试来验证缓存的性能和正确性,这里笔者也简单介绍一下几个比较核心的点:

  1. 声明本机CPU核心数+1的线程数执行并发运算
  2. 利用倒计时门闩控制线程并发流程起止,保证准确感知所有运算任务结束后,执行耗时统计
  3. 利用容器中最直观且容易检查出错误的属性size进行比对判断我们的缓存是否正确

最终在笔者的机器下5000并发的耗时大约是26765ms,整体还是不太符合我们的预期:

//初始化缓存工具<
http://www.lqws.cn/news/497323.html

相关文章:

  • 实验九:RIPv2协议配置与分析
  • MySQL 8.x配置MGR高可用+ProxySQL读写分离(二):ProxySQL配置MySQL代理及读写分离
  • CRC3校验算法
  • Stable Diffusion 项目实战落地:AI绘画与文案创作的魔法 第一篇 ——让你的小说推文秒变视觉与故事双料爆款!
  • 零基础学习RabbitMQ(2)--Linux安装RabbitMQ
  • github常用插件
  • 基于SpringBoot + Vue 的网上拍卖系统
  • 使用AI开发招聘网站(100天AI编程实验)
  • C++ 第二阶段:继承与多态 - 第二节:虚函数与虚函数表
  • DataWhale-零基础络网爬虫技术(三、爬虫进阶技术)
  • 短期项目与长期目标如何同时兼顾
  • SpringCloud系列(32)--使用Hystrix进行全局服务降级
  • 基于分布式部分可观测马尔可夫决策过程与联邦强化学习的低空经济智能协同决策框架
  • 基于协议转换的 PROFIBUS DP 与 ETHERNET/IP 在石化生产中的协同运行实践
  • SwiftUI学习笔记day4: Lecture 4 | Stanford CS193p 2023
  • Lnmp和XunRuiCMS一键部署(Rocky linux)
  • Spring Boot 集成 Apache Kafka 实战指南
  • WebRTC(八):SDP
  • Origin绘制三Y轴柱状图、点线图、柱状点线图
  • pyhton基础【15】函数进阶一
  • C++11 static_assert(基于Boost库)从入门到精通
  • MOS管损坏原因,封装失效、栅极失效、雪崩失效、过流和过压损坏
  • Spring Bean生命周期(基于spring-beans-6.2.6分析)
  • 酒店住宿自助入住系统——店铺自动运营—仙盟创梦IDE
  • 零基础学习RabbitMQ(1)--概述
  • iperf3使用方法
  • 无人驾驶汽车运动控制分为纵向控制和横向控制
  • DMDRS部署实施手册(ORACLE=》DM)
  • Spring Boot多数据源配置实战指南
  • Reactor模式与Proactor模式理解