Java-用redis做像memcache的缓存如何设计?
想利用redis作为缓存,将查询结果缓存起来,像memcache的效果。但是jedis(java客户端)的参数只接收String或者byte[]参数,那么Object如何设计存储呢?
我先找的做法是将结果拼接成字符串存储,取出来再将字符串分割,但是这样简单的内容可以,大的对象就太麻烦了。如果将Object序列化、反序列化的性能如何保证呢?Memcache的客户端是怎么做的来存取Object的呢?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(7)
一样的啊,就是序列化。你想,你的缓存客户端到缓存服务端,之间的网络传输,不序列化怎么传输?随便看一个memcached的客户端源码就明白了,序列化慢?转字符串就快?字符串就不是Object?jdk自带序列化不如想象中的慢。如果觉得还是不行。hessian的序列化是公认做的比较好的。可以参考。
建议使用Google Protocol Buffer,我在实际生产环境中实践过,效果不错。java客户端搭配的是jedis
KEY的设计就是字符串拼接的形式:
比如[user]::[id]::[act]。
REDIS中给了多种VALUE的类型,一般来说是可以满足绝大部分需求的。
我不太清楚JAVA是否有支持redis的包,如果有应该是支持自动序列化和反序列化的。
P.S:一般需要序列化存储的都会有更好的方法使用redis自带的type来存储。
jedis的原生接口只支持基本数据类型和String型,及byte数组等。如果需要像memcached一样直接存取对象,必须手动实现对象的序列化,同样从server取出的时候需要反序列化。建议lz尝试下使用json。
mem也是把对象的序列化和反序列化
应该采用通用的序列化与反序列化方法,例如使用Google Protocol Buffer,将对象打成二进制流存入redis,这样能保证数据量最小同时序列化/反序列化开销也小~
memcache存取对象是序列化和反序列化。redis可以在客户端自行实现。
如果非要存储对象,这部分工作必然要做,区别只在在哪里做,有无经过验证的第三方代码,自己开发必然是一部分工作量,这个东西开发的质量不高,会导致CPU过高的。
我在项目中使用memcache不会缓存对象,而是存储json字符串。因为频繁的序列化和反序列化会占用cpu,所以我们这样使用可以降低memcache服务对CPU的要求。一般部署memcache的主机都是内存比较空闲的主机,而把解析json这部分工作移到应用内部,应用所在主机的CPU配置必然是高的。这样可以有效的利用主机资源。