`

memcached的并发问题

 
阅读更多

转自:

 

什么是CAS协议

Memcached于1.2.4版本新增CAS(Check and Set)协议类同于Java并发的CAS(Compare and Swap)原子操作,处理同一item被多个线程更改过程的并发问题。

在Memcached中,每个key关联有一个64-bit长度的long型惟一数值,表示该key对应value的版本号。这个数值由Memcached server产生,从1开始,且同一Memcached server不会重复。在两种情况下这个版本数值会加1:1、新增一个key-value对;2、对某已有key对应的value值更新成功。删除item版本值不会减小。

例如

 

Java代码 复制代码 收藏代码
MemcachedClient client = new MemcachedClient(); 
   client.set("fKey", "fValue");  
  //第一次set, 在Memcached server中会维护fKey对应的value的版本号,假设是548; 
 
   client.set("fKey", "sValue");  
  //再次set,则这个fKey对应的value的版本号变为549; 
 
   CASValue casValue = client.gets("fKey"); 
  //这样就可以得到对应key的cas版本号和实际value(各个Memcached client都有类似的对象表示,名字可能不一样,但效果类同),如 casValue.getValue = "sValue",casValue.getCas=549; 

 

CAS协议解决的问题

模拟多个Memcached client并发set同一个key的场景。如clientA想把当前key的value set为"x",且操作成功;clientB却把当前key的value值由"x"覆盖set为"y",这时clientA再根据key去取value时得到"y"而不是期望的"x",它使用这个值,但不知道这个值已经被其它线程修改过,就可能会出现问题。

CAS协议解决这种并发修改问题。有线程试图修改当前key-value对的value时,先由gets方法得到item的版本号,操作完成提交数据时,使用cas方法谨慎变更,如果在本地对item操作过程中这个key-value对在Memcached server端被其它线程更改过,就放弃此次修改(乐观锁概念)。

 

CASValue casValue = client.gets(key);
//*****
//本地的各种处理
//*****
CASResponse response = client.cas(key, newValue, casValue);
//在我取数据时item的版本号是casValue.getCas(),所以提交时我期望item的版本号是没有改变过的。如果被修改过,不是我取数据时的版本号,那么Memcached server对这次提交什么也不做,返回true或false由用户自己来提出解决方案(什么也不做或是重新获取版本号,再次重试提交等)

 

并发环境下的正确性验证

用多个Memcached client并发更改同一个key值,将value递增,如果  操作次数-CAS失败次数 = value增加的值,表示并发环境下CAS处理没有问题。

import java.io.IOException;
import java.net.InetSocketAddress;

import net.spy.memcached.CASResponse;
import net.spy.memcached.CASValue;
import net.spy.memcached.MemcachedClient;


public class CASTest {
	
	private static MemcachedClient client = null;
	
	static {
		try {
			client = new MemcachedClient(
                                new InetSocketAddress("localhost", 11211));
		} catch (IOException o) {
			o.printStackTrace();
		}
	}

	public static void main(String[] args) throws Exception {
		//Firstly, the key should exist.
		//key is "number", value is Integer 1, 7845 is expire time
		client.set("number", 7845, 1);
		
		
		CASTest testObj = new CASTest();
		//start the multithread environment
		for (int i = 0; i < 10; i++) {
			testObj.new ThreadTest("Thread-" + (i + 1)).start();
		}
	}
	
	/**
	 * Each thread runs many times
	 */
	private class ThreadTest extends Thread {
		
		private  MemcachedClient client = null;
		ThreadTest(String name) throws IOException {
			super(name);
			client = new MemcachedClient(
                                  new InetSocketAddress("localhost", 11211));
		}
		
		public void run() {
			int i = 0;
			int success = 0;
			while (i < 10) {
				i++;
				CASValue<Object> uniqueValue =client.gets("number");
				CASResponse response = client.cas("number",   
                 uniqueValue.getCas(), (Integer)uniqueValue.getValue() + 1);

				if (response.toString().equals("OK")) {
					success++;
				}
				System.out.println(Thread.currentThread().getName() + " " +  i 
                  + " time " + " update oldValue : " + uniqueValue 
                  +  " , result : " + response);
			}
			
			if (success < 10) {
				System.out.println(Thread.currentThread().getName()
                      + " unsuccessful times : " + (10 - success ));
			}
		}
	}
}

 每次执行的结果都会不一样,如其中某次的执行结果为: 总共操作100次,冲突47次,且最后value由1涨到53,那么表示验证成功。 


不足之处,诚请提出!

分享到:
评论

相关推荐

    memcached安装包以及MemCachedClient

    在 Memcached 项目中,它可能包含安装步骤、配置选项、命令行参数、常见问题解答等内容。 总结,Memcached 是一个高效的分布式缓存系统,结合 libevent 可进一步提升性能。在Java环境中,可以使用 Spymemcached ...

    Memcached 简单示例

    Memcached是一种广泛使用的开源分布式内存对象缓存系统,它能够为Web应用程序提供高效的缓存解决方案。在本示例中,我们将探讨如何使用C#来利用Memcached进行分布式缓存,从而提升项目的运行效率。 分布式缓存是...

    memcached-1.5.11.tar.gz

    3. 并发处理:Memcached使用libevent库实现事件驱动的非阻塞I/O,能高效地处理大量并发请求。 4. 基于一致性哈希的分布式策略:在多台服务器部署时,Memcached使用一致性哈希算法,保证数据迁移时尽可能少地改变映射...

    memcached1.4.5

    在这个版本中,开发者可能引入了新的特性、优化了性能或者修复了一些已知的问题,使得它在处理高并发请求时更加稳定和高效。 首先,我们来了解一下 Memcached 的基本概念。Memcached 是一个高性能、分布式的内存...

    memcached工具类源码

    - **并发控制**:对于多线程环境,可能需要使用锁或其他并发控制机制,确保数据的一致性和完整性。 5. **性能优化** - **预取策略**:根据访问模式预测可能需要的数据,提前加载到缓存中,减少延迟。 - **缓存...

    Memcached 原理和使用详解

    1. **如何解决数据一致性问题**:由于Memcached的无状态性和内存存储特性,它并不保证强一致性。通常,应用层需要处理可能出现的数据不一致情况。 2. **如何处理内存不足**:当内存满时,Memcached会使用LRU策略删除...

    memcached+tomcat的session共享

    - 数据一致性:虽然memcached提供了一定程度的并发控制,但并非强一致性模型,可能在某些情况下出现数据不一致。 - 依赖外部服务:应用的正常运行依赖于memcached服务的可用性,一旦memcached出现问题,可能影响整个...

    php7 的memcached扩展php_memcached.dll扩展

    在PHP环境中,使用Memcached扩展可以方便地存储和检索数据,尤其适用于处理高并发场景。 `php_memcached.dll`是这个扩展在Windows平台上的动态链接库文件,用于在PHP解释器中启用Memcached功能。在Windows系统上,...

    memcached-1.5.4

    - `memcached`利用libevent库实现非阻塞I/O,能够高效处理大量并发连接,提升了服务性能。 7. **安全性与扩展性** - 虽然`memcached`不直接支持加密,但可以通过部署在安全网络环境中或使用SSL/TLS进行通信增强...

    memcached命令

    ### Memcached 命令详解 #### 一、Memcached简介 Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载。它通过在内存中缓存数据和对象来减少从复杂数据库中检索数据所需的次数,从而...

    hibernate-memcached包

    **hibernate-memcached包** 是一个专为Hibernate框架设计的扩展,目的是将流行的分布式内存缓存系统...通过正确配置和使用,可以显著减少数据库的负载,提高响应速度,为大规模并发的Web应用提供更好的用户体验。

    java使用memcached demo

    - 使用分布式锁处理并发更新问题。 9. **监控和扩展** 可以使用第三方工具(如`mcstat`)监控Memcached的性能,确保其正常运行。随着数据量的增加,可以考虑集群部署,通过一致性哈希算法实现Memcached的水平扩展...

    memcached安装包以及java所需的memcached架包

    在Java应用中集成memcached,可以显著提升数据读取速度,尤其适用于高并发、读多写少的场景。但同时也要注意,memcached并非万能解决方案,对于需要持久化存储和复杂查询的数据,仍需依赖数据库。

    内核态memcached模块

    3. **锁和并发控制**:由于在内核环境中,多线程和中断处理是常见的,因此内核态memcached必须考虑并发访问的同步问题,可能使用自旋锁、读写锁等同步原语来保证数据一致性。 4. **网络协议栈集成**:内核态的...

    memcached1.4.31

    - **并发处理**:Memcached 支持多线程模型,可以同时处理多个客户端的请求,提升了服务的并发性。 ### 4. 协议与接口 Memcached 使用简单易用的文本协议,支持TCP和UDP通信,便于开发人员集成。此外,它提供了...

    memcached1.5.6.rar

    10. **适用场景**:memcached适用于高并发、读取密集型的应用,例如动态网站、API服务、实时数据分析等。 通过以上内容,我们了解了memcached的基本概念、安装与使用方法,特别是在Windows环境下如何利用提供的资源...

    memcached整合hibernate资源合集

    通过学习这些资源,开发者能够更好地掌握如何在实际项目中应用Memcached和Hibernate的整合,提升系统的响应速度和并发处理能力。 此外,了解如何整合Memcached和Hibernate也是提升系统架构设计能力的重要一步。在高...

    memcached全面剖析.pdf

    memcached在实际应用中也表现出色,特别是在需要高并发访问的Web应用程序中。例如,日本的mixi公司就大规模地使用了memcached来加速其Web应用。通过案例研究,我们可以了解到如何在服务器配置、数量、memcached进程...

    Memcached相关DLL文件

    Libevent提供了异步事件通知机制,使得Memcached能够高效地处理并发请求。 2. libmemcached.dll:这是Memcached的客户端库,包含了与服务器通信的函数和数据结构。开发人员可以使用这个库来与Memcached服务器进行...

    memcached测试的工具类

    - **并发测试**: 在高并发环境下测试Memcached的处理能力,评估其在多用户同时访问时的性能。 - **压力测试**: 连续大量地设置和获取数据,观察Memcached的响应时间和稳定性,检查是否存在性能瓶颈。 - **内存...

Global site tag (gtag.js) - Google Analytics