关于Memcached CAS协议

保研考研机试攻略:第一章——从零开始 🧊保研考研机试攻略:第一章——从零开始 阅读详情

个人小结:简单来说,CAS(Check and Set)是一个确保并发一致性的机制,属于“乐观锁”范畴;原理很简单:拿版本号,操作,对比版本号,如果一致就操作,不一致就放弃任何操作,操作后版本号加1。

联想另外一个机制,与这个有点类似:防重复提交

1.makeToken:server生成一个token,并传到页面中,也就是版本号(只要不刷新页面,这个值都不变);

2.checkValid:提交时对比页面传来的token和server中的token,如果相同则提交,不同则放弃;

3.makeToken:更新server中的token。


Struts1与Struts2的原理类似,只不过前者需要开发者手动调用相应函数,后者可以使用拦截器更简洁的完成。

----------参考文章------------------

引用:http://langyu.iteye.com/blog/680052

什么是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端被其它线程更改过,就放弃此次修改( 乐观锁概念)。 


Java代码   收藏代码

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处理没有问题。 

Java代码   收藏代码

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,那么表示验证成功。 

不足之处,诚请提出!
PCL 法向量夹角剔除错误匹配点对【2026最新版】 实现了一种简单的基于对应点法线角度的对应关系去除方法。博客长期更新,本文最新更新时间为:2026年5月24日。 阅读详情

相关推荐

【实战解析】RTL8306MB交换芯片驱动开发中的RMII接口调试陷阱

本文深入剖析了RTL8306MB交换芯片驱动开发中RMII接口的典型调试陷阱。通过一个工业网关项目的实战案例,揭示了因硬件原理图设计疏忽导致TX_EN与CRS_DV信号线错接,从而引发网络“哑火”的根本原因。文章详细展示了使用示波器从时钟、数据到控制信号的系统性排查方法,并总结了关键的设计警示与自查清单,为嵌入式网络开发中的软硬件协同调试提供了宝贵经验。

qqq44的博客 1028

memcached cas协议

什么是CAS协议  Memcached于1.2.4版本新增CAS(Check and Set)协议类同于Java并发的CAS(Compare and Swap)原子操作,处理同一item被多个线程更改过程的并发问题。  在Memcached中,每个key关联有一个64-bit长度的long型惟一数值,表示该key对应value的版本号。这个数值由Memcached server

记事本 1163

华为手机连接Win11失败?内核隔离与驱动签名冲突的终极解决指南

在Windows操作系统中,驱动程序是硬件与系统通信的桥梁,其数字签名机制是保障系统内核安全的核心防线。基于虚拟化的安全技术通过强制验证驱动签名,能有效隔离恶意代码,提升系统抵御高级威胁的能力。然而,严格的签名策略有时会与部分硬件驱动产生兼容性问题,导致设备无法识别,直接影响文件传输、应用调试等核心工作流。本文聚焦于华为手机在开启Windows 11内核隔离功能时出现的连接故障,深入剖析驱动签名验证与Hypervisor保护的代码完整性原理,并提供从驱动更新、策略调整到无线替代方案的完整解决路径,帮助用户在

weixin_31309419的博客 348

memcached 的多线程是什么?如何使用它们?

线程就是定律(threads rule)! 在Steven Grimm 和Facebook 的努力下,memcached 1.2 及更高版本拥有了多线程模式。多线程模式允许memcached 能够充分利用多个CPU,并在CPU 之间共享所有的缓存数据。memcached 使用一种简单的锁机制来保证数据更新操作的互斥。相比在同一个物理机器上运行多个memcached 实例,这种方式能够更有效地处理multi gets。 如果您的系统负载并不重,也许您不需要启用多线程工作模式。如果您在运行一个拥有大规模硬件的、

siyuanwai的博客 479

Camera metadata

Camera metadata

weixin_42136255的博客 2527

电子工程师必看:dB与放大倍数快速换算表(附常见误区解析)

本文为电子工程师提供了dB与放大倍数快速换算的实战指南。文章深度解析了分贝的本质与核心价值,并提供了电压/电流与功率增益的速查表及心算技巧。重点剖析了混淆电压与功率dB、-3dB带宽理解等常见误区,并结合示波器、频谱仪测量及系统级应用,帮助工程师在实际工作中高效、准确地运用这一对数工具。

weixin_29214199的博客 654

memcached 的多线程是什么?如何使用它们?内存分配器呢?

您确实确实应该使用内建的 slab 分配器。反复地 malloc/free造成了内存碎片,OS 最终花费大量的时间去查找连续的内存块来满足 malloc 的请求,而不是运行 memcached 进程。memcached 内部对数据的操作是基于很多全局锁的(因此这部分工作不是多线程的)。未来对多线程模式的改进,将移除大量的全局锁,提高memcached 在负载极高的场景下的性能。因为内存被划分成大小不等的 slabs,如果 item 的大小与被选择存放它的 slab 不是很合适的话,就会浪费一些内存。

怀揣梦想,一颗执着于技术的心从未磨灭,内心住着一颗顽强的小强时刻提醒自己层层突破自我,同时也成就他人 388

Python爬虫实战:实时监控美国SEC官网文件更新,助你第一时间掌握市场动态

在资本市场中,信息就是财富。美国证券交易委员会(SEC)官网公开了大量公司披露文件,涵盖财报、招股说明书、内幕交易等重要信息。对投资者、分析师及法律合规人员来说,实时监控这些公开文件具有重要价值。

2201_76125261的博客 594

从认识到精通,一文读懂Memcached知识文集

要实现 Memcached 和 MySQL 的查询,您可以使用 Memcached 作为缓存层,并将 MySQL 作为数据库层。如果数据不在内存中,则 Memcached 会从磁盘中读取数据,并将数据存储在内存中。需要注意的是,虽然 Memcached 允许存储 1MB 大小的 item,但在实际应用中,通常建议将 item 的大小保持在几 KB 以下,以确保更好的性能和缓存效果。如果没有可用的 slab,Memcached 会分配一个新的 slab,将其添加到对应的 slab class 中。

m0_50308467的博客 1405

我的PCB设计经验总结及最容易犯错的100例之二B07

本文总结了PCB设计中的常见错误及解决方法。作者通过记录自身及他人的设计失误,系统归纳了高频、隐蔽且致命的问题,如电容中间穿线、高速信号跨分割、锐角布线等。重点提出从错误中提炼规律,建立分类案例库,并开发自动化检查工具的方法。案例涵盖高速信号处理、电源设计、EMC防护等关键领域,强调通过原理理解和实践验证提升设计质量。文章建议工程师建立个人错误数据库,从被动纠错升级为主动预防,最终形成系统化的设计方法论,提高PCB一次成功率。

启芯硬件的博客 82

2023全国职业技能大赛 网络系统管理 服务部署 Linux部分--基础配置

服务器和客户端基本配置如下表,各虚拟机已预装系统。一、关闭防火墙和Selinux。七、需要使用到的命令详解。三、修改root密码。

weixin_62926639的博客 998

memcached 多线程机制

memcache 使用了多线程。多线程内容主要包含线程监听事件的机制,阻塞还是非阻塞;以及主线程和辅助线程的同步机制。 在监听事件机制方面主线程和辅助线程都使用了基于libevent的非阻塞机制。同步机制则使用了管道,即主线程先写入加锁的缓存区,然后向对应管道中写入命令。辅助线程先监听了管道的读,则可以通过读事件获取通知,做出相应处理。主线程仅仅是监听服务端口。值得注意是命令协议格式仅仅为一个字符,可能是为了处理方便。辅助线程负责解析客户端命令,处理命令,最后关闭相应连接。这些工作都是辅助线程完成,..

762

2026年软考信息安全工程师备考指南

信息安全工程师是信息产业部和人事部举办的软考中新增开的一门考试。软考全称全国计算机技术与软件专业技术资格(水平)考试,这门新开的信息安全工程师分属该考试“信息系统”专业,位处中级资格,是信息产业部和人事部在最新的“国人厅发[2007]139号文件中新增的专业。2016年下半年,第一次开考信息安全工程师(中级)考试。 考试科目: 1.信息安全基础知识,考试时间为150分钟,笔试,选择题; ...

鹿鸣天涯 7393

Memcached CAS协议

Memcached CAS协议介绍CAS(Check And Set)检查后再赋值,是为了解决多线程并发问题而设计的一种解决方案。Memcached于1.2.4版本新增CAS(Check and Set)协议类似于Java并发的CAS(Compare and Swap) 原子操作,处理同一key被多个线程更改过程的并发问题。在Memcached中,每个key关联有一个64-bit长度的long型惟一

小白成长记录 637

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

Memcached CAS 协议

来源:http://langyu.iteye.com/blog/680052 什么是CAS协议  Memcached于1.2.4版本新增CAS(Check and Set)协议类同于Java并发的CAS(Compare and Swap)原子操作,处理同一item被多个线程更改过程的并发问题。  在Memcached中,每个key关联有一个64-bit长度的long型

lba8610的专栏 534

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Memcached之CAS 协议

参考:[url]http://langyu.iteye.com/blog/680052[/url] [b]什么是CAS协议 [/b] Memcached于1.2.4版本新增CAS(Check and Set)协议类同于Java并发的CAS(Compare and Swap)原子操作,处理同一item被多个线程更改过程的并发问题。 在Memcached中,每个key关联有一个64-b...

kld208的专栏 212

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

memcached CAS协议

什么是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开

qq_18536071的专栏 329

Memcached CAS 协议(处理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开始,且同一...

jsczxy2 269

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开始,且同一Memca

4718

Memcached的CAS协议

Memcached于1.2.4版本新增CAS(Check and Set)协议类同于Java并发的CAS(Compare and Swap)原子操作,处理同一item被多个线程更改过程的并发问题。  基本原理非常简单,一言以蔽之,就是“版本号”。每个存储的数据对象,多有一个版本号。我们可以从下面的例子来理解: 如果不采用CAS,则有如下的情景: 第一步,A取出数据对象X; 第二步...

maqianmaqian的专栏 186

Memcached CAS 协议[转]

个线程更改过程的并发问题。 在Memcached中,每个key关联有一个64-bit长度的long型惟一数值,表示该key对应value的版本号。这个数值由 Memcached server产生,从1开始,且同一Memcached server不会重复。在两种情况下这个版本数值会加1:1、新增一个key-value对;2、对某已有key对应的value值更新成功。删除 item版本值不会减小。 例如 Java代码   MemcachedClient client = new Memca

breezylee2009的专栏 154

分布式缓存系统Memcached(十二)——CAS协议

Memcached在1.2.4版本后新增了CAS(Check and Set)协议,主要用于并发控制:memcached中同一个item同时被多个线程(多个客户端)更改的并发问题。CAS协议最本质的东西——版本号,即将每个item都关联一个全局唯一的编号,从而利用该唯一的编号来判断item数据在某个线程操作期间有无被其他的线程所更改(每次更改版本号都会改变,因此可作为判断的标识)。

艰难困苦如同欢乐,终将成为人生最后的财富 849
上一篇: 【学习笔记】AS3快速上手笔记
下一篇: 幂等性 个人理解及应用
fbysss
博客等级 码龄25年 388粉丝 195原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值