Redis开发学习

351 查看

Redis 简介

Redis 是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据库。
Redis 与其他 key - value 缓存产品有以下三个特点:

  • Redis支持数据的持久化,可以将内存中的数据保持在磁盘中,重启的时候可以再次加载进行使用。

  • Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储。

  • Redis支持数据的备份,即master-slave模式的数据备份。

Redis 优势

  1. 性能极高 – Redis能读的速度是110000次/s,写的速度是81000次/s 。

  2. 丰富的数据类型 – Redis支持二进制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 数据类型操作。

  3. 原子 – Redis的所有操作都是原子性的,同时Redis还支持对几个操作全并后的原子性执行。

  4. 丰富的特性 – 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 的 SETGET 命令。键为 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

参考博文:
Redis快速学习
【高并发简单解决方案】redis队列缓存 + mysql 批量入库 + php离线整合