redis和memcache都是nosql,搜索redis和memcache的区别有利于理解两者原理和性能的优劣
(一)redis
下载安装并运行redis-server.exe,下载的redis包里面是没有配置文件redis.conf的,但是可以网上找。如果没有自己自定义配置文件,redis运行时是会运行默认的配置文件的
但是如果要运行自己的配置文件,如以下文件夹中的redis.conf的话,可以用命令行的形式运行
在命令行中输入
redis-server.exe redis.conf运行
,配置文件的具体属性,在网上可以查找,由于默认配置文件的端口是6379,这时候,如果自己的配置文件也是6379,运行结果就会有以下问题
这是端口冲突的原因,解决方法就是修改端口,这里修改为6378
运行redis服务成功!
redis有几种持久化的方法,主要是rdb和aof的方法,去持久化或者是关闭持久化方法是修改redis.conf(默认是rdb的持久化方法,可以在redis-server.exe的同目录下看到dump.rdb文件)
将配置文件中的
#save 900 1
#save 300 10
#save 60 10000
注释掉,或者save ""
这样,redis的数据就只存在内存中,没有持久化到硬盘中,有利于提高存储速率
用java客户端调用redis编程
首先要下载jedis-2.4.1.jar包,然后编写代码
package org.test.reids;
import java.util.Date;
import redis.clients.jedis.Jedis;
public class RedisMain {
public static void main(String args[]) {
Jedis test = new Jedis("127.0.0.1", 6378);
long beforeInsertTime = new Date().getTime();
//设置数据
//setData(test);
long afterInsertTime = new Date().getTime();
long differInsertTime = afterInsertTime - beforeInsertTime;
System.out.println("beforeSelectTime:" + beforeInsertTime + "ms");
System.out.println("afterSelectTime:" + afterInsertTime + "ms");
System.out.println("differTime:" + differInsertTime + "ms");
long beforeSelectTime = new Date().getTime();
//取数据
//getData(test);
String key = "189_99999";
//String value =test.hget(key,"99999");
String value =test.get(key);
long afterSelectTime = new Date().getTime();
System.out.println(key+":"+value);
long differTime = afterSelectTime - beforeSelectTime;
System.out.println("beforeSelectTime:" + beforeSelectTime + "ms");
System.out.println("afterSelectTime:" + afterSelectTime + "ms");
System.out.println("differTime:" + differTime + "ms");
}
public static void setData(Jedis test){
//test.set("电话号码","电话号码,标签1,标签2,标签3");
for(int i=0; i<1000000; i++) {
test.set("189_"+i, "189"+i+",a");
//test.hset("189_"+i,""+i ,"189"+i+",a");
}
}
}
用代码来测试100w条数据中取一条数据的速度,在2g内存,win7的机器上机器上大概20+ms~30+ms
(二)memcached
安装并启动memcached
用java客户端调用memcached编程
首先下载包java_memcached-release_2.6.6.zip,包下有
package org.test.memCached;
import java.util.Date;
import com.danga.MemCached.MemCachedClient;
import com.danga.MemCached.SockIOPool;
public class MemcachedMain {
public static void main(String args[]) {
/* 初始化SockIOPool,管理memcached的连接池 */
String[] servers = { "127.0.0.1:11211" };
SockIOPool pool = SockIOPool.getInstance();
pool.setServers(servers);
pool.setFailover(true);
pool.setInitConn(10);
pool.setMinConn(5);
pool.setMaxConn(250);
pool.setMaintSleep(30);
pool.setNagle(false);
pool.setSocketTO(3000);
pool.setAliveCheck(true);
pool.initialize();
/* 建立MemcachedClient实例 */
MemCachedClient test = new MemCachedClient();
long beforeInsertTime = new Date().getTime();
//设置数据
//setData(test);
long afterInsertTime = new Date().getTime();
long differInsertTime = afterInsertTime - beforeInsertTime;
System.out.println("beforeSelectTime:" + beforeInsertTime + "ms");
System.out.println("afterSelectTime:" + afterInsertTime + "ms");
System.out.println("differTime:" + differInsertTime + "ms");
long beforeSelectTime = new Date().getTime();
//取数据
String key = "189_99";
//存100万条数据的时候,一些开头的数据差不多,为null值,是因为内存不够
//String key = "189_99";//取出的值为null
//String value =test.hget(key,"99999");
String value =(String)test.get(key);
long afterSelectTime = new Date().getTime();
System.out.println(key+":"+value);
long differTime = afterSelectTime - beforeSelectTime;
System.out.println("beforeSelectTime:" + beforeSelectTime + "ms");
System.out.println("afterSelectTime:" + afterSelectTime + "ms");
System.out.println("differTime:" + differTime + "ms");
/*连接服务失败的时候在控制台不会输出,也不会报错,用以下代码输出可以看时候连接memcached成功
* MemCachedClient memCachedClient = new MemCachedClient();
for (int i = 0; i < 10; i++) {
boolean success = memCachedClient.set("" + i, "Hello!");
String result = (String) memCachedClient.get("" + i);
System.out.println(String.format("set( %d ): %s", i, success));
System.out.println(String.format("get( %d ): %s", i, result));
}*/
}
public static void setData(MemCachedClient test){
//test.set("电话号码","电话号码,标签1,标签2,标签3");
for(int i=0; i<1000000; i++) {
test.set("189_"+i, "189"+i+",a");
//test.hset("189_"+i,""+i ,"189"+i+",a");
}
}
}
用代码来测试100w条数据中取一条数据的速度,在2g内存,win7的机器上机器上大概40+ms
注意:要注意的问题是
(1)
连接服务失败的时候在控制台不会输出,也不会报错,用代码输出可以看时候连接memcached成功
(2)存100万条数据的时候,一些开头的数据查不到,为null值,是因为内存不够
(3)关闭memcached服务后,重新启动服务还是可以查询到数据,这时候就需要清除缓存了
第一、连接:telnet 127.0.0.1 11211
第二、按回车键
第三、flush_all 后回车
控制台显示OK,表示操作成功
第二、按回车键
第三、flush_all 后回车
控制台显示OK,表示操作成功
用这种方法可以清除
但是redis在关闭服务后,如果没有持久化,也就是数据没有备份到硬盘中,重启后就读不到数据