关于Memcached CAS协议

手把手学计科--web网页设计 网页的组成:文字、图像和超链接等元素。还可以包括哦音频、视频和动画。分类:静态(固定信息)和动态(与服务器数据库进行实时的数据交换。HTML和CSS 是一种静态网页搭建技术。 阅读详情

个人小结:简单来说,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,那么表示验证成功。 

不足之处,诚请提出!
JavaScript教程-字符集,Unicode转义序列,标识符,数据类型,数字,未定义值,浮点数,字符串,引用数据类型,类型检测,类型转换,运算符,关系运算符, 前端学习 阅读详情

相关推荐

5分钟搞懂SCMA:稀疏码多址接入的核心原理与实战应用

本文深入浅出地解析了SCMA(稀疏码多址接入)的核心原理与实战应用。通过对比传统正交多址技术,阐释了SCMA如何通过非正交叠加和稀疏码本设计,实现远超资源单元数的用户接入,从而有效应对5G海量机器通信(mMTC)的挑战。文章还探讨了其在上行海量连接、免授权接入等场景的应用潜力及工程实现中的关键考量。

zeta9的博客 262

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

CVPR2021 CenterPoint源码解读:从VoxelNet到两阶段优化的完整实现细节

本文深度解析了CVPR 2021 CenterPoint模型的完整实现细节,从VoxelNet体素化、稀疏卷积Backbone,到基于中心点的检测头与两阶段精修机制。文章提供了从环境搭建、数据预处理到核心代码模块(如热力图生成、关键点特征提取与MLP Refiner)的实战指南,并分享了训练策略、多任务损失调优及可视化调试等关键工程实践,助力开发者深入理解并复现这一高效的3D目标检测框架。

linux的博客 468

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

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

siyuanwai的博客 479

从Unitree B2W到四足机器人:用Isaac Lab构建强化学习奖励函数的5个实战技巧

本文分享了在Isaac Lab仿真环境中,为Unitree B2W等四足机器人设计强化学习奖励函数的5个核心实战技巧。内容涵盖奖励函数的结构化组合、轮腿混合机器人的适配策略、课程学习的动态调整、域随机化增强鲁棒性以及高效的调试可视化方法,旨在帮助开发者构建更稳定、高效的机器人运动策略。

lg888的博客 1065

【Docker】掌握 Docker魔法:Windows 11 平台上的完美容器部署终极指南

【Docker】掌握 Docker魔法:Windows 11 平台上的完美容器部署终极指南 一文搞懂什么是 Docker?分析容器的工作原理、容器的架构、Docker的优势、使用 Docker的原因。 全程手把手教你Docker的安装与使用,配置阿里云镜像加速、容器常用命令!

寸铁的博客 10万+

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

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

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

(三) Debian 安装linuxcnc-ethercat中间件

1.在这里同样的也是需要下载一下依赖包 sudo apt install linuxcnc-uspace-dev 2.依赖包安装完成, 接着执行下面命令 sudo git clone https://github.com/sittner/linuxcnc-ethercat 还是可能出现下载网络错误下载不成功,可以直接下载我已上传百度云linuxcnc目录下 注意一下,后面make可能会出现头文件(xxx.h)的报错提示,在这里给大家一个处理办法 用aptitude 工具可以搞定 sudo apt-get

qq_30065813的博客 827

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

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

m0_50308467的博客 1405

Open3D点云数据处理(六):点云、mesh可视化(Visualizer类)

本文介绍了Open3D中Visualizer类可视化几何对象的方法,给出了常用参数解释和代码示例。

孙悟空 3021

X-AnyLabeling-main标注YOLO关键点POSE

同一物体的框和点的 群组编号 要相同。代表这些点和方框是同一物体上的。标注方框之后记得把后面的。顺序要和你标注的顺序一致。写入1,而且之后的点的。配置导出文件.yaml。

qq_53545309的博客 2102

memcached 多线程机制

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

762

18.EC实战 新建项目工程并配置各个引脚的工作方式(持续更新)

本博文介绍了从零开始新建EC工程及对各个引脚进行了工作模式的初始化配置

qq_30135687的博客 1731

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

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

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

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

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

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、付费专栏及课程。

余额充值