当前位置: 首页 > 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", "…...

浏览器访问 AWS ECS 上部署的 Docker 容器(监听 80 端口)

✅ 一、ECS 服务配置 Dockerfile 确保监听 80 端口 EXPOSE 80 CMD ["nginx", "-g", "daemon off;"]或 EXPOSE 80 CMD ["python3", "-m", "http.server", "80"]任务定义&#xff08;Task Definition&…...

Vim 调用外部命令学习笔记

Vim 外部命令集成完全指南 文章目录 Vim 外部命令集成完全指南核心概念理解命令语法解析语法对比 常用外部命令详解文本排序与去重文本筛选与搜索高级 grep 搜索技巧文本替换与编辑字符处理高级文本处理编程语言处理其他实用命令 范围操作示例指定行范围处理复合命令示例 实用技…...

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…...

云计算——弹性云计算器(ECS)

弹性云服务器&#xff1a;ECS 概述 云计算重构了ICT系统&#xff0c;云计算平台厂商推出使得厂家能够主要关注应用管理而非平台管理的云平台&#xff0c;包含如下主要概念。 ECS&#xff08;Elastic Cloud Server&#xff09;&#xff1a;即弹性云服务器&#xff0c;是云计算…...

FastAPI 教程:从入门到实践

FastAPI 是一个现代、快速&#xff08;高性能&#xff09;的 Web 框架&#xff0c;用于构建 API&#xff0c;支持 Python 3.6。它基于标准 Python 类型提示&#xff0c;易于学习且功能强大。以下是一个完整的 FastAPI 入门教程&#xff0c;涵盖从环境搭建到创建并运行一个简单的…...

dedecms 织梦自定义表单留言增加ajax验证码功能

增加ajax功能模块&#xff0c;用户不点击提交按钮&#xff0c;只要输入框失去焦点&#xff0c;就会提前提示验证码是否正确。 一&#xff0c;模板上增加验证码 <input name"vdcode"id"vdcode" placeholder"请输入验证码" type"text&quo…...

家政维修平台实战20:权限设计

目录 1 获取工人信息2 搭建工人入口3 权限判断总结 目前我们已经搭建好了基础的用户体系&#xff0c;主要是分成几个表&#xff0c;用户表我们是记录用户的基础信息&#xff0c;包括手机、昵称、头像。而工人和员工各有各的表。那么就有一个问题&#xff0c;不同的角色&#xf…...

VTK如何让部分单位不可见

最近遇到一个需求&#xff0c;需要让一个vtkDataSet中的部分单元不可见&#xff0c;查阅了一些资料大概有以下几种方式 1.通过颜色映射表来进行&#xff0c;是最正规的做法 vtkNew<vtkLookupTable> lut; //值为0不显示&#xff0c;主要是最后一个参数&#xff0c;透明度…...

【Web 进阶篇】优雅的接口设计:统一响应、全局异常处理与参数校验

系列回顾&#xff1a; 在上一篇中&#xff0c;我们成功地为应用集成了数据库&#xff0c;并使用 Spring Data JPA 实现了基本的 CRUD API。我们的应用现在能“记忆”数据了&#xff01;但是&#xff0c;如果你仔细审视那些 API&#xff0c;会发现它们还很“粗糙”&#xff1a;有…...

多种风格导航菜单 HTML 实现(附源码)

下面我将为您展示 6 种不同风格的导航菜单实现&#xff0c;每种都包含完整 HTML、CSS 和 JavaScript 代码。 1. 简约水平导航栏 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport&qu…...