package spymemcached; import java.io.IOException; import java.net.InetSocketAddress; import java.util.Random; import java.util.concurrent.CountDownLatch; import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.atomic.AtomicInteger; import net.spy.memcached.CASValue; import net.spy.memcached.MemcachedClient; import net.spy.memcached.internal.OperationFuture; /** * * @author fairjm * fair-jm.iteye.com * */ public class MemcachedCASSpec { public static final int CONCURRENT_THREAD_NUM = 100; public static void main(String[] args) throws IOException, InterruptedException { final MemcachedClient mc = new MemcachedClient(new InetSocketAddress("10.1.2.194", 11211)); ExecutorService executor = Executors.newFixedThreadPool(CONCURRENT_THREAD_NUM); final CountDownLatch countDown = new CountDownLatch(CONCURRENT_THREAD_NUM); final AtomicInteger oks = new AtomicInteger(0); final AtomicInteger okThenModifieds = new AtomicInteger(0); for (int i = 0; i < CONCURRENT_THREAD_NUM; i++) { executor.execute(new Runnable() { @Override public void run() { Random ran = new Random(Thread.currentThread().getId() + System.currentTimeMillis()); int num = ran.nextInt(10000); boolean isOk = false; while (!isOk) { OperationFuture<Boolean> future; CASValue<Object> oldValue = mc.gets("testKey"); // 不存在的情况 此时进行CAS操作 无论指定什么key 正常返回都会是NOT_FOUND需要手工插入 // 这里存在问题 需要用锁 实际使用进行CAS前最好保证key已经存在 if (oldValue == null) { future = mc.set("testKey", 0, num); try { future.get(); } catch (InterruptedException | ExecutionException e) { e.printStackTrace(); } isOk = true; } else { switch (mc.cas("testKey", oldValue.getCas(), num)) { case OK: oks.incrementAndGet(); System.out.println("OK"); isOk = true; break; // key不存在的情况 需要进行add(set也可以)操作 case NOT_FOUND: System.out.println("NOT_FOUND"); break; // 冲突 现有的CASID低于memcached中的 case EXISTS: System.out.println("Exists retry"); break; // 参数有问题 case OBSERVE_ERROR_IN_ARGS: System.out.println("error in args"); break; // 操作超时 case OBSERVE_TIMEOUT: System.out.println("timeout"); break; // 操作成功 但是在观察期间又被修改了(更新成功后马上被修改) case OBSERVE_MODIFIED: System.out.println("succeed but modified then"); isOk = true; okThenModifieds.incrementAndGet(); break; } } } countDown.countDown(); } }); } countDown.await(); System.out.println("testKey:" + mc.get("testKey")); System.out.println("count:" + (oks.get() + okThenModifieds.get())); if (mc != null) { mc.shutdown(); } executor.shutdown(); } }
对memcached有版本要求 低版本不支持CAS
感觉怪怪的 key不存在的时候拿不到CAS ID也不能用CAS了....只有自己add(或set) 需要用锁....
相关推荐
- **操作类型**:支持GET、SET、DELETE等多种基本操作,以及CAS(Compare and Swap)原子操作,保证了数据的一致性。 - **序列化**:提供多种序列化策略,如Java序列化、FST序列化等,适应不同场景的需求。 - **...
- 数据一致性:如果数据需要强一致,需要结合CAS操作来保证。 - 资源管理:合理分配内存资源,防止Memcached因内存耗尽而崩溃。 通过以上介绍,我们可以了解到Memcached在Java应用中的重要作用和使用方式。了解并...
Memcached是一种高性能、分布式内存对象缓存系统,用于在分布式环境中快速...同时,理解Memcached的数据模型(如键值对、生存时间和CAS(Compare and Swap)操作)以及其工作原理,有助于更好地利用这个高效缓存系统。
1. Spymemcached:由LinkedIn开发的Java客户端,它提供了简单的API接口,支持异步操作,性能出色。 2. Xmemcached:另一个流行的Java客户端,它提供了丰富的功能,如支持命令行参数,支持SSL连接,以及支持自动重连...
- **并发控制**:使用`CAS`(Compare and Swap)操作确保并发环境下的数据一致性。 通过以上介绍,我们可以看到使用Java客户端开发Memcached并不复杂,关键在于理解其工作原理,并结合业务需求进行有效利用。在实际...
此外,对于大量数据操作,可以使用批量操作接口,如`append`、`prepend`、`cas`(比较并交换)等。 为了提高性能,Memcached采用了一种称为 slab 分配的内存管理机制,将内存分割成预定义大小的块,以避免内存碎片...
在实际应用中,确保正确配置和管理连接池至关重要,因为连接池能够提升并发处理能力,但需要保证数据之间的独立性,或者使用CAS(Check-And-Set)操作来保证操作的原子性。同时,监控JMX指标可以帮助了解系统运行状况...
- `gets(key)`: 类似于`get`,但返回带有CAS(Compare and Swap)标记的值,用于乐观锁操作。 #### 3. 删除操作 - `delete(key)`: 删除指定key的缓存项。 #### 4. 其他操作 - `incr(key, delta)`: 对key的值执行...
- **Key-Value操作**:基本的get、set、delete等操作,以及更复杂的操作如cas(check and set)用于保证数据一致性。 - **过期时间**:设置缓存项的生命周期,以便在指定时间后自动删除。 - **分布式哈希**:在多台...
此外,XMemcached还支持更复杂的操作,如批量操作、CAS(Compare and Swap)操作以及异常处理等。对于大型项目,可以通过配置连接池和一致性哈希策略来优化性能和数据分布。 总结,XMemcached作为Java环境下优秀的...
为了实现更高效、安全的缓存策略,你可以进一步研究Memcached的特性,如CAS(Compare and Swap)操作、持久化、分布式哈希等。同时,了解如何在大型分布式系统中优化Memcached的配置和使用,以充分发挥其性能优势,...
- **数据一致性**:如果数据更新频繁,考虑使用CAS(Compare and Swap)操作来保证一致性。 - **分布式部署**:在多台服务器上部署Memcached,通过一致性哈希算法实现数据的均匀分布。 ### 其他相关资源 描述中的...
`java_memcache`相关的JAR文件通常包含了Java Memcached客户端库,如Xmemcached或spymemcached,这些库提供了API,让Java开发者能够方便地在Java应用中集成和使用Memcached服务。 在Windows环境下部署和使用...
- **并发控制**:使用适当的并发控制机制,如CAS(Compare and Swap)操作,确保数据的一致性。 **6. 其他相关技术** 除了Memcache,还有许多类似的缓存系统,如Redis、MongoDB的缓存功能、Varnish等。这些系统各...
- **缓存一致性**:在分布式环境中,需要考虑缓存与数据库的一致性问题,如使用缓存失效策略或更新时的CAS(Compare and Swap)操作。 - **监控与维护**:定期监控Memcached的性能指标,如命中率、内存使用情况,...
需要注意的是,使用连接池时,必须确保数据之间的独立性或采用CAS操作以保持一致性。 **9. 可扩展性** - **基于Yanf4j框架**:XMemcached基于Java NIO框架Yanf4j构建,具有清晰的结构和良好的分层设计,易于扩展和...