redis和memcached的区别与总结

来源:互联网 发布:多益网络有年终奖吗 编辑:程序博客网 时间:2024/06/10 01:32
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,表示操作成功
用这种方法可以清除


但是redis在关闭服务后,如果没有持久化,也就是数据没有备份到硬盘中,重启后就读不到数据
0 0
原创粉丝点击