`
javayestome
  • 浏览: 1015837 次
  • 性别: Icon_minigender_2
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

MEMCACHED在集群环境下对并发更新是否保持数据一致

阅读更多

今天在和同事查找菜单数据清CACHE时为什么出问题,其中有谈到MEMCACHED在集群环境下是否会保持数据的一致性,我的印象中好像memcached是有通过版本控制来实现的,不过只是有点模糊的印象,为了查了究竟也为了解决这个问题,我查了一下资料,不过顺便在这里也把菜单系统的CACHE实现在这里YY几句,知道的就当我废话了。
菜单系统有以下几个特点:
1、从其本身上来说,是属于不经常性变化的数据,读取的频率远大于写的频率;
2、从数据量上来看,也不大,也就是数据几K到十K左右的数据;
3、访问量比较大,每天都会有上百万的访问;
4、每个用户都会有菜单数据;
5、菜单系统是属于多个系统共用。
从以上的数据变化性比较小、数据量比较小、访问量比较频繁以、高命中率、属于分布式应用,我们是将菜单数据放到了Memcached中,当然,通常使用Memcached也最好符合这几个条件,否则会起不到相应的效果。
菜单系统本身有权限限制,用户与用户之间看到的菜单是不同的,不过这个权限没有定义到人头的千人千面,是通过用户分组来实现的,用户组的菜单CACHE键是通过当前用户组所具有的权限组合出来的,因为每个用户组可以查看的菜单是确定的,目前的方式是将每个用户组的菜单分别存放到MemCached中,也避免了频繁的读取数据库以及再次验权的问题。不过这个时候产生了一个新的问题,需要将CACHE中用户组的菜单给删除,这样才能够立即展示后台菜单管理系统对菜单操作的变化效果,但是用户组的CACHE键的数量及名称是根据用户拥用的权限组合起来的,也就是CACHE KEYS的值以及数量是不确定的,并且MEMCACHED本身不支持对键的遍历,也就是我们要清除一个菜单CACHE项,首先要知道这个CACHE项的键,菜单后台管理系统是一套单独的系统,为了清理CACHE中所有的菜单数据,后台系统必须要拿到所有用户组的CACHE KEYS,因而就需要有有一个地方存放这些键,现在采取的方式,将所有存放用户组权限菜单的CACHE KEYS,单独存放到一个CACHE项中,在后台菜单和管理系统中清理菜单之前,先获取这个存放所有用户组权限菜单的CACHE KEYS,再根据这个CACHE项中存放的所有CACHE KEYS,循环删除所有的用户组权限菜单CACHE项。
这里插一句memcached的命令执行方式,所有的被发送到memcached的单个命令是完全原子的。如针对同一份数据同时发送了一个set命令和一个get命令,它们不会影响对方。它们将被串行化、先后执行。即使在多线程模式,所有的命令都是原子的,除非程序有bug:)。但是命令序列不是原子的。如果通过get命令获取了一个item,修改了它,然后想把它set回memcached,我们不保证这个item没有被其他进程 (process,未必是操作系统中的进程)操作过。在并发的情况下,也可能覆写了一个被其他进程set的item。
也就是说大家都是操作的同一份存放在MEMCACHED中的CACHE KEYS,在并发的情况也会出现问题的,如原来MEMCACHED中的KES的内容为A,客户端C1和客户端C2都把A取了出来,C1往准备往其中加B,C2准备往其中加C,这就会造成C1和C2执行后的CACHE KEYS要么是AB要么是AC,而不会出现我们期望的ABC。这种情况,如果不是在集群环境中,而只是单机服务器,可以通过在写CACHE KEYS时增加同步锁,就可以解决问题,可是在集群环境中,同步锁是显然解决不了问题的。
不过,也不要悲观,出现问题时,总会有解决办法的出现,memcached 1.2.5以及更高版本,提供了gets和cas命令,它们可以解决上面的问题。如果使用gets命令查询某个key的item,memcached会返回该item当前值的唯一标识。如果覆写了这个item并想把它写回到memcached中,可以通过cas命令把那个唯一标识一起发送给 memcached。如果该item存放在memcached中的唯一标识与提供的一致,写操作将会成功。如果另一个进程在这期间也修改了这个 item,那么该item存放在memcached中的唯一标识将会改变,写操作就会失败。
分享到:
评论

相关推荐

    性能调优 海量并发 系统架构

    Nginx+tomcat集群Memcached+Session复制 高性能高并发服务器架构 基于nginx的tomcat负载均衡和集群 实现多服务器负载均衡 系统性能优化 数据库 Nginx+Squid负载均衡 配置好的集群 总共三十个文档">Apache+Tomcat+...

    Win2008配置Tomcat集群(Nginx返向代理+Memcached单点登录).zip

    本资源除配置文档外,还有所有的安装包或工具,按文档一步一步配置,即可实现Tomcat集群。 简介: 通过Nginx代理多个Tomcat的服务,实现高并发的服务。Tomcat集群通过Memcached来实现共享Session即单点登录。

    分布式集群、PB级别网站性能优化

    大数据高并发服务器实战教程 Linux LNMP部分 Memcached篇 Redis 项目开发准备工作 项目开发(前台UI) 项目开发(前台业务流程) 项目开发(后台管理) 大数据高并发系统架构实战方案 大数据高并发架构实战案例...

    大数据高并发系统架构实战方案(全套视频+代码+课件)

    1.大数据高并发架构实战案例分享-概述 2.Piranha安装快速搭建LVS负载均衡集群 3.LVS负载均衡DR模式安装调试介绍 4.LVS负载均衡深入进阶实战 5.LVS调度策略及负载均衡原理深入 6.LVS深入及NAT集群调试 7.Nginx反向...

    Mysql主从复制+高可用集群+Linux+Nginx+Java+Memcached+Lvs+Redis 实战PB级大型分布式大数据高并发

    我感觉很不错的宝贝,现在和大家分享,希望能够帮到大家,如果你需要可以下载看看,很适合喜欢研究技术的人员

    网站架构技术

    问题: 负载均衡情况下session状态的保持? 解决方案: 基于DNS的负载均衡 反向代理 ngix JK2 数据库的读写分离 问题: 读库与写库的数据同步 解决方案: 不同的数据库都有自己的数据库...

    高性能高并发服务器架构大全

     开源平台的高并发集群思考 26  大型、高负载网站架构和应用初探 时间:30-45分钟 27  说说大型高并发高负载网站的系统架构 28  mixi技术架构 51 mixi.jp:使用开源软件搭建的可扩展SNS网站 51 总概...

    Redis面试专题.pdf

    为什么高并发下有时单线程的 redis 比多线程的memcached 效率要高? 2.redis 主从复制如何实现的?redis 的集群模式如何实现?redis 的 key 是如何寻址的? 3.使用 redis 如何设计分布式锁?说一下实现思路?使用 zk...

    涵盖了 Java 基础、集合、源码、并发、虚拟机、框架、数据库、网络编程、设计模式、新特性和数据结构等多个知识领域的面试突击

    Java基础知识:数据类型、关键字、面向对象、集合框架、异常处理等 Java核心技术:I/O、多线程、网络编程、反射、泛型等 Java虚拟机:内存模型、垃圾收集器、类加载机制等 Java企业级开发:Spring、Hibernate、MyBatis等...

    tomcat6/7/8 集群部署解决Session同步问题的完美解决方案

    网上很多说是支持的,其实都不行,基本上是各个依赖包之间的版本不兼容或者依赖包不全,我这个包是一个一个依赖下载的,完美同步Seesion,解决老架构下的单Web应用,利用集群支持大并发,补救方案。

    决战Nginx: 系统卷 - 高性能Web服务器详解与运维.zip

    然后讲述Nginx如何处理请求,在这个基础之上再认识Nginx提供的服务器的名字,Nginx服务器最大的焦点在于高并发和反向代理,在不多却足够使用的模块下实现了更多的功能。  在第二部分中,通过具体使用实例讲述了...

    决战Nginx: 系统卷 - 高性能Web服务器详解与运维.z01

    然后讲述Nginx如何处理请求,在这个基础之上再认识Nginx提供的服务器的名字,Nginx服务器最大的焦点在于高并发和反向代理,在不多却足够使用的模块下实现了更多的功能。  在第二部分中,通过具体使用实例讲述了...

    大数据常用数据库汇总.pdf

    ⼤数据时代初期,随着数据请求并发量⼤不断增⼤,⼀般都是采⽤的集群同步数据的⽅式处理,就是将数据库分成了很多的⼩库,每个数据 库的数据内容是不变的,都是保存了源数据库的数据副本,通过同步或者异步⽅式保证...

    架构设计方案

    为提高网站的高并发性能,提高开发效率及运营效率,主要按如下几个思路进行规划设计: 2.1.1负载均衡 1)四层交换负载均衡: 采用负载均衡器来实现硬件级的四层交换负载均衡,或采用LVS来实现软件的四层交换负载均衡。 2...

    nginx基础实例培训视频.zip

    目录网盘文件永久链接 01-nginx介绍及编译安装 ...18-第3方模块编译及一致性哈希应用 19-大访问量优化整体思路 20-ab压力测试及nginx性能统计模块 21-nginx单机1W并发优化 22-服务器集群搭建 23-集群性能测试

    最全面的门户网站架构设计方案.doc

    3) 采用Oscache实现页面缓存,采用Memcached实现数据缓存 4) 采用独立的图片服务器集群来实现图片资源的存储及WEB请求 2.1.3 数据存储的设计思路 1) 数据库拆分,把生产数据库和查询数据库分离,对生产数据库采用RAC...

    JAVA上百实例源码以及开源项目源代码

    像坐标控制、旋转矩阵、定时器、生成图像、数据初始化、矩阵乘法、坐标旋转、判断是否是顺时针方向排列、鼠标按下、放开时的动作等,都可在本源码中得以体现。 Java编写的显示器显示模式检测程序 2个目标文件 内容...

    x01-lang-java

    lang-java【技术体系】/ JAVA核心: 多线程并发编程、网络通信(Netty)、JVM虚拟机底层原理/ Linux服务器: 文件系统、基础命令、用户管理、进程管理、SHELL脚本编程/ 分布式数据存储; 关系型数据库(MySQL)、...

    java开源包4

    一个Java的类库,用于异步输出记录的简单小框架用于高并发下数据输出使用。 Java转C++代码工具 J2C J2C 将 Java 代码转成 C++ 代码,这是源码级别的转换,输出的 C++ 代码是有效的代码。 OSGi 分布式通讯组件 R-...

Global site tag (gtag.js) - Google Analytics