Memcached开发(七):使用Java进行操作

目录

1. 安装与配置Memcached

1.1 安装Memcached

1.2 配置Memcached

2. 使用Java与Memcached进行交互

2.1 安装Java客户端

2.2 连接Memcached

2.3 基本操作

2.3.1 设置键值对

2.3.2 获取键值对

2.3.3 删除键值对

2.3.4 检查键是否存在

2.3.5 增加和减少数值

2.4 高级操作

2.4.1 批量操作

2.4.2 设置过期时间

2.4.3 异常处理

3. Memcached的性能优化

3.1 合理设置缓存大小

3.2 数据分片

3.3 使用一致性哈希

3.4 避免频繁更新

3.5 监控与调优

4. 案例

4.1 Web应用中的缓存

4.1.1 Spring配置

4.1.2 使用缓存

4.1.3 控制器代码

4.2 分布式锁

5. 结论


Memcached是一种高性能的分布式内存缓存系统,广泛应用于提升Web应用程序的响应速度和减轻数据库负载。通过将频繁访问的数据存储在内存中,Memcached能够极大地提高数据读取速度,适用于缓存数据库查询结果、会话数据、API响应等。本文将详细介绍如何使用Java与Memcached进行交互,涵盖基本操作、进阶用法以及性能优化策略。

1. 安装与配置Memcached

1.1 安装Memcached

在使用Java操作Memcached之前,需要确保Memcached已正确安装并运行。可以通过以下命令在Linux系统上安装Memcached:

sudo apt-get update
sudo apt-get install memcached

安装完成后,可以通过以下命令启动Memcached:

sudo service memcached start

1.2 配置Memcached

Memcached的默认配置通常已经足够满足大多数开发需求,但在高并发和大规模数据存储环境下,可以根据实际情况调整配置。Memcached的配置文件通常位于/etc/memcached.conf,可以通过编辑该文件进行配置。

2. 使用Java与Memcached进行交互

2.1 安装Java客户端

Java与Memcached的交互通常通过Spymemcached库来实现。可以通过以下命令在Maven项目中添加依赖:

<dependency><groupId>net.spy</groupId><artifactId>spymemcached</artifactId><version>2.12.3</version>
</dependency>

2.2 连接Memcached

在安装Spymemcached库后,可以通过以下代码连接到Memcached服务器:

import net.spy.memcached.MemcachedClient;
import java.net.InetSocketAddress;public class MemcachedExample {public static void main(String[] args) {try {// 创建Memcached客户端MemcachedClient client = new MemcachedClient(new InetSocketAddress("127.0.0.1", 11211));// 检查连接client.set("test_key", 900, "test_value").get();String value = (String) client.get("test_key");if ("test_value".equals(value)) {System.out.println("Successfully connected to Memcached");} else {System.out.println("Failed to connect to Memcached");}// 关闭客户端client.shutdown();} catch (Exception e) {e.printStackTrace();}}
}

在上述代码中,我们创建了一个Memcached客户端,并尝试向Memcached服务器写入一个测试键值对以检查连接是否成功。

2.3 基本操作

2.3.1 设置键值对

可以使用set方法将数据存储到Memcached中:

// 设置键值对
client.set("key1", 900, "value1");
client.set("key2", 900, 12345);
client.set("key3", 900, new int[]{1, 2, 3, 4, 5});System.out.println("Data has been set");

2.3.2 获取键值对

可以使用get方法从Memcached中读取数据:

// 获取键值对
String value1 = (String) client.get("key1");
Integer value2 = (Integer) client.get("key2");
int[] value3 = (int[]) client.get("key3");System.out.println("key1: " + value1);
System.out.println("key2: " + value2);
System.out.println("key3: " + Arrays.toString(value3));

2.3.3 删除键值对

可以使用delete方法删除存储在Memcached中的数据:

// 删除键值对
client.delete("key1").get();
System.out.println("key1 has been deleted");// 尝试获取已删除的键值对
value1 = (String) client.get("key1");
System.out.println("key1: " + value1);

2.3.4 检查键是否存在

可以使用get方法检查键是否存在:

// 检查键是否存在
value2 = (Integer) client.get("key2");
if (value2 != null) {System.out.println("key2 exists with value: " + value2);
} else {System.out.println("key2 does not exist");
}

2.3.5 增加和减少数值

可以使用incrdecr方法增加或减少数值:

// 设置数值键
client.set("counter", 900, 100).get();// 增加数值
client.incr("counter", 10);
System.out.println("counter after increment: " + client.get("counter"));// 减少数值
client.decr("counter", 5);
System.out.println("counter after decrement: " + client.get("counter"));

2.4 高级操作

2.4.1 批量操作

可以使用setBulkgetBulk方法进行批量操作:

// 批量设置键值对
Map<String, Object> data = new HashMap<>();
data.put("key4", "value4");
data.put("key5", "value5");
data.put("key6", "value6");
client.setBulk(data, 900);
System.out.println("Batch data has been set");// 批量获取键值对
Collection<String> keys = Arrays.asList("key4", "key5", "key6");
Map<String, Object> values = client.getBulk(keys);
System.out.println("Batch values: " + values);

2.4.2 设置过期时间

可以在设置键值对时指定过期时间:

// 设置过期时间为10秒
client.set("temp_key", 10, "temp_value").get();
System.out.println("temp_key has been set with a timeout");// 检查键值对
Thread.sleep(11000);
String value = (String) client.get("temp_key");
System.out.println("temp_key after timeout: " + value);

2.4.3 异常处理

在使用Memcached时,需要处理可能出现的异常:

try {// 尝试获取不存在的键String value = (String) client.get("non_existent_key");if (value == null) {throw new Exception("Key does not exist");}
} catch (Exception e) {System.out.println("Error: " + e.getMessage());
}

3. Memcached的性能优化

3.1 合理设置缓存大小

Memcached的缓存大小对性能有重要影响。可以通过调整Memcached的配置文件来设置合适的缓存大小,以满足应用的需求。

3.2 数据分片

在大规模应用中,可以通过将数据分片存储在多个Memcached实例中,提升数据的读取和写入性能。

3.3 使用一致性哈希

一致性哈希可以帮助平衡负载,避免某些节点成为瓶颈。在数据分片时,可以使用一致性哈希算法将数据均匀分布到各个节点上。

3.4 避免频繁更新

频繁更新缓存数据会导致缓存命中率下降。可以通过合理设置缓存策略,减少频繁更新带来的性能影响。

3.5 监控与调优

通过监控Memcached的性能指标,如命中率、内存使用率、网络流量等,可以及时发现性能瓶颈并进行调优。

4. 案例

4.1 Web应用中的缓存

在Web应用中,Memcached常用于缓存数据库查询结果,提高页面响应速度。以下是一个使用Spring框架与Memcached进行缓存的示例:

4.1.1 Spring配置

首先,在Spring配置文件中添加Memcached的相关配置:

<bean id="memcachedClient" class="net.spy.memcached.spring.MemcachedClientFactoryBean"><property name="servers" value="127.0.0.1:11211"/>
</bean><bean id="cacheManager" class="org.springframework.cache.support.SimpleCacheManager"><property name="caches"><list><bean class="org.springframework.cache.support.SimpleValueWrapper"><property name="name" value="default"/><property name="value" ref="memcachedClient"/></bean></list></property>
</bean><cache:annotation-driven cache-manager="cacheManager"/>

4.1.2 使用缓存

然后,在需要缓存的服务方法上添加缓存注解:

import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;@Service
public class ProductService {@Cacheable("products")public List<Product> getAllProducts() {// 模拟数据库查询return Arrays.asList(new Product(1, "Product A"), new Product(2, "Product B"));}
}

4.1.3 控制器代码

在控制器中调用缓存的方法:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
public class ProductController {@Autowiredprivate ProductService productService;@GetMapping("/products")public List<Product> getProducts() {return productService.getAllProducts();}
}

在这个示例中,我们将产品列表的查询结果缓存到Memcached中,并通过Spring的缓存注解实现自动缓存,显著减少了数据库查询的次数,提高了页面的加载速度。

4.2 分布式锁

Memcached可以用来实现分布式锁,确保在分布式环境中对共享资源的访问是安全的。以下是一个简单的分布式锁实现示例:

import net.spy.memcached.MemcachedClient;
import java.net.InetSocketAddress;
import java.util.concurrent.TimeUnit;public class DistributedLock {private MemcachedClient client;private String lockName;private int lockTimeout;public DistributedLock(MemcachedClient client, String lockName, int lockTimeout) {this.client = client;this.lockName = lockName;this.lockTimeout = lockTimeout;}public boolean acquireLock(long acquireTimeout) throws InterruptedException {long end = System.currentTimeMillis() + acquireTimeout;while (System.currentTimeMillis() < end) {if (client.add(lockName, lockTimeout, "locked").get()) {return true;}TimeUnit.MILLISECONDS.sleep(50);}return false;}public void releaseLock() {client.delete(lockName);}public static void main(String[] args) {try {MemcachedClient client = new MemcachedClient(new InetSocketAddress("127.0.0.1", 11211));DistributedLock lock = new DistributedLock(client, "my_lock", 10);if (lock.acquireLock(5000)) {try {System.out.println("Lock acquired");// 执行需要加锁的操作} finally {lock.releaseLock();System.out.println("Lock released");}} else {System.out.println("Failed to acquire lock");}client.shutdown();} catch (Exception e) {e.printStackTrace();}}
}

在这个示例中,我们实现了一个简单的分布式锁,通过acquireLock方法尝试获取锁,成功获取锁后执行需要加锁的操作,最后通过releaseLock方法释放锁。

5. 结论

通过本文的介绍,我们详细讲解了如何使用Java与Memcached进行交互,包括基本操作、进阶用法以及性能优化策略。掌握这些内容,可以更好地利用Memcached提升应用程序的性能和响应速度,从而在实际开发中获得显著的效率提升。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/49739.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用 com.alibaba:easyexcel 导出excel文件时遇到的问题

1.字符长度超出限制 java.lang.IllegalArgumentException: The maximum length of cell contents (text) is 32,767 characters 解决方案&#xff1a; 1. 把字符串截取前32767个字符 /*** sqlText 字段导出 excel 时的转化器*/ public class SqlTextConverter implements C…

javascript 如何将 json 格式数组转为 excel 表格| sheetJS

案例 // https://unpkg.com/xlsx0.18.5/dist/xlsx.full.min.js function exportXlsx(jsonData, fileName , mine null) {const workbook XLSX.utils.book_new();// 将JSON数组转换成工作表const worksheet XLSX.utils.json_to_sheet(jsonData);// 向工作簿添加工作表XLSX.…

建造者模式(Builder Pattern)工作原理

文章目录 [toc]建造者模式&#xff08;Builder Pattern&#xff09;工作原理一、基本概念二、主要角色三、工作流程&#xff08;一&#xff09;定义产品&#xff08;二&#xff09;定义抽象建造者&#xff08;三&#xff09;定义具体建造者&#xff08;四&#xff09;定义指挥者…

Git操作指令

Git操作指令 一、安装git 1、设置配置信息&#xff1a; # global全局配置 git config --global user.name "Your username" git config --global user.email "Your email"2、查看git版本号 git -v # or git --version3、查看配置信息&#xff1a; git…

云计算复习--虚拟化技术

文章目录 虚拟化技术定义与原理虚拟机监视器&#xff08;VMM&#xff09;虚拟化技术服务器虚拟化存储虚拟化网络虚拟化应用虚拟化 关键技术新型虚拟化技术发展进展作业 虚拟化技术定义与原理 定义&#xff1a;虚拟化技术是一种将计算机物理实体&#xff08;如服务器、存储设备…

携手知“食”达人,黄浦两大商圈举办舌尖上的创意盛宴

7月22日&#xff0c;2024第十二届上海市“中华杯”职业技能竞赛——中华美食创新创意大赛活动暨第二届【南京路步行街】新中式美食创意大赛暨风情【淮海路】摩登名点创新大赛顺利落下帷幕。活动现场&#xff0c; “‘盛夏好食光’——特色创意美食焕新菜单” 正式发布。 大赛主…

Spring Boot组成的分布式系统中实现日志跟踪

Spring Boot组成的分布式系统中实现日志跟踪 首发2024-07-25 08:54潘多编程 在分布式系统中&#xff0c;日志跟踪是一项非常重要的功能&#xff0c;它帮助开发者了解请求在整个系统中的流转过程&#xff0c;这对于调试、监控和故障排查至关重要。Spring Boot应用通常作为微服…

【cmd】Windows CMD命令整理及示例使用

1. dir 显示目录中的文件和子目录列表。 dir带参数使用示例&#xff1a; dir /p # 分页显示目录中的内容 dir /s # 显示指定目录及所有子目录中的文件 dir /a # 显示具有隐藏属性的文件2. copy 复制文件和目录。 copy source destination带参数使用示例&#xff1a; c…

养宠浮毛异味双困扰?性价比高的宠物空气净化器推荐

家里养了两只银渐层&#xff0c;谁懂啊&#xff01;一下班打开家门就看到家里飘满了猫浮毛雪&#xff0c;空气中还传来隐隐约约的异味。每天不是在吸毛的路上&#xff0c;就是在洗猫砂盆的路上&#xff0c;而且空气中的浮毛还很难清理干净&#xff0c;这是最让人头疼的问题。 …

SSM学习8:SpringMVC请求与响应

设置请求映射路径 设置配置 config/ServletContainersInitConfig.class public class ServletContainersInitConfig extends AbstractAnnotationConfigDispatcherServletInitializer {protected Class<?>[] getServletConfigClasses() {return new Class[]{SpringMvcC…

Golang | Leetcode Golang题解之第282题给表达式添加运算符

题目&#xff1a; 题解&#xff1a; func addOperators(num string, target int) (ans []string) {n : len(num)var backtrack func(expr []byte, i, res, mul int)backtrack func(expr []byte, i, res, mul int) {if i n {if res target {ans append(ans, string(expr))}…

stm32——lcd液晶显示

一.液晶屏介绍 液晶显示屏是由液晶显示面板&#xff0c;电容触摸屏&#xff0c;pcb底板构成。在液晶显示屏里我们有带控制芯片的还有不带控制芯片的。对于低端的微控制器它不能直接控制液晶面板&#xff0c;所以需要给液晶控制面板而外增加一个液晶控制芯片。对于单片机stm32f4…

销售分析,奥威BI,销售好帮手

【销售分析&#xff0c;奥威BI&#xff0c;销售好帮手】 在商海浮沉中&#xff0c;销售数据是企业最宝贵的资产之一&#xff0c;它不仅反映了市场的反馈&#xff0c;更是指引企业未来战略方向的灯塔。奥威BI&#xff08;Business Intelligence&#xff09;&#xff0c;作为数据…

openssl req 详解

一、openssl req 该命令用于创建和处理PKCS#10格式的证书请求&#xff08;certificate requests CSRs&#xff09;&#xff0c;也可以用来创建自签名证书&#xff08; self-signed certificates&#xff09;来当作根证书&#xff08;root CAs&#xff09;使用 -new 该选项用来…

硅纪元视角 | Stability AI推出Stable Video 4D,40秒生成8角度动态视频!

在数字化浪潮的推动下&#xff0c;人工智能&#xff08;AI&#xff09;正成为塑造未来的关键力量。硅纪元视角栏目紧跟AI科技的最新发展&#xff0c;捕捉行业动态&#xff1b;提供深入的新闻解读&#xff0c;助您洞悉技术背后的逻辑&#xff1b;汇聚行业专家的见解&#xff0c;…

SpringBoot集成Tomcat、DispatcherServlet

通过 SpringBoot 自动配置机制&#xff0c;导入配置类 利用 SpringBoot 自动配置机制&#xff0c;SpringBoot 会导入一个类型为 ServletWebServerFactoryAutoConfiguration 的配置类 ServletWebServerFactoryAutoConfiguration ServletWebServerFactoryAutoConfigurations 类上…

C# VS2019 Form 图标的修改

一、 窗口的左上角图标 1、Form的属性中找到Icon项直接选择图标&#xff08;.ico&#xff09;路径,窗口左上角会自动更新选择更新的图标。 Form属性 2.发布后的exe图标

谷粒商城实战笔记-48~49-商品服务-API-三级分类-查询-树形展示三级分类数据-前端优化

文章目录 一&#xff0c;48-商品服务-API-三级分类-查询-树形展示三级分类数据1&#xff0c;创建商品服务命名空间2&#xff0c;商品服务增加配置3&#xff0c;网关增加商品服务的路由配置4&#xff0c;前端树形展示5&#xff0c;测试 二&#xff0c;49-商品服务-API-三级分类-…

select for update作用

SELECT ... FOR UPDATE 是 MySQL 中用于实现行级锁的一种机制。它通常在事务处理中使用&#xff0c;以确保在读取和修改数据的过程中&#xff0c;事务不会对这些数据进行并发修改&#xff0c;从而避免脏读、不可重复读等并发问题。 以下是 SELECT ... FOR UPDATE 的主要作用和…

航空机载总线介绍——ARINC429总线

航空机载总线是现代航空电子系统中的重要组成部分&#xff0c;它们负责在机载电子设备之间传递信息&#xff0c;实现各个系统之间的协同工作。其中&#xff0c;ARINC429总线作为早期广泛应用于民用航空领域的数字式信息传输总线&#xff0c;具有其独特的技术特点和广泛的应用场…