(原)使用 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 ...
随机推荐
- selenium+Python(鼠标和键盘事件)
本篇总结了 web 页面常用的一些操作元素方法,可以统称为行为事件有些 web 界面的选项菜单需要鼠标悬停在某个元素上才能显示出来(如百度页面的设置按钮). 1 简单操作 1.点击(鼠标左键)页面按钮 ...
- Visual Studio中修改项目的输出目录
1. 如在Solution中的项目名称为 ProjectA 但在本地目录显示却想换成: MyProject 2. 应该做的修改是: 2.1. 将本地目录的 ProjectA手动修改成 MyProjec ...
- Hibernate各种查询操作(一)
测试数据库如下 t_sort表: t_good表: 一.对象导航方式查询 查询所有食品类下面的食品 代码: //对象导航查询 @Te ...
- PHP常用文件操作
<?php $path = "/home/work/srccode/hello.go"; $dirName = dirname($path); $name = basenam ...
- Firebird hash join
Firebird 现可支持哈希连接(hash join),各中大型数据库,哈希连接已成为平常,相对于循环嵌套连接(Nested Loop Join),在数据量较大的情况下,哈希连接性能较好. 由于 F ...
- [转]oracle update set select from 关联更新
本文转自:http://blog.csdn.net/disiwei1012/article/details/52589181 http://www.blogjava.net/Jhonney/archi ...
- sql语句将数字转为汉字展示
select [表字段Name] , ( case [表字段OrderState] when 1 then '已核销' when 2 then '确认前的移动端取消'when 3 then '已完成' ...
- DIY了一下自己blog的UI
当年才学前端时就想改自己blog的UI,然鹅当时没看见那个“申请JS权限”,一直以为blog不能随意DIY样式,只改了少许CSS.现在重新看看设置管理选项,简单修改了一下样式(注意:修改样式之前发邮件 ...
- 编译器错误消息: CS0012: 类型“System.Object”在未被引用的程序集中定义。必须添加对程序集“System.Runtime, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a”的引用。
编译器错误消息: CS0012: 类型“System.Object”在未被引用的程序集中定义.必须添加对程序集“System.Runtime, Version=4.0.0.0, Culture=neu ...
- C++Array类模板编写笔记
C++Array类模板 函数模板和类模板都属于泛型技术,利用函数模板和类模板来创建一个具有通用功能的函数和类,以支持多种不同的形参,从而进一步简化重载函数的函数体设计. 声明方法:template&l ...