(原)使用 memcache 使用过程中可能遇到的问题
在项目优化中,使用到了memcache,刚开始不能用,后来期间总会偶尔抛出异常,刚开始怀疑动态库版本问题,后来尝试了各种替换依旧误解,搞得我日思夜想的,天天惦记着他。。=_=
下午拿出半天时间,进行错误精准定位,问题解决了,,,整理一下,可能会遇到的问题。
一、MemcachedClient 对象或者所在的类为静态全局的,否则,会因为多实例共抢bufferstream资源导致异常。如下图:

二、存入的缓存中的key值中不能包含空格,否则,会偶尔抛出上图错误。key的长度理论上不能超过250字节,value值不能超过1M,永久期限的最长期限是30天(程序内部决定)。
三、如果项目中使用了log4,则需要log4动态库,memcache动态库以及ICSharpCode.SharpZipLib动态库版本一致,否则引起log程序集版本问题。最佳解决方案,下载一个动态库包,包含这三个动态库的那种。
四、如果存取“值”类型的数据,在获取前,一定要判断是否存在该键值,避免 int a=null; 这种错误。
-------------------------------------------------------------------------------------------------------
关于memcache服务集群时,客户端默认使用的路由算法验证问题:
关于路由使用到的算法(余数哈希、一致性哈希),请参考以下两篇不错的博文:
http://www.cnblogs.com/mecity/archive/2011/06/13/Memcached.html
http://www.cnblogs.com/xrq730/p/4948707.html
实验设计思路:
按照余数哈希和一致性哈希算法的特点,我们手动创建几个key值,其特点是,key值的哈希值差异较大,按服务器数取余后分布均匀,添加服务器 时,取余后较之以前差异大,但与之前部分取余有交叉。取某一版本client实验,如果路由规则是余数哈希算法,则键值会按照取余后的百分比分配到各个服务器上。如果是一致性哈希算法,则会在服务器上分布不均。添加服务器后,因为键值特殊设计,如果是余数哈希算法,取值的命中率将会骤降,而如果是一致性哈希算法,则命中率虽有下降,但影响不大。
测试客户端版本号:

memcache服务集群:

源码:

运行结果:

命中情况:

增加一个memcache服务器时:


运行结果:

结果表明上述程序中的推测正确。
命中情况:

根据上述设计思想及实验结果可知,此版本的客户端路由算法为余数哈希法。因为有三台服务器,六个键值的哈希值取余后刚好平局命中0/1/2 三个数,而实际服务器上的键值存取也平均分配到了三台服务器上。当增加一台服务器时,六个键值的哈希值余数结果仅有一个与之前一致,而实验结果刚好仅有一个值被命中。两种表现共同佐证了路由算法为余数哈希法。并且根据实验结果,可以推测出,键值 c 和 e 被存储到了11213服务器,a 和 d 被存储到了11214 服务器,b 和 f 被存储到了 11212 服务器。
附实际键值存储位置,以验证上述结论中的键值分布推测:



根据相关文档说明,新版的客户端已使用一致性哈希算法进行路由。因暂时未找到较新的动态库,此说法暂时搁置,以待后续验证。
(原)使用 memcache 使用过程中可能遇到的问题的更多相关文章
- UITableView使用过程中可能遇到的问题
前言:记录一些UITableView使用过程中可能遇到的问题 环境:Xcode9 解决UITableViewStyleGrouped类型的TableView的cell距离顶部有距离的问题: table ...
- 单点登陆CAS安装过程中可能遇到的问题
可能遇到的问题: 错误: java.security.cert.CertificateException: No name matching localhost found 原因: keystore里 ...
- Hadoop/Spark环境运行过程中可能遇到的问题或注意事项
1.集群启动的时候,从节点的datanode没有启动 问题原因:从节点的tmp/data下的配置文件中的clusterID与主节点的tmp/data下的配置文件中的clusterID不一致,导致集群启 ...
- 【甘道夫】HBase开发环境搭建过程中可能遇到的异常:No FileSystem for scheme: hdfs
异常: 2014-02-24 12:15:48,507 WARN [Thread-2] util.DynamicClassLoader (DynamicClassLoader.java:<in ...
- hadoop环境配置过程中可能遇到问题的解决方案
Failed to set setXIncludeAware(true) for parser 遇到此问题一般是jar包冲突的问题.一种情况是我们向java的lib目录添加我们自己的jar包导致had ...
- DB2安装过程中可能遇到的错误
WARNING:DBT3534W The db2prereqcheck utility determined that ASLR is set to ON and that this could c ...
- Java 实现Excel表数据的读取和写入 以及过程中可能遇到的问题
问题1:Unable to recognize OLE stream 格式的问题要可能是因为给的数据是2010年的数据表后缀为.xlsx,要先转化成2003版的后缀为.xls 问题2: Warning ...
- vue及Eelement使用过程中遇到的一些问题
在做项目的过程中,目前主要遇到了以下几个问题: 一.样式问题 1.样式中使用scoped的问题: 主要表现在从一个页面跳到另一个页面时,第二个页面的样式不能正确显示,通过刷新才能恢复页面的预定样式. ...
- nginx源码编译以及源码编译过程中遇到的问题
本文主要讲nginx安装以及安装过程中遇到的问题. 谈到nginx 必须聊聊它的起源和发展. nginx是由俄罗斯工程师Igor Sysoev 用C语言开发的一个免费开源的Web服务器软件,于2004 ...
随机推荐
- mvc框架的学习步骤
1 搭建环境.有个感性认识 2 如何完成controller和viewer的映射 3 如何把值传给controller 4 controller如何把值传给view 5 异常处理 6 页面标签 7文件 ...
- 【Javascript】 DOM节点
HTML文档中一切都是节点! 整个文档是文档节点: 注释是注释节点: 每一个HTML元素都是一个元素节点: 元素内的文本内容是文本节点: 连元素的每一个属性都是一个属性节点. 看到这些是不是感觉很熟悉 ...
- EntityFrameWork Code First 多对多关系处理
场景2: 一个文章类别(Category)下含有多篇文章(Article),而文章也可能对应多个类别 Article和Category的代码更改如下: /// <summary> /// ...
- Java TCP/IP与HTTP协议个人总结(原创)
首先举个例子方便理解: 1.应用层(http.ftp)就类似:淘宝.京东.易购等网购网站,主要用来负责选择购买商品(制定协议). 2.传输层(TCP.UDP)就类似:中通.申通等物流公司,主要负责传送 ...
- Mybatis-动态SQL语句
有些时候,sql语句where条件中,需要一些安全判断,例如按某一条件查询时如果传入的参数是空,此时查询出的结果很可能是空的,也许我们需要参数为空时,是查出全部的信息.使用Oracle的序列.mysq ...
- Excel的Sheet页复制
最近在做一个项目,其中涉及基于模板对Excel的Sheet页进行复制.在网上尝试了很多,发现都不够完美,苦恼. 然后在查阅资料的过程中,发现有一篇提及,POI的API只对同一个Excel文件中的She ...
- python中循环删除list和dict类型注意事项
列表和字典在循环操作(增删)时,其长度会改变 # 删除 li = [11, 22, 33, 44, 'rock']中索引为单数的元素 # 方法一 del li[1::2] print(li) # [1 ...
- js两个字符串明明一样却判断显示不相等
一.问题 两个字符串看起来一样.类型一样,判断str1==str2时返回false: 二.原因 字符串可能含有其他特殊字符:换行符(%D).空格(%20)...一般不显示. 三.如何判断 encode ...
- javascript闭包中循环问题
如下的html,为什么每次输出都是5,而不是点击每个p,就alert出对应的1,2,3,4,5. <html > <head> <meta http-equiv=&quo ...
- Makefile一 头文件及库搜索路径
头文件及库搜索路径 头文件的搜索路径: 头文件的搜索规则是:找到就使用,停止继续往下寻找 1: #include “mytest.h” 搜索的顺序为: (1)先搜索当前目录 (2)然后搜索编译时 -I ...