Rails自带memcache-client,作为操作memcached缓存的客户端,然而最近我却在糗事百科的后台中发现大量的MemCacheError,我起初以为是memcached的问题,以保守参数重新编译了memcached,发现问题依旧。
最后通过替换成libmemcached才解决了这个问题(至今没有搞明白为什么)
并且在使用memcache-client的过程中发现了两个问题。
1. 如果通过Rails中的mem_cache_store来调用memcache-client,那么increment和decrement操作只能针对使用了:raw=>true参数的缓存才有效,因为mem_cache_store是默认将数据使用Marshal进行序列化的。
2. memcache-client支持get_multi,也就是向memcached一次请求多个key,但是其文档中明确说明,默认获取数据进行过Marshal的,raw数据就只能自己写multiget了。然而libmemcached可以直接通过get操作获取多个key,并且支持指定是否要序列化。
测试下来,我推荐最好使用Ruby的memcached这个gem来操作memcached,因为它这个gem是一个使用了libmemcached的C扩展,相对于纯ruby的memcache-client效率高出很多,而且功能更加强大,可以使用二进制协议和udp协议,能最大限度发挥memcached的效率。
要在Rails中使用libmemcached作为cache store,可以安装LibmemcacheStore 的Rails插件,然后指定以下配置,API符合Cache Store标准
最后通过替换成libmemcached才解决了这个问题(至今没有搞明白为什么)
并且在使用memcache-client的过程中发现了两个问题。
1. 如果通过Rails中的mem_cache_store来调用memcache-client,那么increment和decrement操作只能针对使用了:raw=>true参数的缓存才有效,因为mem_cache_store是默认将数据使用Marshal进行序列化的。
2. memcache-client支持get_multi,也就是向memcached一次请求多个key,但是其文档中明确说明,默认获取数据进行过Marshal的,raw数据就只能自己写multiget了。然而libmemcached可以直接通过get操作获取多个key,并且支持指定是否要序列化。
测试下来,我推荐最好使用Ruby的memcached这个gem来操作memcached,因为它这个gem是一个使用了libmemcached的C扩展,相对于纯ruby的memcache-client效率高出很多,而且功能更加强大,可以使用二进制协议和udp协议,能最大限度发挥memcached的效率。
要在Rails中使用libmemcached作为cache store,可以安装LibmemcacheStore 的Rails插件,然后指定以下配置,API符合Cache Store标准
config.cache_store = :libmemcached_store