Redis 简介
Redis 是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据库。
Redis 与其他 key - value 缓存产品有以下三个特点:
Redis支持数据的持久化,可以将内存中的数据保持在磁盘中,重启的时候可以再次加载进行使用。
Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储。
Redis支持数据的备份,即master-slave模式的数据备份。
Redis 优势
性能极高 – Redis能读的速度是110000次/s,写的速度是81000次/s 。
丰富的数据类型 – Redis支持二进制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 数据类型操作。
原子 – Redis的所有操作都是原子性的,同时Redis还支持对几个操作全并后的原子性执行。
丰富的特性 – Redis还支持 publish/subscribe, 通知, key 过期等等特性。
Redis与其他key-value存储有什么不同?
Redis有着更为复杂的数据结构并且提供对他们的原子性操作,这是一个不同于其他数据库的进化路径。Redis的数据类型都是基于基本数据结构的同时对程序员透明,无需进行额外的抽象。
Redis运行在内存中但是可以持久化到磁盘,所以在对不同数据集进行高速读写时需要权衡内存,应为数据量不能大于硬件内存。在内存数据库方面的另一个优点是, 相比在磁盘上相同的复杂的数据结构,在内存中操作起来非常简单,这样Redis可以做很多内部复杂性很强的事情。 同时,在磁盘格式方面他们是紧凑的以追加的方式产生的,因为他们并不需要进行随机访问。
安装Redis
1.在MacOSX下,用curl命令先下载redis:
$ curl -O http://download.redis.io/releases/redis-2.8.17.tar.gz
如果是Linux系统,可用wget命令下载:
$ wget http://download.redis.io/releases/redis-2.8.17.tar.gz
2.解压并安装
$ tar xzf redis-2.8.17.tar.gz
$ cd redis-2.8.17
$ make
make完后 redis-2.8.17目录下会出现编译后的redis服务程序redis-server,还有用于测试的客户端程序redis-cli,两个程序位于安装目录 src 目录下:
3.启动redis服务
$ cd src
$ ./redis-server
如果看到下面的图,表示redis安装成功了^_^
注意上面的方式启动redis 使用的是默认配置。也可以通过启动参数告诉redis使用指定配置文件使用下面命令启动。
$ cd src
$ ./redis-server redis.conf
redis.conf是一个默认的配置文件。我们可以根据需要使用自己的配置文件。
启动redis服务进程后,就可以使用测试客户端程序redis-cli和redis服务交互了, 比如:
$ cd src
$ ./redis-cli
redis> set foo bar
OK
redis> get foo
"bar"
这里可以开一个新的命令行窗口,我的redis保存路径:
Mac:cd /Users/mac/software/redis/redis-2.8.17
Mac:redis-2.8.17 mac$ cd src
Mac:src mac$ ./redis-cli
说明:
127.0.0.1 是本机 IP ,6379 是 redis 服务端口。现在我们输入 PING 命令。
127.0.0.1:6379> ping
PONG
测试:
Redis 配置
Redis 的配置文件位于 Redis 安装目录下,文件名为 redis.conf。
你可以通过 CONFIG 命令查看或设置配置项。
Redis CONFIG 命令格式如下:
redis 127.0.0.1:6379> CONFIG GET CONFIG_SETTING_NAME
实例
redis 127.0.0.1:6379> CONFIG GET loglevel
1) "loglevel"
2) "notice"
使用 * 号获取所有配置项:
编辑配置
你可以通过修改 redis.conf 文件或使用 CONFIG set 命令来修改配置。
语法
CONFIG SET 命令基本语法:
redis 127.0.0.1:6379> CONFIG SET CONFIG_SETTING_NAME NEW_CONFIG_VALUE
实例
redis 127.0.0.1:6379> CONFIG SET loglevel "notice"
OK
redis 127.0.0.1:6379> CONFIG GET loglevel
1) "loglevel"
2) "notice"
Redis 数据类型
Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合)。
String(字符串)
string是redis最基本的类型,你可以理解成与Memcached一模一样的类型,一个key对应一个value。
string类型是二进制安全的。意思是redis的string可以包含任何数据。比如jpg图片或者序列化的对象 。
string类型是Redis最基本的数据类型,一个键最大能存储512MB。
示例:
redis 127.0.0.1:6379> SET name "JackChan"
OK
redis 127.0.0.1:6379> GET name
"JackChan"
在以上实例中我们使用了 Redis 的 SET 和 GET 命令。键为 name,对应的值为JackChan。
注意:一个键最大能存储512MB。
Hash(哈希)
Redis hash 是一个键值对集合。
Redis hash是一个string类型的field和value的映射表,hash特别适合用于存储对象。
示例:
127.0.0.1:6379> HMSET user_id:1 name jackcheng age 25 address HongKong
OK
127.0.0.1:6379> HGETALL user_id:1
1) "name"
2) "jackcheng"
3) "age"
4) "25"
5) "address"
6) "HongKong"
127.0.0.1:6379>
以上实例中 hash 数据类型存储了包含用户脚本信息的用户对象。 实例中我们使用了 Redis HMSET, HGETALL 命令,user_id:1为键值。
每个 hash 可以存储 232 - 1 键值对(40多亿)。
List(列表)
Redis 列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素导列表的头部(左边)或者尾部(右边)。
示例:
127.0.0.1:6379> lpush language php
(integer) 1
127.0.0.1:6379> lpush language c
(integer) 2
127.0.0.1:6379> lpush language java
(integer) 3
127.0.0.1:6379> lpush language python
(integer) 4
127.0.0.1:6379> lrange language 0 5
1) "python"
2) "java"
3) "c"
4) "php"
127.0.0.1:6379>
l ->list 列表 push 推入队列
列表最多可存储 232 - 1 元素 (4294967295, 每个列表可存储40多亿)。
Set(集合)
Redis的Set是string类型的无序集合。
集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)。
sadd 命令
添加一个string元素到,key对应的set集合中,成功返回1,如果元素以及在集合中返回0,key对应的set不存在返回错误。
sadd key member
示例:
127.0.0.1:6379> sadd pragmmer c++
(integer) 1
127.0.0.1:6379> sadd pragmmer oc
(integer) 1
127.0.0.1:6379> sadd pragmmer oc
(integer) 0
127.0.0.1:6379> smembers pragmmer
1) "c++"
2) "oc"
127.0.0.1:6379>
注意:以上实例中 oc 添加了两次,但根据集合内元素的唯一性,第二次插入的元素将被忽略。
集合中最大的成员数为 232 - 1 (4294967295, 每个集合可存储40多亿个成员)。
zset(sorted set:有序集合)
Redis zset 和 set 一样也是string类型元素的集合,且不允许重复的成员。
不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。
zset的成员是唯一的,但分数(score)却可以重复。
zadd 命令
添加元素到集合,元素在集合中存在则更新对应score
zadd key score member
示例:
127.0.0.1:6379> zadd mytest 9 laravel
(integer) 1
127.0.0.1:6379> zadd mytest 1 php
(integer) 1
127.0.0.1:6379> zadd mytest 3 ios
(integer) 1
127.0.0.1:6379> zadd mytest 2 php
(integer) 0
127.0.0.1:6379> ZRANGEBYSCORE mytest 0 10
1) "php"
2) "ios"
3) "laravel"
127.0.0.1:6379>
Redis 性能测试
Redis 性能测试是通过同时执行多个命令实现的。
语法
redis 性能测试的基本命令如下:
redis-benchmark [option] [option value]
实例:
redis-benchmark在安装目录src里边,下面我们同时执行 10000 个请求来检测性能:
MacdeMacBook-Pro-3:src mac$ ./redis-benchmark -n 10000
====== PING_INLINE ======
10000 requests completed in 0.25 seconds
50 parallel clients
3 bytes payload
keep alive: 1
48.44% <= 1 milliseconds
98.32% <= 2 milliseconds
99.51% <= 6 milliseconds
100.00% <= 6 milliseconds
39215.69 requests per second
...
...
====== MSET (10 keys) ======
10000 requests completed in 0.38 seconds
50 parallel clients
3 bytes payload
keep alive: 1
redis 性能测试工具可选参数如下所示:
带有参数的示例:
MacdeMacBook-Pro-3:src mac$ ./redis-benchmark -h 127.0.0.1 -p 6379 -t set,lpush -n 100000 -q
SET: 29904.30 requests per second
LPUSH: 25094.10 requests per second
MacdeMacBook-Pro-3:src mac$
以上实例中主机为 127.0.0.1,端口号为 6379,执行的命令为 set,lpush,请求数为 100000,通过 -q 参数让结果只显示每秒执行的请求数。
PHP 使用 Redis
安装
开始在 PHP 中使用 Redis 前, 我们需要确保已经安装了 redis 服务及 PHP redis 驱动,且你的机器上能正常使用 PHP。接下来让我们安装 PHP redis 驱动:下载地址为:https://github.com/phpredis/phpredis/releases。
PHP安装redis扩展
以下操作需要在下载的 phpredis 目录中完成:
$ curl -O https://github.com/phpredis/phpredis/archive/2.2.4.tar.gz
$ cd phpredis-2.2.7 # 进入 phpredis 目录
$ /usr/local/php/bin/phpize # php安装后的路径
$ ./configure --with-php-config=/usr/local/php/bin/php-config
$ make && make install
phpredis资源
https://github.com/michael-grunder/phpredis.git
注意:这里如果是使用的XAMPP安装的服务器,则通过查看phpinfo的PHP版本是否一致,如果不一致,则说明当前的路径为Mac系统自带的PHP版本。
查看PHP版本:
php -v
打印出来的是Mac系统自带的PHP路径,而我们需要XAMPP安装的PHP,则需要在/Applications/XAMPP/xamppfiles/bin路径下找到PHPize安装的路径。
XAMPP的PHP版本为5.6.14:
查看当前所在目录命令 pwd
Linux中用 pwd 命令来查看”当前工作目录“的完整路径。pwd命令是Print Working Directory的缩写。 简单得说,每当你在终端进行操作时,你都会有一个当前工作目录。
MacdeMacBook-Pro-3:bin mac$ pwd
/Applications/XAMPP/xamppfiles/bin
XAMPP的PHP安装的phpsize就在该路径下:
/Applications/XAMPP/xamppfiles/bin/phpize
acdeMacBook-Pro-3:phpredis mac$ ./configure --with-php-config=/Applications/XAMPP/xamppfiles/bin/php-config
MacdeMacBook-Pro-3:phpredis-3.0.0 mac$ sudo make && make install
出现了这样的的错误:
如果出现这样的错误,则说明phpredis扩展包有问题,换一个扩展包,再重试下之前的步骤,即可安装成功。
phpredis资源
https://github.com/michael-grunder/phpredis.git
Installing shared extensions: /Applications/XAMPP/xamppfiles/lib/php/extensions/no-debug-non-zts-20131226/
MacdeMacBook-Pro-3:phpredis mac$
修改php.ini文件
vi /usr/local/php/lib/php.ini
增加如下内容:
extension=redis.so
如果在XAMPP集成环境的目录下:
extension_dir = "/Applications/XAMPP/xamppfiles/lib/php/extensions/no-debug-non-zts-20131226/"
extension=redis.so
安装完成后重启php-fpm 或 apache。查看phpinfo信息,就能看到redis扩展。
<?php
echo phpinfo();
?>
开启redis服务
MacdeMacBook-Pro-3:phpredis mac$ cd /Users/mac/software/redis/redis-2.8.17/src
MacdeMacBook-Pro-3:src mac$ ./redis-server
php连接到 redis 服务
<?php
//连接本地的 Redis 服务
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
echo "Connection to server sucessfully";
//查看服务是否运行
echo "Server is running: " . $redis->ping();
?>
执行脚本,输出结果为:
Connection to server sucessfully
Server is running: PONG
Redis PHP String(字符串) 实例
<?php
//连接本地的 Redis 服务
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
echo "Connection to server sucessfully";
//设置 redis 字符串数据
$redis->set("tutorial-name", "Redis tutorial");
// 获取存储的数据并输出
echo "Stored string in redis:: " . $redis->get("tutorial-name");
?>
执行脚本,输出结果为:
Connection to server sucessfully
Stored string in redis:: Redis tutorial