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

Memcached 介绍与详解及在Java Spring Boot项目中的使用与集成

Memcached 介绍

Memcached 是一种高性能的分布式内存对象缓存系统,主要用于加速动态Web应用以减少数据库负载,从而提高访问速度和性能。作为一个开源项目,Memcached 被广泛应用于许多大型互联网公司,如Facebook、Twitter 和 YouTube 等。Memcached 通过将数据存储在内存中,并使用高效的哈希算法来进行数据存取,提供了极高的读写性能。

基本概念

Memcached 是一个基于内存的分布式缓存系统,它使用键值对(key-value)的方式存储数据。每个键(key)唯一标识一条数据,值(value)可以是任意类型的数据。Memcached 通过哈希函数将键映射到内存中的特定位置,从而实现快速的数据存取。在分布式环境中,Memcached 使用一致性哈希算法将数据分布到不同的缓存服务器上,以确保系统的高可用性和可扩展性。

主要特性

  1. 高性能:Memcached 通过将数据存储在内存中,提供了极高的读写性能。
  2. 分布式:支持水平扩展,可以轻松扩展到多个服务器,满足大规模分布式缓存需求。
  3. 简单易用:提供了简单的API,支持多种编程语言(如C、Python、Java、PHP等),便于开发者集成。
  4. 开放源码:作为一个开源项目,Memcached 的源代码可以自由获取和修改,便于定制和扩展。

工作原理

Memcached 的工作原理非常简单但高效。当应用需要访问某个数据时,首先检查Memcached中是否存在该数据,如果存在则直接返回,从而提高了数据的读取速度;如果不存在,则从数据库或其他存储系统中获取数据,并将该数据存储到Memcached中,以便下次访问时可以直接从缓存中获取。Memcached 还支持设置缓存项的过期时间,到期后缓存项会自动删除。

应用场景

Memcached 广泛应用于以下场景:

  1. Web缓存:在高流量网站中,缓存数据库查询结果、页面片段、会话数据等,显著提高响应速度,减轻数据库压力。
  2. 临时数据存储:用于存储一些临时性的数据,如验证码、临时会话信息等,避免频繁访问数据库。
  3. 分布式系统:在分布式系统中,Memcached 用作分布式缓存,提高数据访问速度和系统的可扩展性。
  4. 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.propertiesapplication.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 是一种高性能的分布式内存对象缓存系统&#xff0c;主要用于加速动态Web应用以减少数据库负载&#xff0c;从而提高访问速度和性能。作为一个开源项目&#xff0c;Memcached 被广泛应用于许多大型互联网公司&#xff0c;如Facebook、Twitter 和 YouT…...

淮北在选择SCADA系统时,哪些因素会影响其稳定性?

关键字:LP-SCADA系统, 传感器可视化, 设备可视化, 独立SPC系统, 智能仪表系统,SPC可视化,独立SPC系统 在选择SCADA系统时&#xff0c;稳定性是一个关键因素&#xff0c;因为它直接影响到生产过程的连续性和安全性。以下是一些影响SCADA系统稳定性的因素&#xff1a; 硬件质量…...

Linux: 命令行参数和环境变量究竟是什么?

Linux: 命令行参数和环境变量究竟是什么&#xff1f; 一、命令行参数1.1 main函数参数意义1.2 命令行参数概念1.3 命令行参数实例 二、环境变量2.1 环境变量概念2.2 环境变量&#xff1a;PATH2.2.1 如何查看PATH中的内容2.2.2 如何让自己的可执行文件不带路径运行 2.3 环境变量…...

数学系C++ 类与对象 STL(九)

目录 目录 面向对象&#xff1a;py&#xff0c;c艹&#xff0c;Java都是,但c是面向过程 特征&#xff1a; 对象 内敛成员函数【是啥】&#xff1a; 构造函数和析构函数 构造函数 复制构造函数/拷贝构造函数&#xff1a; 【……】 实参与形参的传递方式&#xff1a;值…...

CSS技巧专栏:一日一例 2.纯CSS实现 多彩边框按钮特效

大家好,今天是 CSS技巧一日一例 专栏的第二篇《纯CSS实现多彩边框按钮特效》 先看图: 开工前的准备工作 正如昨日所讲,为了案例的表现,也处于书写的习惯,在今天的案例开工前,先把昨天的准备工作重做一遍。 清除浏览器的默认样式定义页面基本颜色设定body的样式清除butt…...

JCEF 在idea 开发 java 应用

JCEF&#xff08;Java Chromium Embedded Framework&#xff09;是一个Java库&#xff0c;用于在Java应用程序中嵌入Chromium浏览器引擎。如果您想在IDEA开发环境中使用JCEF&#xff0c;您可以按照以下步骤进行操作&#xff1a; 1. 下载JCEF库文件&#xff1a;您可以从JCEF的官…...

绝区伍--2024年AI发展路线图

2024 年将是人工智能具有里程碑意义的一年。随着新模式、融资轮次和进步以惊人的速度出现&#xff0c;很难跟上人工智能世界发生的一切。让我们深入了解 2024 年可能定义人工智能的关键事件、产品发布、研究突破和趋势。 2024 年第一季度 2024 年第一季度将推出一些主要车型并…...

C++:.front()函数作用

在C中&#xff0c;.front() 函数是容器&#xff08;如 std::vector、std::deque、std::list 的某些实现等&#xff09;的成员函数&#xff0c;用于访问容器中的第一个元素。这个函数返回对容器中第一个元素的引用&#xff08;对于非const容器&#xff09;或const引用&#xff0…...

Linux系统备份工具TimeShift

Linux系统备份 Linux系统备份工具TimeShift Linux系统备份工具TimeShift 0. 前言1. 安装2. 启动3. 使用法一、图形界面操作&#xff08;方便&#xff09;法二、终端命令操作&#xff08;高端&#xff09; Linux系统备份工具TimeShift Linux系统备份工具TimeShift 0. 前言 Time…...

Google重大更新--解读Android Auto认证4.3

Google在今年五月更新了Android Auto 4.2.2版本&#xff0c;而在2024年7月他们推出了Android Auto 4.3版本&#xff0c;这是自2023年9月以来对Android Auto 4.2版本的一次重大更新。 为了确保合规性和顺利认证&#xff0c;OEM和Tire1必须确保PDK组件版本与正在认证的主机的Rece…...

scala基础

scala基础&#xff1a; hello world: 写scala可运行文件的注意事项1、如果一个scala文件要运行&#xff0c;class要改成object2、如果是class&#xff0c;就仅单纯代表一个类&#xff0c;如果是object代表的是单例对象3、scala语法中&#xff0c;一句话结束不需要加分号4、scal…...

小红书选品中心商家采集 小红书商家电话采集软件

可采集名称销量评分联系方式等 需要有1000粉丝以上已实名认证过的小红书达人才可以使用 以下是一个示例程序&#xff0c;可以用于批量获取小红书选品中心商家的信息&#xff1a; import requestsdef get_merchants(page_num):url f"https://www.xiaohongshu.com/selec…...

JavaScript基础: JavaScript 数字类型

JavaScript 中的数字类型是用来表示数值的数据类型。JavaScript 的数字类型是基于 IEEE 754 标准的双精度浮点数格式&#xff0c;这意味着它可以表示非常大和非常小的数值&#xff0c;以及小数。 数字字面量 在 JavaScript 中&#xff0c;数字可以直接以字面量的形式书写&…...

【网络安全】漏洞挖掘之Spring Cloud注入漏洞

漏洞描述 Spring框架为现代基于java的企业应用程序(在任何类型的部署平台上)提供了一个全面的编程和配置模型。 Spring Cloud 中的 serveless框架 Spring Cloud Function 中的 RoutingFunction 类的 apply 方法将请求头中的“spring.cloud.function.routing-expression”参数…...

面试官:MySQL死锁是什么,如何解决?

MySQL死锁概述 定义&#xff1a;多个操作相互等待对方释放资源&#xff0c;导致无法继续执行的情况。场景&#xff1a;通常发生在多个事务同时试图锁定对方已锁定的资源时。 MySQL锁的分类 粒度分类&#xff1a; 表级锁&#xff1a;锁定整个表&#xff0c;简单但并发能力低。…...

CSS原子化

目录 一、定义 二、原子化工具 2.1、tailwind 2.1.1、以PostCss插件形式安装 2.1.2、不依赖PostCss安装 2.1.3、修改原始配置 2.2、unocss 三、优缺点 3.1、优点 3.2、缺点 一、定义 定义&#xff1a;使用一系列的助记词&#xff0c;利用类名来代表样式。 二、原子化…...

【Python的pip配置、程序运行、生成exe文件】

Python的pip配置、程序运行、生成exe文件 一、安装Python 通过官网下载对应的版本&#xff0c;安装即可。 下载地址&#xff1a;https://www.python.org/downloads/ Python标准库查看&#xff08;Python自带库&#xff09; Python 标准库文档 安装Python的时候&#xff0c…...

神经网络习题

不具有权重共享的网络是&#xff1a; **多层感知机&#xff08;Multilayer Perceptron&#xff0c;MLP&#xff09;&#xff1a; ** 特点&#xff1a;每一层的每一个神经元都与上一层的每一个神经元全连接&#xff0c;权重独立于每个连接&#xff0c;不存在权重共享。 权重共享…...

deepstream段错误

&#x1f610; 错误&#xff1a; 探针中由于使用了pyds.get_nvds_buf_surface(hash(gst_buffer), frame_meta.batch_id)导致的段错误&#xff08;segmentation fault&#xff09;。 解决方式&#xff1a;...

《梦醒蝶飞:释放Excel函数与公式的力量》10.1.1函数简介

10.1.1函数简介 BIN2DEC函数是Excel中用于将二进制数转换为十进制数的函数。它在处理二进制数时非常有用&#xff0c;尤其是在电子工程、计算机科学等领域。 10.1.2函数语法&#xff1a; BIN2DEC(number) number&#xff1a;这是要转换的二进制数&#xff0c;必须是以字符串…...

PPT|230页| 制造集团企业供应链端到端的数字化解决方案:从需求到结算的全链路业务闭环构建

制造业采购供应链管理是企业运营的核心环节&#xff0c;供应链协同管理在供应链上下游企业之间建立紧密的合作关系&#xff0c;通过信息共享、资源整合、业务协同等方式&#xff0c;实现供应链的全面管理和优化&#xff0c;提高供应链的效率和透明度&#xff0c;降低供应链的成…...

Go 语言接口详解

Go 语言接口详解 核心概念 接口定义 在 Go 语言中&#xff0c;接口是一种抽象类型&#xff0c;它定义了一组方法的集合&#xff1a; // 定义接口 type Shape interface {Area() float64Perimeter() float64 } 接口实现 Go 接口的实现是隐式的&#xff1a; // 矩形结构体…...

鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个生活电费的缴纳和查询小程序

一、项目初始化与配置 1. 创建项目 ohpm init harmony/utility-payment-app 2. 配置权限 // module.json5 {"requestPermissions": [{"name": "ohos.permission.INTERNET"},{"name": "ohos.permission.GET_NETWORK_INFO"…...

推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材)

推荐 github 项目:GeminiImageApp(图片生成方向&#xff0c;可以做一定的素材) 这个项目能干嘛? 使用 gemini 2.0 的 api 和 google 其他的 api 来做衍生处理 简化和优化了文生图和图生图的行为(我的最主要) 并且有一些目标检测和切割(我用不到) 视频和 imagefx 因为没 a…...

基于SpringBoot在线拍卖系统的设计和实现

摘 要 随着社会的发展&#xff0c;社会的各行各业都在利用信息化时代的优势。计算机的优势和普及使得各种信息系统的开发成为必需。 在线拍卖系统&#xff0c;主要的模块包括管理员&#xff1b;首页、个人中心、用户管理、商品类型管理、拍卖商品管理、历史竞拍管理、竞拍订单…...

Web后端基础(基础知识)

BS架构&#xff1a;Browser/Server&#xff0c;浏览器/服务器架构模式。客户端只需要浏览器&#xff0c;应用程序的逻辑和数据都存储在服务端。 优点&#xff1a;维护方便缺点&#xff1a;体验一般 CS架构&#xff1a;Client/Server&#xff0c;客户端/服务器架构模式。需要单独…...

mac:大模型系列测试

0 MAC 前几天经过学生优惠以及国补17K入手了mac studio,然后这两天亲自测试其模型行运用能力如何&#xff0c;是否支持微调、推理速度等能力。下面进入正文。 1 mac 与 unsloth 按照下面的进行安装以及测试&#xff0c;是可以跑通文章里面的代码。训练速度也是很快的。 注意…...

Python竞赛环境搭建全攻略

Python环境搭建竞赛技术文章大纲 竞赛背景与意义 竞赛的目的与价值Python在竞赛中的应用场景环境搭建对竞赛效率的影响 竞赛环境需求分析 常见竞赛类型&#xff08;算法、数据分析、机器学习等&#xff09;不同竞赛对Python版本及库的要求硬件与操作系统的兼容性问题 Pyth…...

Vue3 PC端 UI组件库我更推荐Naive UI

一、Vue3生态现状与UI库选择的重要性 随着Vue3的稳定发布和Composition API的广泛采用&#xff0c;前端开发者面临着UI组件库的重新选择。一个好的UI库不仅能提升开发效率&#xff0c;还能确保项目的长期可维护性。本文将对比三大主流Vue3 UI库&#xff08;Naive UI、Element …...

React父子组件通信:Props怎么用?如何从父组件向子组件传递数据?

系列回顾&#xff1a; 在上一篇《React核心概念&#xff1a;State是什么&#xff1f;》中&#xff0c;我们学习了如何使用useState让一个组件拥有自己的内部数据&#xff08;State&#xff09;&#xff0c;并通过一个计数器案例&#xff0c;实现了组件的自我更新。这很棒&#…...