社区
Hadoop生态社区
帖子详情
请问:memcached中,能否将key分类,然后各个类之间允许有相同的key?
寒冰2046
2012-04-10 03:59:35
比如现在有两张表的主键都用了int类型的字段,如果都缓存到一个memcached进程里面,key就会冲突。
目前想到的方法如下:
1、加标识,比如表A的key做成这样 a123,表B b123
但这样要做字符串合并,略显麻烦,也有性能损耗。
2、开多个memcached进程,但这会导致tcp连接成倍增加,而且管理不方便。
infinispan可以创建多个实例对象,但memcached还没找到相应的方法。
...全文
89
回复
打赏
收藏
请问:memcached中,能否将key分类,然后各个类之间允许有相同的key?
比如现在有两张表的主键都用了int类型的字段,如果都缓存到一个memcached进程里面,key就会冲突。 目前想到的方法如下: 1、加标识,比如表A的key做成这样 a123,表B b123 但这样要做字符串合并,略显麻烦,也有性能损耗。 2、开多个memcached进程,但这会导致tcp连接成倍增加,而且管理不方便。 infinispan可以创建多个实例对象,但memcached还没找到相应的方法。
复制链接
扫一扫
分享
转发到动态
举报
AI
作业
写回复
配置赞助广告
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
memcached
面试专题及答案.pdf
memcached
面试专题及答案
memcached
1
最近一直在做一个项目的前期设计工作,考虑到后期系统的扩展和性能问题也找了很多解决方法,有一个就是用到了数据库的缓存工具
memcached
(当然该工具并不仅仅局限于数据库的缓存)。先简单的介绍下什么是
memcached
。
Memcached
是高性能的,分布式的内存对象缓存系统,用于在动态应用
中
减少数据库负载,提升访问速度。
Memcached
由Danga Interactive开发,用于提升LiveJournal.com访问速度的。LJ每秒动态页面访问量几千次,用户700万。
Memcached
将数据库负载大幅度降低,更好的分配资源,更快速访问。 上网baidu了很多东西,几乎都差不多,而且基于java的说的很少,所有只有在研究了各个其他语言
类
的应用后再来尝试在java上进行简单的操作应用。先从
memcached
上进行说明,
memcached
的最新版是采用c语言进行开发和设计的,据说旧版的是采用perl语言开发的,而且它是一个应用软件来的,是作为缓存服务器的服务器端运行在服务器上的,需要使用特定的语言编写客户端与其进行通信来进行数据的缓存和获取。通常我们是把
memcached
安装运行在web服务器上,然后通过对需要的数据进行缓存,据我目前所知,所有数据的缓存设置和存取操作,以及数据的更新后替换操作全部需要程序来进行,而不是自动进行的(自动不知道能不能成功,呵呵)。下面从一个实际的例子来应用
memcached
。 首先到http://danga.com/
memcached
/下载
memcached
的windows版本和java客户端jar包,目前最新版本是
memcached
-1.2.1-win32.zip和java_
memcached
-release_1.6.zip,分别解压后即可!首先是安装运行
memcached
服务器,我们将
memcached
-1.2.1-win32.zip解压后,进入其目录,然后运行如下命令: c:>
memcached
.exe -d install c:>
memcached
.exe -l 127.0.0.1 -m 32 -d start 第一行是安装
memcached
成为服务,这样才能正常运行,否则运行失败!第一行是启动
memcached
的,作为测试我们就简单的只分配32M内存了,然后监听本机端口和以守护进行运行。执行完毕后,我们就可以在任务管理器
中
见到
memcached
.exe这个进程了。好了,我们的服务器已经正常运行了, 下面我们就来写java的客户端连接程序。 我们将java_
memcached
-release_1.6.zip解压后的目录
中
的java_
memcached
-release_1.6.jar文件复制到java项目的lib目录下,然后我们来编写代码,比如我提供的一个应用
类
如下: package utils.cache; import java.util.Date; import com.danga.
MemCached
.
MemCached
Client; import com.danga.
MemCached
.SockIOPool; /** * 使用
memcached
的缓存实用
类
. * * @author 铁木箱子 * */ public class
MemCached
{ // 创建全局的唯一实例 protected static
MemCached
Client mcc = new
MemCached
Client(); protected static
MemCached
memCached
= new
MemCached
(); // 设置与缓存服务器的连接池 static { // 服务器列表和其权重 String[] servers = {"127.0.0.1:11211"}; Integer[] weights = {3}; // 获取socke连接池的实例对象 SockIOPool pool = SockIOPool.getInstance(); // 设置服务器信息 pool.setServers( servers ); pool.setWeights( weights ); // 设置初始连接数、最小和最大连接数以及最大处理时间 pool.setInitConn( 5 ); pool.setMinConn( 5 ); pool.setMaxConn( 250 ); pool.setMaxIdle( 1000 * 60 * 60 * 6 ); // 设置主线程的睡眠时间 pool.setMaintSleep( 30 ); // 设置TCP的参数,连接超时等 pool.setNagle( false ); pool.setSocketTO( 3000 ); pool.setSocketConnectTO( 0 ); // 初始化连接池 pool.initialize(); // 压缩设置,超过指定大小(单位为K)的数据都会被压缩 mcc.setCompressEnable( true ); mcc.setCompressThreshold( 64 * 1024 ); } /** * 保护型构造方法,不
允许
实例化! * */ protected
MemCached
() { } /** * 获取唯一实例. * @return */ public static
MemCached
getInstance() { return
memCached
; } /** * 添加一个指定的值到缓存
中
. * @param
key
* @param value * @return */ public boolean add(String
key
, Object value) { return mcc.add(
key
, value); } public boolean add(String
key
, Object value, Date expiry) { return mcc.add(
key
, value, expiry); } public boolean replace(String
key
, Object value) { return mcc.replace(
key
, value); } public boolean replace(String
key
, Object value, Date expiry) { return mcc.replace(
key
, value, expiry); } /** * 根据指定的关键字获取对象. * @param
key
* @return */ public Object get(String
key
) { return mcc.get(
key
); } public static void main(String[] args) {
MemCached
cache =
MemCached
.getInstance(); cache.add("hello", 234); System.out.print("get value : " + cache.get("hello")); } } 那么我们就可以通过简单的像main方法
中
操作的一样存入一个变量,然后再取出进行查看,我们可以看到先调用了add,然后再进行get,我们运行一次后,234这个值已经被我们存入了
memcached
的缓存
中
的了,我们将main方法
中
红色的那一行注释掉后,我们再运行还是可以看到get到的value也是234,即缓存
中
我们已经存在了数据了。 对基本的数据我们可以操作,对于普通的POJO而言,如果要进行存储的话,那么比如让其实现java.io.Serializable接口,因为
memcached
是一个分布式的缓存服务器,多台服务器间进行数据共享需要将对象序列化的,所以必须实现该接口,否则会报错的。比如我们写一个简单的测试Bean如下: class TBean implements java.io.Serializable { private static final long serialVersionUID = 1945562032261336919L; private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } } 然后我们在main方法
中
加入如下几行代码: TBean tb = new TBean(); tb.setName("铁木箱子"); cache.add("bean", tb); TBean tb1 = (TBean)cache.get("bean"); System.out.print("name=" + tb1.getName()); tb1.setName("铁木箱子_修改的"); tb1 = (TBean)cache.get("bean"); System.out.print("name=" + tb1.getName()); 我们首先把TBean的一个实例放入缓存
中
,然后再取出来,并进行名称的修改,然后我们再取这个对象,我们再看其名称,发现修改的对象并不是缓存
中
的对象,而是通过序列化过来的一个实例对象,这样我们就无须担心对原生
类
的无意修改导致缓存数据失效了,呵呵~~看来我也是多此一想啊。所以这表明从缓存
中
获取的对象是存入对象的一个副本,对获取对象的修改并不能真正的修改缓存
中
的数据,而应该使用其提供的replace等方法来进行修改。 以上是我在windows下对
memcached
的一点小学习和实践,在以后的项目开发过程
中
将会更深入的学习和应用这一缓存工具,也希望和有兴趣的同行一起讨论学习该工具的使用~~
韩顺平 PHP
Memcached
缓存技术资料源码笔记图解PPT_Ady
韩顺平 PHP
Memcached
缓存技术资料源码笔记图解PPT_Ady
memcached
面试专题.pdf
在学习Java过程
中
,自己收集了很多的Java的学习资料,分享给大家,有需要的欢迎下载,希望对大家有用,一起学习,一起进步。
memcache 应用例子
NULL 博文链接:https://sunney2010.iteye.com/blog/695106
Hadoop生态社区
20,848
社区成员
4,696
社区内容
发帖
与我相关
我的任务
Hadoop生态社区
Hadoop生态大数据交流社区,致力于有Hadoop,hive,Spark,Hbase,Flink,ClickHouse,Kafka,数据仓库,大数据集群运维技术分享和交流等。致力于收集优质的博客
复制链接
扫一扫
分享
社区描述
Hadoop生态大数据交流社区,致力于有Hadoop,hive,Spark,Hbase,Flink,ClickHouse,Kafka,数据仓库,大数据集群运维技术分享和交流等。致力于收集优质的博客
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章