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:这是要转换的二进制数,必须是以字符串…...
IDEA运行Tomcat出现乱码问题解决汇总
最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…...
DeepSeek 赋能智慧能源:微电网优化调度的智能革新路径
目录 一、智慧能源微电网优化调度概述1.1 智慧能源微电网概念1.2 优化调度的重要性1.3 目前面临的挑战 二、DeepSeek 技术探秘2.1 DeepSeek 技术原理2.2 DeepSeek 独特优势2.3 DeepSeek 在 AI 领域地位 三、DeepSeek 在微电网优化调度中的应用剖析3.1 数据处理与分析3.2 预测与…...
三维GIS开发cesium智慧地铁教程(5)Cesium相机控制
一、环境搭建 <script src"../cesium1.99/Build/Cesium/Cesium.js"></script> <link rel"stylesheet" href"../cesium1.99/Build/Cesium/Widgets/widgets.css"> 关键配置点: 路径验证:确保相对路径.…...
Admin.Net中的消息通信SignalR解释
定义集线器接口 IOnlineUserHub public interface IOnlineUserHub {/// 在线用户列表Task OnlineUserList(OnlineUserList context);/// 强制下线Task ForceOffline(object context);/// 发布站内消息Task PublicNotice(SysNotice context);/// 接收消息Task ReceiveMessage(…...
多场景 OkHttpClient 管理器 - Android 网络通信解决方案
下面是一个完整的 Android 实现,展示如何创建和管理多个 OkHttpClient 实例,分别用于长连接、普通 HTTP 请求和文件下载场景。 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas…...
【ROS】Nav2源码之nav2_behavior_tree-行为树节点列表
1、行为树节点分类 在 Nav2(Navigation2)的行为树框架中,行为树节点插件按照功能分为 Action(动作节点)、Condition(条件节点)、Control(控制节点) 和 Decorator(装饰节点) 四类。 1.1 动作节点 Action 执行具体的机器人操作或任务,直接与硬件、传感器或外部系统…...
(二)原型模式
原型的功能是将一个已经存在的对象作为源目标,其余对象都是通过这个源目标创建。发挥复制的作用就是原型模式的核心思想。 一、源型模式的定义 原型模式是指第二次创建对象可以通过复制已经存在的原型对象来实现,忽略对象创建过程中的其它细节。 📌 核心特点: 避免重复初…...
ETLCloud可能遇到的问题有哪些?常见坑位解析
数据集成平台ETLCloud,主要用于支持数据的抽取(Extract)、转换(Transform)和加载(Load)过程。提供了一个简洁直观的界面,以便用户可以在不同的数据源之间轻松地进行数据迁移和转换。…...
04-初识css
一、css样式引入 1.1.内部样式 <div style"width: 100px;"></div>1.2.外部样式 1.2.1.外部样式1 <style>.aa {width: 100px;} </style> <div class"aa"></div>1.2.2.外部样式2 <!-- rel内表面引入的是style样…...
Android Bitmap治理全解析:从加载优化到泄漏防控的全生命周期管理
引言 Bitmap(位图)是Android应用内存占用的“头号杀手”。一张1080P(1920x1080)的图片以ARGB_8888格式加载时,内存占用高达8MB(192010804字节)。据统计,超过60%的应用OOM崩溃与Bitm…...
