re-dis 操-作-配-置

来源:互联网 发布:人工智能免费观看完整 编辑:程序博客网 时间:2024/05/16 07:00

Key-Value Store最大的特点就是它的可扩展性,这也就是它最大的优势。所谓的可扩展性,在我看来这里包括了两方面内容。一方面,是指Key-Value Store可以支持极大的数据的存储,它的分布式的架构决定了只要有更多的机器,就能够保证存储更多的数据。另一方面,是指它可以支持数量很多的并发的查询。对于RDBMS,一般几百个并发的查询就可以让它很吃力了,而一个Key-Value Store,可以很轻松的支持上千的并发查询。下面而简单的罗列了一些特点:

  Key-value store:一个 key-value 数据存储系统,只支持一些基本操作,如:SET(key, value) 和 GET(key) 等;

  分布式:多台机器(nodes)同时存储数据和状态,彼此交换消息来保持数据一致,可视为一个完整的存储系统。

  数据一致:所有机器上的数据都是同步更新的、不用担心得到不一致的结果;

  冗余:所有机器(nodes)保存相同的数据,整个系统的存储能力取决于单台机器(node)的能力;

  容错:如果有少数 nodes 出错,比如重启、当机、断网、网络丢包等各种 fault/fail 都不影响整个系统的运行;

  高可靠性:容错、冗余等保证了数据库系统的可靠性。

 

http://tech.it168.com/a2011/0830/1239/000001239923.shtml  redis安装

 http://redis-py.readthedocs.org/en/latest/   redis-py命令参考

http://redis.readthedocs.org/en/latest/index.html   redis命令参考

http://www.cnblogs.com/toto/p/3324296.html  集群配置

 
https://code.google.com/p/credis/wiki/Examples  google实例
#include <stdio.h>#include "credis.h"int main(int argc, char **argv){  REDIS rh;  char *val;  /* create handle to a Redis server running on localhost, port 6789,     with a 2 second response timeout */  rh = credis_connect(NULL, 6789, 2000);  /* ping server */  credis_ping(rh);  /* set value of key "kalle" to "kula" */  credis_set(rh, "kalle", "kula");  /* get value of key "kalle" */  credis_get(rh, "kalle", &val);  printf("get kalle returned: %s\n", val);  /* close connection to redis server */  credis_close(rh);  return 0;}

 

http://www.cnblogs.com/NONE/archive/2011/05/30/2062904.html    redis操作

Redis::__construct
描述:
创建一个Redis客户端
范例:
$redis = new Redis();
connect, open
描述:
实例连接到一个Redis.
参数:host: string        port: int
返回值:BOOL 成功返回:TRUE;失败返回:FALSE
范例:
$redis->connect('127.0.0.1′, 6379);
get
描述:
获取有关指定键的值
参数:key
返回值:string或BOLL 如果键不存在,则返回 FALSE。否则,与此相关的关键值返回。
范例:
$redis->get('key');
set
描述:
设置关键值参数
参数:Key Value
返回值:BOOL
范例:
$redis->set('key', 'value')
setnx
描述:
如果在数据库中不存在该键,设置关键值参数
参数:key value
返回值:BOOL
范例:
$this->redis->setnx('key', 'value');
$this->redis->setnx('key', 'value');
delete
描述:
删除指定的键
参数:一个键,或不确定数目的参数,每一个关键的数组:key1 key2 key3 … keyN
返回值:删除的项数
范例:
$redis->set('key1′, 'val1′);
$redis->set('key2′, 'val2′);
$redis->set('key3′, 'val3′);
$redis->set('key4′, 'val4′);
$redis->delete('key1′, 'key2′);
$redis->delete(array('key3′, 'key4′));
exists
描述:
验证指定的键是否存在
参数key
返回值:Bool
范例:
$this->set('key', 'value');
$this->exists('key');
$this->exists('NonExistingKey');
incr
描述:
数字递增存储键值键.如果第二个参数被填满,它将被用来作为整数值递增
Increment the number stored at key by one. If the second argument is filled, it will be used as the integer value of the increment.
参数:key value:将被添加到键的值
返回值:INT the new value
范例:
$redis->incr('key1′);
$redis->incr('key1′);
$redis->incr('key1′);
$redis->incr('key1′);
decr
描述:
数字递减存储键值。如果第二个参数被填满,它将被用来作为整数值递减
Decrement the number stored at key by one. If the second argument is filled, it will be used as the integer value of the decrement.
参数:key value:将被添加到键的值
返回值:INT the new value
范例:
$redis->decr('key1′);
$redis->decr('key1′);
$redis->decr('key1′);
getMultiple
描述:
取得所有指定键的值。如果一个或多个键不存在,该数组中该键的值为假
参数:其中包含键值的列表数组
返回值:返回包含所有键的值的数组
范例:
$redis->set('key1′, 'value1′);
$redis->set('key2′, 'value2′);
$redis->set('key3′, 'value3′);
$redis->getMultiple(array('key1′, 'key2′, 'key3′));
rPush
描述:
由列表头部添加字符串值。如果不存在该键则创建该列表。如果该键存在,而且不是一个列表,返回FALSE。
参数:key,value
返回值:LONG The new length of the list in case of success, FALSE in case of Failure.
范例:
$redis->delete('key1′);
$redis->lPush('key1′, 'C'); // returns 1
$redis->lPush('key1′, 'B'); // returns 2
$redis->lPush('key1′, 'A'); // returns 3
lPop
描述:
返回和移除列表的最后一个元素
参数:key
返回值:STRING if command executed successfully BOOL FALSE in case of failure (empty list)
范例:
$redis->rPush('key1′, 'A');
$redis->rPush('key1′, 'B');
$redis->rPush('key1′, 'C');
$redis->lPop('key1′);
rPop
描述:
返回和移除列表的第一个元素
参数:key
返回值:STRING if command executed successfully BOOL FALSE in case of failure (empty list)
范例:
$redis->rPush('key1′, 'A');
$redis->rPush('key1′, 'B');
$redis->rPush('key1′, 'C');
$redis->rPop('key1′);
lSize
描述:
返回的列表的大小。如果列表不存在或为空,该命令返回0。如果该键不是列表,该命令返回FALSE。
参数:Key
返回值:
LONG The size of the list identified by Key exists.
BOOL FALSE if the data type identified by Key is not list
范例:
$redis->rPush('key1′, 'A');
$redis->rPush('key1′, 'B');
$redis->rPush('key1′, 'C');
$redis->lSize('key1′);
$redis->rPop('key1′);
$redis->lSize('key1′);
lGet
描述:
返回指定键存储在列表中指定的元素。 0第一个元素,1第二个… -1最后一个元素,-2的倒数第二…错误的索引或键不指向列表则返回FALSE。
参数:key index
返回值:
String the element at this index
Bool FALSE if the key identifies a non-string data type, or no value corresponds to this index in the list Key.
范例:
$redis->rPush('key1′, 'A');
$redis->rPush('key1′, 'B');
$redis->rPush('key1′, 'C');
$redis->lGet('key1′, 0);
$redis->lGet('key1′, -1);
$redis->lGet('key1′, 10);
lSet
描述:
为列表指定的索引赋新的值,若不存在该索引返回false.
参数:key index value
返回值:BOOL TRUE if the new value is setted. FALSE if the index is out of range, or data type identified by key is not a list.
范例:
$redis->rPush('key1′, 'A');
$redis->rPush('key1′, 'B');
$redis->rPush('key1′, 'C');
$redis->lGet('key1′, 0);
$redis->lSet('key1′, 0, 'X');
$redis->lGet('key1′, 0);
lGetRange
描述:
返回在该区域中的指定键列表中开始到结束存储的指定元素,lGetRange(key, start, end)。0第一个元素,1第二个元素… -1最后一个元素,-2的倒数第二…
参数:key start end
返回值:
Array containing the values in specified range.
范例:
$redis->rPush('key1′, 'A');
$redis->rPush('key1′, 'B');
$redis->rPush('key1′, 'C');
$redis->lGetRange('key1′, 0, -1);
lRemove
描述:
从列表中从头部开始移除count个匹配的值。如果count为零,所有匹配的元素都被删除。如果count是负数,内容从尾部开始删除。
参数:key count value
返回值:
LONG the number of elements to remove
BOOL FALSE if the value identified by key is not a list.
范例:
$redis->lPush('key1′, 'A');
$redis->lPush('key1′, 'B');
$redis->lPush('key1′, 'C');
$redis->lPush('key1′, 'A');
$redis->lPush('key1′, 'A');
$redis->lGetRange('key1′, 0, -1);
$redis->lRemove('key1′, 'A', 2);
$redis->lGetRange('key1′, 0, -1);
sAdd
描述:
为一个Key添加一个值。如果这个值已经在这个Key中,则返回FALSE。
参数:key value
返回值:
BOOL TRUE if value didn't exist and was added successfully, FALSE if the value is already present.
范例:
$redis->sAdd('key1′ , 'set1′);
$redis->sAdd('key1′ , 'set2′);
$redis->sAdd('key1′ , 'set2′);
sRemove
描述:
删除Key中指定的value值
参数:key member
返回值:BOOL TRUE if the member was present in the set, FALSE if it didn't.
范例:
$redis->sAdd('key1′ , 'set1′);
$redis->sAdd('key1′ , 'set2′);
$redis->sAdd('key1′ , 'set3′);
$redis->sRemove('key1′, 'set2′);
sMove
描述:
将Key1中的value移动到Key2中
参数:srcKey dstKey member
返 回值:BOOL If the operation is successful, return TRUE. If the srcKey and/or dstKey didn't exist, and/or the member didn't exist in srcKey, FALSE is returned.
范例:
$redis->sAdd('key1′ , 'set11′);
$redis->sAdd('key1′ , 'set12′);
$redis->sAdd('key1′ , 'set13′);
$redis->sAdd('key2′ , 'set21′);
$redis->sAdd('key2′ , 'set22′);
$redis->sMove('key1′, 'key2′, 'set13′);
sContains
描述:
检查集合中是否存在指定的值。
参数:key value
返回值:BOOL TRUE if value is a member of the set at key key, FALSE otherwise.
范例:
$redis->sAdd('key1′ , 'set1′);
$redis->sAdd('key1′ , 'set2′);
$redis->sAdd('key1′ , 'set3′);
$redis->sContains('key1′, 'set1′);
$redis->sContains('key1′, 'setX');
sSize
描述:
返回集合中存储值的数量
参数:key
返回值:LONG the cardinality of the set identified by key, 0 if the set doesn't exist.
范例:
$redis->sAdd('key1′ , 'set1′);
$redis->sAdd('key1′ , 'set2′);
$redis->sAdd('key1′ , 'set3′);
$redis->sSize('key1′);
$redis->sSize('keyX');
sPop
描述:
随机移除并返回key中的一个值
参数:key
返回值:String "popped" value        Bool FALSE if set identified by key is empty or doesn't exist.
范例:
$redis->sAdd('key1′ , 'set1′);
$redis->sAdd('key1′ , 'set2′);
$redis->sAdd('key1′ , 'set3′);
$redis->sPop('key1′);
$redis->sPop('key1′);
sInter
描述:
返回一个所有指定键的交集。如果只指定一个键,那么这个命令生成这个集合的成员。如果不存在某个键,则返回FALSE。
参数:key1, key2, keyN: keys identifying the different sets on which we will apply the intersection.
返 回值:Array, contain the result of the intersection between those keys. If the intersection beteen the different sets is empty, the return value will be empty array.
范例:
$redis->sAdd('key1′, 'val1′);
$redis->sAdd('key1′, 'val2′);
$redis->sAdd('key1′, 'val3′);
$redis->sAdd('key1′, 'val4′);
$redis->sAdd('key2′, 'val3′);
$redis->sAdd('key2′, 'val4′);
$redis->sAdd('key3′, 'val3′);
$redis->sAdd('key3′, 'val4′);
var_dump($redis->sInter('key1′, 'key2′, 'key3′));
输出:
array(2) {[0]=>string(4) "val4″ [1]=>string(4) "val3″}
sInterStore
描述:
执行sInter命令并把结果储存到新建的变量中。
参数:
Key: dstkey, the key to store the diff into.
Keys: key1, key2… keyN. key1..keyN are intersected as in sInter.
返回值:INTEGER: The cardinality of the resulting set, or FALSE in case of a missing key.
范例:
$redis->sAdd('key1′, 'val1′);
$redis->sAdd('key1′, 'val2′);
$redis->sAdd('key1′, 'val3′);
$redis->sAdd('key1′, 'val4′);
$redis->sAdd('key2′, 'val3′);
$redis->sAdd('key2′, 'val4′);
$redis->sAdd('key3′, 'val3′);
$redis->sAdd('key3′, 'val4′);
var_dump($redis->sInterStore('output', 'key1′, 'key2′, 'key3′));
var_dump($redis->sMembers('output'));
输出:
int(2)
array(2) {
[0]=>
string(4) "val4″
[1]=>
string(4) "val3″
}
sUnion
描述:
返回一个所有指定键的并集
参数:
Keys: key1, key2, … , keyN: Any number of keys corresponding to sets in redis.
返回值:
Array of strings: The union of all these sets.
范例:
$redis->delete('s0′, 's1′, 's2′);
$redis->sAdd('s0′, '1′);
$redis->sAdd('s0′, '2′);
$redis->sAdd('s1′, '3′);
$redis->sAdd('s1′, '1′);
$redis->sAdd('s2′, '3′);
$redis->sAdd('s2′, '4′);
var_dump($redis->sUnion('s0′, 's1′, 's2′));
输出:
array(4) {
[0]=>
string(1) "3″
[1]=>
string(1) "4″
[2]=>
string(1) "1″
[3]=>
string(1) "2″
}
sUnionStore
描述:
执行sUnion命令并把结果储存到新建的变量中。
参数:
Key: dstkey, the key to store the diff into.
Keys: key1, key2, … , keyN: Any number of keys corresponding to sets in redis.
返回值:
INTEGER: The cardinality of the resulting set, or FALSE in case of a missing key.
范例:
$redis->delete('s0′, 's1′, 's2′);
$redis->sAdd('s0′, '1′);
$redis->sAdd('s0′, '2′);
$redis->sAdd('s1′, '3′);
$redis->sAdd('s1′, '1′);
$redis->sAdd('s2′, '3′);
$redis->sAdd('s2′, '4′);
var_dump($redis->sUnionStore('dst', 's0′, 's1′, 's2′));
var_dump($redis->sMembers('dst'));
输出:
int(4)
array(4) {
[0]=>
string(1) "3″
[1]=>
string(1) "4″
[2]=>
string(1) "1″
[3]=>
string(1) "2″
}
sDiff
描述:
返回第一个集合中存在并在其他所有集合中不存在的结果
参数:Keys: key1, key2, … , keyN: Any number of keys corresponding to sets in redis.
返回值:Array of strings: The difference of the first set will all the others.
范例:
$redis->delete('s0′, 's1′, 's2′);
$redis->sAdd('s0′, '1′);
$redis->sAdd('s0′, '2′);
$redis->sAdd('s0′, '3′);
$redis->sAdd('s0′, '4′);
$redis->sAdd('s1′, '1′);
$redis->sAdd('s2′, '3′);
var_dump($redis->sDiff('s0′, 's1′, 's2′));
array(2) {
[0]=>
string(1) "4″
[1]=>
string(1) "2″
}
sDiffStore
描述:
执行sDiff命令并把结果储存到新建的变量中。
参数:
Key: dstkey, the key to store the diff into.
Keys: key1, key2, … , keyN: Any number of keys corresponding to sets in redis
返回值:INTEGER: The cardinality of the resulting set, or FALSE in case of a missing key.
范例:
$redis->delete('s0′, 's1′, 's2′);
$redis->sAdd('s0′, '1′);
$redis->sAdd('s0′, '2′);
$redis->sAdd('s0′, '3′);
$redis->sAdd('s0′, '4′);
$redis->sAdd('s1′, '1′);
$redis->sAdd('s2′, '3′);
var_dump($redis->sDiffStore('dst', 's0′, 's1′, 's2′));
var_dump($redis->sMembers('dst'));
Return value: the number of elements of s0 that are neither in s1 nor in s2.
int(2)
array(2) {
[0]=>
string(1) "4″
[1]=>
string(1) "2″
}
sMembers, sGetMembers
描述:
返回集合的内容
参数:Key: key
返回值:An array of elements, the contents of the set.
范例:
$redis->delete('s');
$redis->sAdd('s', 'a');
$redis->sAdd('s', 'b');
$redis->sAdd('s', 'a');
$redis->sAdd('s', 'c');
var_dump($redis->sMembers('s'));
Output:
array(3) {
[0]=>
string(1) "c"
[1]=>
string(1) "a"
[2]=>
string(1) "b"
}

 

一:memcache 和 Redis 对比总结

 

[memecache 特点]

1:速度最快(没有自测,但网上有详细的测试用例)

2:支持水平扩展,可以任意添加节点

 

[redis 特点]

1:速度没有memcache快

2:支持M/S的主从备份

3:可以支持多数据库

4:操作指令很丰富

4:支持异步数据持久化(以文件保存)

 

总结:

1:如果是简单的数据缓存建议使用MEMCACHE。

2:如果要对单一操作的数据量非常的大则使用MEMCACHE

3: 如果想做性能很好的缓存集群可以用Redis(M/S读写分离,如weibo中的排行榜等)

4: 如果在高并发下又想保存数据则可以用Redis (如更新热门文章浏览次数,memcachedb也不错)

 

二:Redis 的详细安装,

 

将 redis 安装到 /usr/local/webserver/redis

 

1:从 http://redis.io/download 上下载安装包

 

wget http://redis.googlecode.com/files/redis-2.2.15.tar.gz

tar zxvf redis-2.2.15.tar.gz

cd redis-2.2.15

make

 

mkdir -p /usr/local/webserver/redis/conf

mkdir -p /usr/local/webserver/redis/run

mkdir -p /usr/local/webserver/redis/db

cp redis.conf /usr/local/webserver/redis/conf/

cd src

# 将 src 目录下所有可执行文件复制到安装目录

cp redis-benchmark redis-check-aof redis-check-dump redis-cli redis-server mkreleasehdr.sh /usr/local/webserver/redis/

 

2:修改配置文件中的如下选项

------- vi /usr/local/webserver/redis/conf/redis.conf --------

daemonize yes

pidfile /usr/local/webserver/redis/run/redis.pid

dir /usr/local/webserver/redis/db

--------------------------------------------------------------

 

3:创建服务脚本

 

------- vi /usr/local/webserver/redis/start.sh ---------

#!/bin/bash

/usr/local/webserver/redis/redis-server /usr/local/webserver/redis/conf/redis.conf

--------------------------------------------------------

 

------- vi /usr/local/webserver/redis/stop.sh ---------

#!/bin/bash

kill `cat /usr/local/webserver/redis/run/redis.pid`

--------------------------------------------------------

 

chmod a+x /usr/local/webserver/redis/start.sh /usr/local/webserver/redis/stop.sh

 

 

4:启动 redis 服务

/usr/local/webserver/redis/start.sh

验证证服务是否成功:

netstat -nlpt | grep 6379

 

5:启动客户端验证

/usr/local/webserver/redis/redis-cli

>set key1 val1

>get key1

 

 

三:Redis Master/Slave 主从集群配置

 

这里我们以本机配置 1台Master + 2台Slave 为例子,其中:

 

Master IP:127.0.0.1  PORT:6379

Slave1 IP:127.0.0.1  PORT:63791

Slave2 IP:127.0.0.1  PORT:63792

 

1:复制两个 Slave 目录,方便管理

cp -r /usr/local/webserver/redis /usr/local/webserver/redis-slave1

cp -r /usr/local/webserver/redis /usr/local/webserver/redis-slave2

 

2:修改 redis-slave1 的配置文件和服务脚本

-- vi /usr/local/webserver/redis-slave1/conf/redis.conf --

port 63791

pidfile /usr/local/webserver/redis-slave1/run/redis.pid

dir /usr/local/webserver/redis-slave1/db

slaveof 127.0.0.1 6379

----------------------------------------------------------

 

-- vi /usr/local/webserver/redis-slave1/start.sh --

#!/bin/bash

/usr/local/webserver/redis-slave1/redis-server /usr/local/webserver/redis-slave1/conf/redis.conf

---------------------------------------------------

 

------- vi /usr/local/webserver/redis-slave1/stop.sh ---------

#!/bin/bash

kill `cat /usr/local/webserver/redis-slave1/run/redis.pid`

--------------------------------------------------------

 

3:修改 redis-slave2 的配置文件和服务脚本

-- vi /usr/local/webserver/redis-slave2/conf/redis.conf --

port 63792

pidfile /usr/local/webserver/redis-slave2/run/redis.pid

dir /usr/local/webserver/redis-slave2/db

slaveof 127.0.0.1 6379

----------------------------------------------------------

 

-- vi /usr/local/webserver/redis-slave2/start.sh --

#!/bin/bash

/usr/local/webserver/redis-slave2/redis-server /usr/local/webserver/redis-slave2/conf/redis.conf

---------------------------------------------------

 

------- vi /usr/local/webserver/redis-slave2/stop.sh ---------

#!/bin/bash

kill `cat /usr/local/webserver/redis-slave2/run/redis.pid`

--------------------------------------------------------

 

4:启动 M/S 服务

/usr/local/webserver/redis/start.sh

/usr/local/webserver/redis-slave1/start.sh

/usr/local/webserver/redis-slave2/start.sh

验证服务是否正常: netstat -nlpt | grep redis-server 有3个端口存在证明成功了

0 0.0.0.0:6379  

0 0.0.0.0:63791

0 0.0.0.0:63792

 

5:验证M/S服务是否生效

/usr/local/webserver/redis/redis-cli [默认连接端口:6379 的 Master服务]

>set key1 val1

>quit

 

/usr/local/webserver/redis/redis-cli -p 63791 [连接 Slave1 服务]

>get key1

"val1" (数据成功同步了)

 

/usr/local/webserver/redis/redis-cli -p 63792 [连接 Slave2 服务]

>get key1

"val1" (数据成功同步了)

 

 

四:安装 Redis PHP 扩展

 

Redis所有的客户端在 http://redis.io/clients [PHP选项卡] 基于性能选择安装 phpredis

 

在 https://github.com/nicolasff/phpredis/downloads 上下载源代码包到本地然后上传到服务器.

 

tar zxvf nicolasff-phpredis-2.1.3-167-ga5e53f1.tar.gz

cd nicolasff-phpredis-a5e53f1

phpize

./configure

make && make install

 

查看输出信息会告诉你 redis.so 的那个目录下,把它复制到PHP的扩展目录下

我的系统上是 /usr/lib/php5/extensions/

 

用 php --ini 找到 php.ini 的位置,加入以下行后重启WEB服务器

=========================

extension=redis.so

=========================


原创粉丝点击