当前位置: 首页 > 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作为缓存解决方案。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 开发个人Ollama-Chat--5 模型管理 (二)
  • Java数据结构-链表与LinkedList
  • 触摸屏虚拟键盘组件 jQuery Virtual Keyboard使用 自定义键盘
  • 阿里巴巴矢量图标库使用
  • 梯度下降算法的原理
  • allWebPlugin中间件实现ActiveX插件在谷歌、火狐、Edge浏览器使用
  • C++:从C语言过渡到C++
  • C++:C++入门基础|命名空间|输入输出
  • OSS存储桶密钥泄露【案例】
  • 【基于R语言群体遗传学】-14-种群起源的相对似然
  • 【云原生】AWS云平台,ECR推送Helm chart包
  • TCP/IP协议超时重传,以及应用层超时重传一文详解
  • OpenHarmony 入门——ArkUI自定义组件的基础语法(一)
  • 开源项目的认识理解
  • 深度学习中的超参管理方法:argparse模块
  • 《用数据讲故事》作者Cole N. Knaflic:消除一切无效的图表
  • 【每日笔记】【Go学习笔记】2019-01-10 codis proxy处理流程
  • 【许晓笛】 EOS 智能合约案例解析(3)
  • Apache Zeppelin在Apache Trafodion上的可视化
  • Date型的使用
  • docker python 配置
  • GitUp, 你不可错过的秀外慧中的git工具
  • Mysql数据库的条件查询语句
  • Next.js之基础概念(二)
  • Sass 快速入门教程
  • Spring核心 Bean的高级装配
  • uni-app项目数字滚动
  • VirtualBox 安装过程中出现 Running VMs found 错误的解决过程
  • 机器人定位导航技术 激光SLAM与视觉SLAM谁更胜一筹?
  • 我感觉这是史上最牛的防sql注入方法类
  • 原生 js 实现移动端 Touch 滑动反弹
  • - 转 Ext2.0 form使用实例
  • NLPIR智能语义技术让大数据挖掘更简单
  • Play Store发现SimBad恶意软件,1.5亿Android用户成受害者 ...
  • 关于Kubernetes Dashboard漏洞CVE-2018-18264的修复公告
  • ​软考-高级-信息系统项目管理师教程 第四版【第23章-组织通用管理-思维导图】​
  • #NOIP 2014#Day.2 T3 解方程
  • (2)Java 简介
  • (C语言)逆序输出字符串
  • (纯JS)图片裁剪
  • (二十六)Java 数据结构
  • (附源码)spring boot火车票售卖系统 毕业设计 211004
  • (回溯) LeetCode 77. 组合
  • (理论篇)httpmoudle和httphandler一览
  • (三)Honghu Cloud云架构一定时调度平台
  • (实战)静默dbca安装创建数据库 --参数说明+举例
  • (四)软件性能测试
  • (转)IOS中获取各种文件的目录路径的方法
  • (转)机器学习的数学基础(1)--Dirichlet分布
  • (转载)在C#用WM_COPYDATA消息来实现两个进程之间传递数据
  • (轉貼) 蒼井そら挑戰筋肉擂台 (Misc)
  • ****** 二 ******、软设笔记【数据结构】-KMP算法、树、二叉树
  • *++p:p先自+,然后*p,最终为3 ++*p:先*p,即arr[0]=1,然后再++,最终为2 *p++:值为arr[0],即1,该语句执行完毕后,p指向arr[1]
  • ./mysql.server: 没有那个文件或目录_Linux下安装MySQL出现“ls: /var/lib/mysql/*.pid: 没有那个文件或目录”...
  • .gitignore文件使用