Memcached 介绍与详解及在Java Spring Boot项目中的使用与集成
Memcached 介绍
Memcached 是一种高性能的分布式内存对象缓存系统,主要用于加速动态Web应用以减少数据库负载,从而提高访问速度和性能。作为一个开源项目,Memcached 被广泛应用于许多大型互联网公司,如Facebook、Twitter 和 YouTube 等。Memcached 通过将数据存储在内存中,并使用高效的哈希算法来进行数据存取,提供了极高的读写性能。
基本概念
Memcached 是一个基于内存的分布式缓存系统,它使用键值对(key-value)的方式存储数据。每个键(key)唯一标识一条数据,值(value)可以是任意类型的数据。Memcached 通过哈希函数将键映射到内存中的特定位置,从而实现快速的数据存取。在分布式环境中,Memcached 使用一致性哈希算法将数据分布到不同的缓存服务器上,以确保系统的高可用性和可扩展性。
主要特性
- 高性能:Memcached 通过将数据存储在内存中,提供了极高的读写性能。
- 分布式:支持水平扩展,可以轻松扩展到多个服务器,满足大规模分布式缓存需求。
- 简单易用:提供了简单的API,支持多种编程语言(如C、Python、Java、PHP等),便于开发者集成。
- 开放源码:作为一个开源项目,Memcached 的源代码可以自由获取和修改,便于定制和扩展。
工作原理
Memcached 的工作原理非常简单但高效。当应用需要访问某个数据时,首先检查Memcached中是否存在该数据,如果存在则直接返回,从而提高了数据的读取速度;如果不存在,则从数据库或其他存储系统中获取数据,并将该数据存储到Memcached中,以便下次访问时可以直接从缓存中获取。Memcached 还支持设置缓存项的过期时间,到期后缓存项会自动删除。
应用场景
Memcached 广泛应用于以下场景:
- Web缓存:在高流量网站中,缓存数据库查询结果、页面片段、会话数据等,显著提高响应速度,减轻数据库压力。
- 临时数据存储:用于存储一些临时性的数据,如验证码、临时会话信息等,避免频繁访问数据库。
- 分布式系统:在分布式系统中,Memcached 用作分布式缓存,提高数据访问速度和系统的可扩展性。
- API响应缓存:缓存API的响应结果,减少API服务器的负载,提高整体系统的吞吐量。
在Java Spring Boot项目中的使用与集成
准备工作
在开始之前,请确保你的开发环境已经配置好JDK 8及以上版本、Maven作为项目构建工具以及Spring Boot框架。同时,确保可以访问到Memcached服务器。
集成步骤
1. 添加Memcached依赖
首先,在你的Spring Boot项目的pom.xml文件中添加Memcached客户端的依赖。以下示例使用的是spymemcached客户端:
<dependency> <groupId>net.spy</groupId> <artifactId>spymemcached</artifactId> <version>2.12.0</version>
</dependency>
2. 配置Memcached连接
在application.properties或application.yml中添加Memcached的连接配置。例如,在application.properties中添加:
memcached.servers=localhost:11211
3. 创建配置类
创建一个配置类来配置Memcached客户端的连接工厂和操作模板。以下是一个简单的配置类示例:
package com.example.config; import net.spy.memcached.MemcachedClient;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.io.IOException;
import java.net.InetSocketAddress; @Configuration
public class MemcachedConfig { @Bean public MemcachedClient memcachedClient() throws IOException { return new MemcachedClient(new InetSocketAddress("localhost", 11211)); }
}
4. 使用Memcached操作数据
创建一个服务类来演示如何使用Memcached进行数据缓存操作。以下是一个简单的服务类示例:
package com.example.service; import com.example.config.MemcachedConfig;
import net.spy.memcached.MemcachedClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.concurrent.ExecutionException; @Service
public class CacheService { @Autowired private MemcachedClient memcachedClient; public void addToCache(String key, int expiration, Object value) throws ExecutionException, InterruptedException { memcachedClient.set(key, expiration, value); } public Object getFromCache(String key) throws ExecutionException, InterruptedException { return memcachedClient.get(key); } public void deleteFromCache(String key) { memcachedClient.delete(key); }
}
5. 在控制器或业务逻辑中使用
现在,你可以在你的控制器或业务逻辑中注入CacheService,并使用它来进行数据的缓存和检索操作。以下是一个简单的控制器示例:
package com.example.controller; import com.example.service.CacheService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController; import java.util.concurrent.ExecutionException; @RestController
@RequestMapping("/api/cache")
public class CacheController { @Autowired private CacheService cacheService; @GetMapping("/set") public String setCache(@RequestParam String key, @RequestParam String value, @RequestParam int expiration) { try { cacheService.addToCache(key, expiration, value); return "Cache set successfully!"; } catch (ExecutionException | InterruptedException e) { return "Error setting cache: " + e.getMessage(); } } @GetMapping("/get") public String getCache(@RequestParam String key) { try { Object value = cacheService.getFromCache(key); return "Cache value: " + (value != null ? value.toString() : "null"); } catch (ExecutionException | InterruptedException e) { return "Error getting cache: " + e.getMessage(); } } @GetMapping("/delete") public String deleteCache(@RequestParam String key) { cacheService.deleteFromCache(key); return "Cache deleted successfully!"; }
}
6. 测试
启动你的Spring Boot应用,并使用Postman、Curl或任何HTTP客户端工具来测试你的缓存API。例如,你可以通过发送GET请求到/api/cache/set来设置缓存,然后通过/api/cache/get来获取缓存的值,最后通过/api/cache/delete来删除缓存。
注意事项
- 确保Memcached服务器已经启动并可在配置的地址和端口上访问。
- 考虑到缓存的一致性和过期时间,确保你的应用逻辑能够正确处理缓存未命中(即缓存中不存在所需数据)的情况。
- 在生产环境中,你可能需要配置多个Memcached服务器以提供高可用性和负载均衡。此时,你可能需要使用更复杂的连接池或客户端库来管理多个连接。
- 考虑到内存限制,确保你的缓存策略不会导致Memcached服务器内存溢出。
通过以上步骤,你可以在Java Spring Boot项目中成功集成和使用Memcached作为缓存解决方案。
相关文章:
Memcached 介绍与详解及在Java Spring Boot项目中的使用与集成
Memcached 介绍 Memcached 是一种高性能的分布式内存对象缓存系统,主要用于加速动态Web应用以减少数据库负载,从而提高访问速度和性能。作为一个开源项目,Memcached 被广泛应用于许多大型互联网公司,如Facebook、Twitter 和 YouT…...
淮北在选择SCADA系统时,哪些因素会影响其稳定性?
关键字:LP-SCADA系统, 传感器可视化, 设备可视化, 独立SPC系统, 智能仪表系统,SPC可视化,独立SPC系统 在选择SCADA系统时,稳定性是一个关键因素,因为它直接影响到生产过程的连续性和安全性。以下是一些影响SCADA系统稳定性的因素: 硬件质量…...
Linux: 命令行参数和环境变量究竟是什么?
Linux: 命令行参数和环境变量究竟是什么? 一、命令行参数1.1 main函数参数意义1.2 命令行参数概念1.3 命令行参数实例 二、环境变量2.1 环境变量概念2.2 环境变量:PATH2.2.1 如何查看PATH中的内容2.2.2 如何让自己的可执行文件不带路径运行 2.3 环境变量…...
数学系C++ 类与对象 STL(九)
目录 目录 面向对象:py,c艹,Java都是,但c是面向过程 特征: 对象 内敛成员函数【是啥】: 构造函数和析构函数 构造函数 复制构造函数/拷贝构造函数: 【……】 实参与形参的传递方式:值…...
CSS技巧专栏:一日一例 2.纯CSS实现 多彩边框按钮特效
大家好,今天是 CSS技巧一日一例 专栏的第二篇《纯CSS实现多彩边框按钮特效》 先看图: 开工前的准备工作 正如昨日所讲,为了案例的表现,也处于书写的习惯,在今天的案例开工前,先把昨天的准备工作重做一遍。 清除浏览器的默认样式定义页面基本颜色设定body的样式清除butt…...
JCEF 在idea 开发 java 应用
JCEF(Java Chromium Embedded Framework)是一个Java库,用于在Java应用程序中嵌入Chromium浏览器引擎。如果您想在IDEA开发环境中使用JCEF,您可以按照以下步骤进行操作: 1. 下载JCEF库文件:您可以从JCEF的官…...
绝区伍--2024年AI发展路线图
2024 年将是人工智能具有里程碑意义的一年。随着新模式、融资轮次和进步以惊人的速度出现,很难跟上人工智能世界发生的一切。让我们深入了解 2024 年可能定义人工智能的关键事件、产品发布、研究突破和趋势。 2024 年第一季度 2024 年第一季度将推出一些主要车型并…...
C++:.front()函数作用
在C中,.front() 函数是容器(如 std::vector、std::deque、std::list 的某些实现等)的成员函数,用于访问容器中的第一个元素。这个函数返回对容器中第一个元素的引用(对于非const容器)或const引用࿰…...
Linux系统备份工具TimeShift
Linux系统备份 Linux系统备份工具TimeShift Linux系统备份工具TimeShift 0. 前言1. 安装2. 启动3. 使用法一、图形界面操作(方便)法二、终端命令操作(高端) Linux系统备份工具TimeShift Linux系统备份工具TimeShift 0. 前言 Time…...
Google重大更新--解读Android Auto认证4.3
Google在今年五月更新了Android Auto 4.2.2版本,而在2024年7月他们推出了Android Auto 4.3版本,这是自2023年9月以来对Android Auto 4.2版本的一次重大更新。 为了确保合规性和顺利认证,OEM和Tire1必须确保PDK组件版本与正在认证的主机的Rece…...
scala基础
scala基础: hello world: 写scala可运行文件的注意事项1、如果一个scala文件要运行,class要改成object2、如果是class,就仅单纯代表一个类,如果是object代表的是单例对象3、scala语法中,一句话结束不需要加分号4、scal…...
小红书选品中心商家采集 小红书商家电话采集软件
可采集名称销量评分联系方式等 需要有1000粉丝以上已实名认证过的小红书达人才可以使用 以下是一个示例程序,可以用于批量获取小红书选品中心商家的信息: import requestsdef get_merchants(page_num):url f"https://www.xiaohongshu.com/selec…...
JavaScript基础: JavaScript 数字类型
JavaScript 中的数字类型是用来表示数值的数据类型。JavaScript 的数字类型是基于 IEEE 754 标准的双精度浮点数格式,这意味着它可以表示非常大和非常小的数值,以及小数。 数字字面量 在 JavaScript 中,数字可以直接以字面量的形式书写&…...
【网络安全】漏洞挖掘之Spring Cloud注入漏洞
漏洞描述 Spring框架为现代基于java的企业应用程序(在任何类型的部署平台上)提供了一个全面的编程和配置模型。 Spring Cloud 中的 serveless框架 Spring Cloud Function 中的 RoutingFunction 类的 apply 方法将请求头中的“spring.cloud.function.routing-expression”参数…...
面试官:MySQL死锁是什么,如何解决?
MySQL死锁概述 定义:多个操作相互等待对方释放资源,导致无法继续执行的情况。场景:通常发生在多个事务同时试图锁定对方已锁定的资源时。 MySQL锁的分类 粒度分类: 表级锁:锁定整个表,简单但并发能力低。…...
CSS原子化
目录 一、定义 二、原子化工具 2.1、tailwind 2.1.1、以PostCss插件形式安装 2.1.2、不依赖PostCss安装 2.1.3、修改原始配置 2.2、unocss 三、优缺点 3.1、优点 3.2、缺点 一、定义 定义:使用一系列的助记词,利用类名来代表样式。 二、原子化…...
【Python的pip配置、程序运行、生成exe文件】
Python的pip配置、程序运行、生成exe文件 一、安装Python 通过官网下载对应的版本,安装即可。 下载地址:https://www.python.org/downloads/ Python标准库查看(Python自带库) Python 标准库文档 安装Python的时候,…...
神经网络习题
不具有权重共享的网络是: **多层感知机(Multilayer Perceptron,MLP): ** 特点:每一层的每一个神经元都与上一层的每一个神经元全连接,权重独立于每个连接,不存在权重共享。 权重共享…...
deepstream段错误
😐 错误: 探针中由于使用了pyds.get_nvds_buf_surface(hash(gst_buffer), frame_meta.batch_id)导致的段错误(segmentation fault)。 解决方式:...
《梦醒蝶飞:释放Excel函数与公式的力量》10.1.1函数简介
10.1.1函数简介 BIN2DEC函数是Excel中用于将二进制数转换为十进制数的函数。它在处理二进制数时非常有用,尤其是在电子工程、计算机科学等领域。 10.1.2函数语法: BIN2DEC(number) number:这是要转换的二进制数,必须是以字符串…...
MPNet:旋转机械轻量化故障诊断模型详解python代码复现
目录 一、问题背景与挑战 二、MPNet核心架构 2.1 多分支特征融合模块(MBFM) 2.2 残差注意力金字塔模块(RAPM) 2.2.1 空间金字塔注意力(SPA) 2.2.2 金字塔残差块(PRBlock) 2.3 分类器设计 三、关键技术突破 3.1 多尺度特征融合 3.2 轻量化设计策略 3.3 抗噪声…...
树莓派超全系列教程文档--(61)树莓派摄像头高级使用方法
树莓派摄像头高级使用方法 配置通过调谐文件来调整相机行为 使用多个摄像头安装 libcam 和 rpicam-apps依赖关系开发包 文章来源: http://raspberry.dns8844.cn/documentation 原文网址 配置 大多数用例自动工作,无需更改相机配置。但是,一…...
【力扣数据库知识手册笔记】索引
索引 索引的优缺点 优点1. 通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。2. 可以加快数据的检索速度(创建索引的主要原因)。3. 可以加速表和表之间的连接,实现数据的参考完整性。4. 可以在查询过程中,…...
QMC5883L的驱动
简介 本篇文章的代码已经上传到了github上面,开源代码 作为一个电子罗盘模块,我们可以通过I2C从中获取偏航角yaw,相对于六轴陀螺仪的yaw,qmc5883l几乎不会零飘并且成本较低。 参考资料 QMC5883L磁场传感器驱动 QMC5883L磁力计…...
UE5 学习系列(三)创建和移动物体
这篇博客是该系列的第三篇,是在之前两篇博客的基础上展开,主要介绍如何在操作界面中创建和拖动物体,这篇博客跟随的视频链接如下: B 站视频:s03-创建和移动物体 如果你不打算开之前的博客并且对UE5 比较熟的话按照以…...
LeetCode - 394. 字符串解码
题目 394. 字符串解码 - 力扣(LeetCode) 思路 使用两个栈:一个存储重复次数,一个存储字符串 遍历输入字符串: 数字处理:遇到数字时,累积计算重复次数左括号处理:保存当前状态&a…...
汽车生产虚拟实训中的技能提升与生产优化
在制造业蓬勃发展的大背景下,虚拟教学实训宛如一颗璀璨的新星,正发挥着不可或缺且日益凸显的关键作用,源源不断地为企业的稳健前行与创新发展注入磅礴强大的动力。就以汽车制造企业这一极具代表性的行业主体为例,汽车生产线上各类…...
基于当前项目通过npm包形式暴露公共组件
1.package.sjon文件配置 其中xh-flowable就是暴露出去的npm包名 2.创建tpyes文件夹,并新增内容 3.创建package文件夹...
【2025年】解决Burpsuite抓不到https包的问题
环境:windows11 burpsuite:2025.5 在抓取https网站时,burpsuite抓取不到https数据包,只显示: 解决该问题只需如下三个步骤: 1、浏览器中访问 http://burp 2、下载 CA certificate 证书 3、在设置--隐私与安全--…...
[10-3]软件I2C读写MPU6050 江协科技学习笔记(16个知识点)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16...
