本文有三部分:1、两者不同 2、memcache 3、redis
一、不同点对比:
①从数据存储位置上来分,memcache的数据存在内存中,而redis既可以存储在内存中,也可以存储的到磁盘中,达到持久化存储的功能,memcache一旦断电,数据全部丢失,redis可以利用快照和AOF把数据存到磁盘中,当恢复时又从磁盘中读取到内存中,当物理内存使用完毕后,可以把数据写入到磁盘中。
②从存储数据的类型上来分,memcache和redis存储的方式都是键值对,只不过redis值的类型比较丰富,有string(字符串),hash(哈希),list(列表),set(集合)zset(有序集合),而memcache主要存储的是字符串。
③从架构层次来分,Redis支持master-slave(主—从)模式应用,memcache支持分布式。
④另外从存储数据的大小上来分,Redis单个value的最大限制是1GB,memcached只能保存1MB的数据。但是Memcache在存储100K以上的数据,性能稍微好一点。
⑤另外redis只支持单核,memcache可以支持多核,当然关于redis取代memcache的说法,在一般情况下,两者性能都很高,在大多的业务场景选择上,redis的选择可能更加具有优势,但也不能说可以完全取代,最终还是取决于你的应用场景。
二、memcache
原理:memcached 用 slab allocator(slab分配器) 机制来管理内存
Slab Allocator的基本原理是按照预先规定的大小,将分配的内存分割成特定长度的块,以完全解决内存碎片问题。Slab Allocation的原理相当简单。 将分配的内存分割成各种尺寸的块(chunk),并把尺寸相同的块分成组(chunk的集合)
memcache分布式操作:分到各个服务器,减少服务器压力(在这里不赘述,在我的《高性能的服务器的架设------硬件》有写)
操作:
-
连接
$m=new Memcached();
$m->addServer("127.0.0.1",11211);
-
其他的一些api(add,get等等)
http://php.net/manual/zh/book.memcached.php
-
Set 设置参数 get 读取参数的值 delete 删除
$m->set("name","ljp2"); //设置
echo $m->get("name"); //读取
$m->delete("name"); //删除
//如果键num不存在就set 如果存在就每次刷新页面数值加1 或者减1
if(!$m->get("num")){
$m->set("num",1,0);
}
$m->increment("num",10);
$m->decrement("num",1); //每次刷新页面减少1
echo $m->get("num"); //读取
//同时存储多条数据
$arr=array(
"name"=>"张三",
"sex"=>"男"
);
$m->setMulti($arr,0);
//一次性可以读取多条数据
$getdata=$m->getMulti(array("name","sex"));
print_r($getdata);
//一次性删除多条数据
$m->deleteMulti(array("name","sex"));
//可以获取上一步操作的结果 有两个方法
echo $m->getResultCode(); //这个返回数字 不同的数字代表的意思不同 o--成功 1-失败 还有其他的数字 ...
echo $m->getResultMessage(); //这个返回的是文字说明 success ...
-
面向对象的方式来操作memcache 封装类来单独进行操作
<?php
/**
* Created by PhpStorm.
* User: HP
*/
class MyMemcached{
private $m;
function __construct()
{
$this->m=new Memcached();
$this->m->addServer("127.0.0.1",11211);
}
public function setData($key,$value,$time=0){
$this->m->set($key,$value,$time);
if($this->m->getResultCode() !=0){
$this->$this->getError();
}
}
public function getData($key){
$data= $this->m->get($key);
if($this->m->getResultCode() !=0){
$this->getError();
}else{
return $data;
}
}
public function deleteData($key){
$this->m->delete($key);
if($this->m->getResultCode() !=0){
$this->$this->getError();
}
}
public function getError(){
echo $this->m->getResultMessage();
}
}
三、redis
- Redis的简介:Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API
- 使用redis 的公司:GitHub twitter stackoverflow 新浪微博 搜狐 知乎 美团 腾讯 …
- 适用场景:
- 应用程序直接访问redis 只有当redis访问失败时才访问mysql
- 取最新N个数据的操作
- 排行榜应用 取top n操作
- 计数器应用
- 实时系统等
- 通过pub/sub构建实时消息系统http://blog.csdn.net/lk10207160511/article/details/50364088
以下为安装过程
- wget http://labfile.oss.aliyuncs.com/files0422/redis-2.8.9.tar.gz
- tar -zxvf redis-2.8.9.tar.gz
- cd redis-2.8.9 开始make和 make install命令安装
- 之后在src文件夹中会生成6个文件
redis-server(启动服务端)、redis-cli(调用客户端)、redis-benchmark、redis-check-aof、redis-check-dump、redis-sentinel
- 建立redis配置目录
mkdir /etc/redis
mkdir /var/redis
mkdir /var/redis/log
mkdir /var/redis/run
mkdir /var/redis/6379
- 复制配置模板文件
cp redis.conf /etc/redis/6379.conf
修改6379.conf配置项 daemonize(守护进程,可以在后台运行,配置redis作为守护进程运行
# 默认情况下 redis 不是作为守护进程运行的,如果你想让它在后台运行,你就把配置文件里
daemonize改成 yes。# 当redis作为守护进程运行的时候,它会写一个 pid /var/run/redis.pid 文件里面。)
daemonize yes
pidfile /var/redis/run/redis_6379.pid
logfile /var/redis/log/redis_6379.log
- 开启redis服务
进入 /etc/redis/
执行 redis-server 6379.conf
.启动redis server后,SecureCRT进入redis-cli,输入不断在后面追加IP:Port显示
设置当前的Session Options-->Terminal-->Emulation-->Terminal为Linux
cat /var/redis/log/redis_6379.log
- 如果通过命令行来操作redis的话 再开启一个redis的客户端
进入redis的安装目录 cd /root/redis-stable/src/,
执行 redis-cli 即可
2。然后就可以操作redis了