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

server/2024/12/22 20:24:22/

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作为缓存解决方案。


http://www.ppmy.cn/server/60009.html

相关文章

发布:PhonePrompter_PC(手机录视频提词器_电脑版)

PhonePrompter_PC(手机录视频提词器_电脑版) 目 录 1. 概述... 2 2. 应用手册... 3 下载地址&#xff1a;百度网盘 请输入提取码 提取码&#xff1a;8wsa 1. 概述 平时工作和生活中需要用手机竖屏或横屏模式录制造工作、科技、历史、生活等方面的一些视…

昇思25天学习打卡营第14天|基于MindNLP的文本解码原理

基于MindNLP的文本解码原理 文本解码 文本解码是自然语言处理中的一个关键步骤,特别是在任务如机器翻译、文本摘要、自动回复生成等领域。解码过程涉及将编码器(如语言模型、翻译模型等)的输出转换为可读的文本序列。以下是一些常见的文本解码方法和原理: 1. 自回归解码:…

5G/4G加密边缘计算电力网关,开启智慧电力新篇章

计讯物联TG452&#xff0c;一款面向电力行业应用的工业级物联网网关&#xff0c;持电力协议及规约标准&#xff0c;支持采集、存储、算力、通信组网 、协议转换、控制等多功能。    电力应用   计讯物联电力网关TG452支持电力IEC101、IEC104、IEC61850、DL/T645等协议标准…

什么是边缘计算?创造一个更快、更智慧、更互联的世界

前言 如今&#xff0c;数十亿物联网传感器广泛部署在零售商店、城市街道、仓库和医院等各种场所&#xff0c;正在生成大量数据。从这些数据中更快地获得洞察&#xff0c;意味着可以改善服务、简化运营&#xff0c;甚至挽救生命。但要做到这一点&#xff0c;企业需要实时做出决策…

护网HW面试常问——webshell内存马流量特征以及查杀

参考&#xff1a;学习干货|HVV必学远控工具及Webshell流量合集分析(建议收藏附面试题) 蚁剑 ini_set ini_set_time ini_set_limit ini_set("display_errors","0") 部分代码明文传输&#xff0c;较好辨认 哥斯拉 1、User-Agent (弱特征) 在默认的情况…

SVM - 径向基函数核 Radial Basis Function Kernel,简称RBF核或者高斯核

SVM - 径向基函数核 Radial Basis Function Kernel&#xff0c;简称RBF核或者高斯核 flyfish 径向基函数核&#xff08;Radial Basis Function Kernel&#xff0c;简称RBF核&#xff09;&#xff0c;也称为高斯核&#xff0c;是一种常用的核函数&#xff0c;用于支持向量机&a…

Java 实验二:利用Java数据类型与程序结构实现经典的算法

一、实验目的 1、通过实验内容&#xff0c;锻炼自身的问题分析、转化、建模能力&#xff0c;同时提升程序设计的能力&#xff1b; 2、通过简单程序设计对于Java的程序设计形成初步感知&#xff0c;了解整个的程序设计的流程。 二、实验环境 1、windows11; 2、JDK1.8,集成开…

Python:安装/Mac

之前一直陆陆续续有学python&#xff01;今天开始&#xff01;正式开肝&#xff01;&#xff01;&#xff01; 进入网站&#xff1a;可能会有点慢&#xff0c;多开几个网页 https://www.python.org 点击下载&#xff0c;然后进入新的页面&#xff0c;往下滑 来到File&#xff0…