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

单体应用提高性能和处理高并发-使用缓存

        要在单体应用中实现高并发,并利用缓存技术来提高性能,需要深入了解缓存的应用场景、选择合适的缓存工具,以及在具体代码中实现缓存策略。以下是详细说明如何在单体应用中使用缓存来处理高并发的内容,包括常见的缓存框架和实际的代码示例。

1. 缓存概述

        缓存的主要目的是减少对慢速资源(如数据库)的访问次数,从而加快数据访问速度。缓存可以存储计算结果、查询结果或任何可以重复使用的数据,以降低系统的响应时间和负载。

2. 内存缓存 vs 分布式缓存

  • 内存缓存:适用于单个应用实例中的缓存需求,例如Ehcache、Caffeine等。
  • 分布式缓存:适用于多个应用实例中的缓存需求,例如Redis、Memcached等。

3. 使用内存缓存

Ehcache 示例

        Ehcache 是一个强大的Java缓存框架,适合用于单体应用中缓存数据。以下是如何在Java单体应用中使用Ehcache的详细步骤:

        1. 配置 Ehcache

        创建一个Ehcache配置文件 ehcache.xml

<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.ehcache.org/v3/ecache.xsd"xmlns="http://www.ehcache.org/v3"><cache alias="exampleCache"><key-type>java.lang.String</key-type><value-type>java.lang.String</value-type><heap unit="entries">1000</heap><expiry><ttl unit="seconds">60</ttl></expiry></cache>
</ehcache>

        2. 使用 Ehcache

        在应用中使用Ehcache进行缓存操作:

import org.ehcache.Cache;
import org.ehcache.CacheManager;
import org.ehcache.config.builders.CacheConfigurationBuilder;
import org.ehcache.config.builders.CacheManagerBuilder;
import org.ehcache.config.builders.ResourcePoolsBuilder;
import org.ehcache.config.builders.CacheConfigurationBuilder;
import org.ehcache.config.builders.ResourcePoolsBuilder;public class EhcacheExample {public static void main(String[] args) {// 创建CacheManager实例CacheManager cacheManager = CacheManagerBuilder.newCacheManagerFromConfiguration(new File("ehcache.xml"));cacheManager.init();// 获取缓存Cache<String, String> cache = cacheManager.getCache("exampleCache", String.class, String.class);// 将数据放入缓存cache.put("key1", "value1");// 从缓存中获取数据String value = cache.get("key1");System.out.println("Cached value: " + value);// 关闭CacheManagercacheManager.close();}
}

4. 使用分布式缓存

Redis 示例

        Redis 是一个流行的分布式缓存系统,适合于需要跨多个实例共享缓存数据的场景。以下是如何在Java和Python单体应用中使用Redis的详细步骤:

        1.安装 Redis

        按照Redis官网的说明安装Redis,并启动Redis服务器。

        2.使用 Jedis 连接 Redis(Java)

import redis.clients.jedis.Jedis;public class RedisExample {public static void main(String[] args) {// 连接到本地的 Redis 服务Jedis jedis = new Jedis("localhost");// 设置缓存值jedis.set("key1", "value1");// 获取缓存值String value = jedis.get("key1");System.out.println("Cached value: " + value);// 关闭连接jedis.close();}
}

        3. 使用 Redis 缓存数据(Python)

import redis# 连接到本地的 Redis 服务
r = redis.Redis(host='localhost', port=6379, db=0)# 设置缓存值
r.set('key1', 'value1')# 获取缓存值
value = r.get('key1').decode('utf-8')
print("Cached value:", value)

 

5. 缓存策略

在缓存中,可以应用不同的策略来管理缓存数据:

        1.过期策略:设置缓存数据的有效期,数据在过期后自动被移除。可以通过时间来设定,例如TTL(Time-To-Live)。

        2.淘汰策略:当缓存达到最大容量时,使用淘汰策略来移除旧数据。常见策略包括LRU(Least Recently Used)和LFU(Least Frequently Used)。

        示例:设置 Redis 过期时间

// 设置带过期时间的缓存值
jedis.setex("key1", 60, "value1"); // key1的缓存值会在60秒后过期

        示例:Ehcache 过期策略

<expiry><ttl unit="seconds">60</ttl> <!-- 设置缓存数据的过期时间为60秒 -->
</expiry>

6. 处理缓存穿透、缓存击穿和缓存雪崩

        1.缓存穿透:如果请求的数据不在缓存中也不在数据库中,可以使用布隆过滤器来避免缓存穿透。布隆过滤器可以用来检测数据是否存在于缓存中,从而减少对数据库的访问。

        2.缓存击穿:热点数据的缓存失效可能导致大量请求直接访问数据库。可以使用互斥锁来防止缓存失效时同时访问数据库。一个请求在更新缓存时,其它请求需要等待更新完成。

        示例:使用 Redis 实现互斥锁

boolean lockAcquired = jedis.setnx("lock:key1", "lock");
if (lockAcquired) {try {// 执行数据库查询操作// 更新缓存jedis.set("key1", "newValue");} finally {// 查询结束,释放锁jedis.del("lock:key1");}
} else {// 锁已存在,处理缓存击穿的情况
}

        3.缓存击穿:缓存雪崩发生在大量缓存同时失效的情况下,可以通过设置不同的过期时间来分散失效时间,避免同步失效带来的问题。

总结

        通过使用内存缓存(如Ehcache、Caffeine)和分布式缓存(如Redis、Memcached),可以显著提高单体应用的性能,处理高并发请求。合理选择缓存工具、应用适当的缓存策略、处理常见缓存问题,可以有效优化系统的响应时间和负载能力。

相关文章:

单体应用提高性能和处理高并发-使用缓存

要在单体应用中实现高并发&#xff0c;并利用缓存技术来提高性能&#xff0c;需要深入了解缓存的应用场景、选择合适的缓存工具&#xff0c;以及在具体代码中实现缓存策略。以下是详细说明如何在单体应用中使用缓存来处理高并发的内容&#xff0c;包括常见的缓存框架和实际的代…...

ollama教程——使用LangChain调用Ollama接口实现ReAct

ollama入门系列教程简介与目录 相关文章: Ollama教程——入门:开启本地大型语言模型开发之旅Ollama教程——模型:如何将模型高效导入到Ollama框架Ollama教程——兼容OpenAI API:高效利用兼容OpenAI的API进行AI项目开发Ollama教程——使用LangChain:Ollama与LangChain的强强…...

【Bug分析】Keil报错:error: #18:expected a “)“问题解决

【Bug分析】Keil报错&#xff1a;error: #18:expected a “&#xff09;”问题解决 前言bug查找bug解决方法小结 前言 keil编译时出现一个问题&#xff0c;缺少一个右括号。然后仔细查看代码&#xff0c;并没有括号缺失。 如下&#xff0c;代码括号正常。 bug查找 站内文章…...

MAC上设置快捷打开终端以及如何运用剪切快捷键

在Mac上设置一个快捷键&#xff0c;在当前文件夹中打开终端&#xff0c;你可以使用Automator创建一个服务&#xff0c;然后将其分配给一个快捷键。以下是步骤&#xff1a; 1. 创建Automator服务 打开 Automator&#xff08;你可以在应用程序文件夹中找到它&#xff0c;或使用…...

linux docker安装 gitlab后忘记root密码如何找回

1. docker ps - a 查看当前gitlab 当前的id2. docker exec -it gitlab /bin/bash 进入docker git 容器中【gitlab 注意可以上图中的name&#xff0c;也可以是id都可以的】,如下图3.gitlab-rails console -e production 输入该指令&#xff0c;启动Ruby on Rails控制台&…...

C语言典型例题27

《C程序设计教程&#xff08;第四版&#xff09;——谭浩强》 习题2.4 用下面的scanf函数输入数据 使a3,b7,x8.5,y71.8,c1A,c2a。问在键盘上怎么输入 代码 //《C程序设计教程&#xff08;第四版&#xff09;——谭浩强》 //习题2.4 用下面的scanf函数输入数据&#xff0c;使…...

clion开发stm32f4系列(一)————移植rt-thread os系统

前言 本次使用的rt-thread的版本为5.0.2基于rt-thread sudio生成的源码进行拷贝和修改工程基于上次创建工程的项目进行修改。本次工程只是用了serial和pin组件,其他后面用到再进行添加 拷贝rt-thread源码库 通过CMakeLists来进行管理 顶级(rt-thread目录) cmake_minimum_req…...

计算机网络(网络层)

网络层概述 网络层是干什么的&#xff1f; 网络层的主要任务是实现不同异构网络互连&#xff0c;进而实现数据包在各网络之间的传输相比于数据链路层的以太网通信&#xff0c;网络层则是将一个个数据链路层连接的以太网通过路由器连接起来。从而实现不同数据链路层的互联。 这…...

Python3 第六十六课 -- CGI编程

目录 一. 什么是 CGI 二. 网页浏览 三. CGI 架构图 四. Web服务器支持及配置 五. 第一个CGI程序 5.1. HTTP 头部 5.2. CGI 环境变量 六. GET和POST方法 6.1. 使用GET方法传输数据 6.1.1. 简单的url实例&#xff1a;GET方法 6.1.2. 简单的表单实例&#xff1a;GET方法…...

【Unity23种设计模式】之状态模式

首先创建一个项目 打开项目后复制至3个场景 命名为 创建一个空物体 命名为GameLoop 创建一个脚本GameLoop.cs 编写代码如下 将代码挂载至空物体GameLoop 将三个场景拖拽至Scenes In Build 分析下状态模式的类图 我们创新类图中的代码 编写ISceneState.cs 编写三个状态子类继承构…...

二叉树刷题,bfs刷题

有些题目&#xff0c;你按照拍脑袋的方式去做&#xff0c;可能发现需要在递归代码中调用其他递归函数计算字数的信息。一般来说&#xff0c;出现这种情况时你可以考虑用后序遍历的思维方式来优化算法&#xff0c;利用后序遍历传递子树的信息&#xff0c;避免过高的时间复杂度。…...

为什么要用分布式锁

单应用中,如果要确保多线程修改同一个资源的安全性 加synchronized就可以了 但是性能不高 而mybatis-plus的乐观锁就可以很好的解决这类问题 但是这样的锁机制,只在单应用中有效 试想,在分布式下,有没有可能出现多个应用中的线程同时去修改同一个数据资源的并发问题 例如A …...

python游戏开发之五子棋游戏制作

五子棋是一种源自中国的传统棋类游戏&#xff0c;起源可以追溯到古代。它是一种两人对弈的游戏&#xff0c;使用棋盘和棋子进行。棋盘通常是一个 1515 的网格&#xff0c;棋子分为黑白两色&#xff0c;双方轮流在棋盘上落子。游戏的目标是通过在棋盘上落子&#xff0c;使自己的…...

文件上传绕过最新版安全狗

本文来源无问社区&#xff0c;更多实战内容&#xff0c;渗透思路可前往查看http://www.wwlib.cn/index.php/artread/artid/9960.html http分块传输绕过 http分块传输⼀直是⼀个很经典的绕过⽅式&#xff0c;只是在近⼏年分块传输⼀直被卡的很死&#xff0c;很多waf都开始加 …...

常用API_2:应用程序编程接口:ArrayList

文章目录 ArrayList常用方法 案例 &#xff1a;上菜 ArrayList 常用方法 来自黑马程序员学习视频 案例 &#xff1a;上菜 待完善...

【Linux操作系统】进程的基本概念(PCB对象)详解

目录 一、进程的基本概念二、进程的描述组织&#xff08;PCB对象&#xff09;1.PCB的基本概念2.为什么要有PCB对象&#xff08;操作系统对进程的组织管理&#xff09;3.PCB对象的内部属性&#xff08;tast_struct结构体&#xff09; 三、查看进程1.ps指令2.top指令3.通过 /proc…...

曙光宁畅中科可控所有服务器机型出厂默认IPMI用户密码

机型 默认IP 用户名/密码 通用 SG机型 DHCP ​admin/admin 通用 KK机型 DHCP ​admin/admin ​ 通用 NC 机型 DHCP ​Admin/Admin5000 I420-G10、I620-G15、I650-G15、I840-GS、I840-G10、I840-G25、I980-G10、A420r-G、A620r-G、A840-G10、TC4600刀片、TC46…...

mysql查线上数据注意数据库的隔离级别

数据库的隔离级别定义了一个事务可能对其他并发事务的可见性&#xff0c;以及它们可能对数据库的影响。隔离级别的选择影响着并发性能和数据的一致性&#xff0c;不同的隔离级别能够防止不同程度的并发问题&#xff0c;如脏读&#xff08;Dirty Reads&#xff09;、不可重复读&…...

【专业解析】移动硬盘能识别却打不开:数据恢复实战指南

在数字化时代&#xff0c;移动硬盘作为我们存储重要数据的主要工具之一&#xff0c;其稳定性和安全性直接关系到信息的完整与便捷访问。然而&#xff0c;不少用户会遇到一个令人头疼的问题&#xff1a;移动硬盘能被电脑识别&#xff0c;但尝试打开时却遭遇失败&#xff0c;这往…...

系统 hap

sdk\toolchains\lib\UnsgnedReleasedProfileTemplate.json 各个权限需要的等级 OpenAtom OpenHarmony { "version-name":"2.0.0", "version-code":2, "app-distribution-type":"os_integration", "…...

BetterGenshinImpact多开功能终极指南:同时管理多个原神账号的完整方案

BetterGenshinImpact多开功能终极指南&#xff1a;同时管理多个原神账号的完整方案 【免费下载链接】better-genshin-impact &#x1f4e6;BetterGI 更好的原神 - 自动拾取 | 自动剧情 | 全自动钓鱼(AI) | 全自动七圣召唤 | 自动伐木 | 自动刷本 | 自动采集/挖矿/锄地 | 一条龙…...

从领域驱动到本体论:AI 时代的架构方法论变了必

从0构建WAV文件&#xff1a;读懂计算机文件的本质 虽然接触计算机有一段时间了&#xff0c;但是我的视野一直局限于一个较小的范围之内&#xff0c;往往只能看到于算法竞赛相关的内容&#xff0c;计算机各种文件在我看来十分复杂&#xff0c;认为构建他们并能达到目的是一件困难…...

二手硬盘避坑指南:用MHDD检测硬盘健康状态的5个关键指标(附真实案例)

二手硬盘避坑指南&#xff1a;用MHDD检测硬盘健康状态的5个关键指标&#xff08;附真实案例&#xff09; 在二手硬件交易市场&#xff0c;硬盘是最容易"踩雷"的品类之一。翻新盘、清零盘、扩容盘等造假手段层出不穷&#xff0c;普通消费者往往在数据丢失后才意识到问…...

2026届最火的五大降AI率助手实测分析

Ai论文网站排名&#xff08;开题报告、文献综述、降aigc率、降重综合对比&#xff09; TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 于内容创作范畴之中&#xff0c;将AI生成的痕迹予以降低&#xff0c;此即降AI率&#xff0c…...

Teamcenter许可证文件关键参数解析、性能调优与安全加固

Teamcenter许可证文件关键参数解析、性能调优和安全加固你是远非也老是被许可证问题搞得焦头烂额&#xff1f;是远非每次 从来担心有未曾漏掉什么&#xff1f;去年我在一个装备制造企业做项目时&#xff0c;客户团队都是许可证管理混乱闹的&#xff0c;光是误购及闲置就浪费了8…...

Zookeeper 选举机制解析

zk中有两种角色&#xff1a;Leader 和 FllowerLeader是集群各台电脑投票选举出来的。事务【非常重要】&#xff1a;一通操作&#xff0c;要么同时成立&#xff0c;要么都不成立。zookeeper:Leader&#xff1a;Zookeeper 集群工作的核心。1、事务请求&#xff08;写操作&#xf…...

Go 内存逃逸与逃逸分析

Go 内存逃逸与逃逸分析&#xff1a;高效内存管理的关键 在Go语言中&#xff0c;内存管理是性能优化的核心之一&#xff0c;而内存逃逸与逃逸分析则是理解其底层机制的重要概念。简单来说&#xff0c;内存逃逸是指本应在栈上分配的变量&#xff0c;由于某些原因被分配到了堆上&…...

告别嘈杂录音:用ClearerVoice-Studio一键清除背景噪音实战教程

告别嘈杂录音&#xff1a;用ClearerVoice-Studio一键清除背景噪音实战教程 1. 为什么你需要专业的语音降噪工具 在远程会议、线上课程、播客录制等场景中&#xff0c;背景噪音是影响语音质量的常见问题。传统音频编辑软件如Audacity虽然功能强大&#xff0c;但操作复杂&#…...

力扣热门100题之二叉树中的最大路径和

核心思路&#xff08;一句话&#xff09;对每个节点&#xff0c;计算它能向上提供的最大贡献&#xff1a;自身值 max(左贡献, 右贡献)以当前节点为转折点的路径和&#xff1a;自身值 左贡献 右贡献全局维护一个最大值&#xff0c;不断更新完整代码实现&#xff1a;/*** Defi…...

2025零碳园区建设方案【附全文阅读】

2025零碳园区建设方案聚焦能源转型、产业优化、技术创新,通过政策支持、试点示范、多元融资推进,需因地制宜制定具体方案[17]。 关联阅读索引: 收藏不迷路——零碳智慧园区数字化学习索引【持续更新】-CSDN博客https://blog.csdn.net/cdfunlove/article/details/159959732?…...