一:安装redis
1》下载
wget http://download.redis.io/releases/redis-3.2.0.tar.gz
2》解压安装包
tar xzf redis-3.2.0.tar.gz
3》安装,编译源代码
cd redis-3.2.0
make
4》编译完成后在src目录下,启动Redis服务:
src/redis-server
5》redis内置的客户端命令redis-cli进行使用:
src/redis-cli
redis> set foo 你好 //写入
OK
redis> get foo //获取
"你好"
(此时说明redis安装成功)
redis> exit //退出客户端
redis 官网:http://www.redis.cn/
二:安装php的redis的拓展
1. [root@VM_34_34_centos /]# wget https://github.com/phpredis/phpredis/archive/2.2.8.tar.gz //下载redis拓展
2. [root@VM_34_34_centos /]# tar zxvf 2.2.8.tar.gz //解压
3. [root@VM_34_34_centos /]# cd phpredis-2.2.8 //进入phpredis-2.2.8目录
4. [root@VM_34_34_centos phpredis-2.2.8]# /phpstudy/server/php/bin/phpize //执行命令
/phpstudy/server/php/bin/phpize(phpize的位置,根据你的php安装目录有所不同),得到configure文件;
5.[root@VM_34_34_centos phpredis-2.2.8]# /phpstudy/server/php/bin/phpize //执行命令
6.[root@VM_34_34_centos phpredis-2.2.8]# ./configure --with-php-config=/phpstudy/server/php/bin/php-config
//然后再执行 ./configure --width-php-config=/phpstudy/server/php/bin/php-config(php-config目录位置,
可通过find / -name php-config命令找到php-config文件)得到makefile文件
7.[root@iZ94ijenvxaZ phpredis-2.2.8]# make & make install //编译安装
安装完成之后,出现下面的安装路径
/phpstudy/server/php/lib/php/extensions/no-debug-non-zts-20121212/
8.[root@iZ94ijenvxaZ phpredis-2.2.8]# vim /phpstudy/server/php/etc/php.ini
//#编辑配置文件,在最后一行添加以下内容
添加
extension="redis.so"
:wq! #保存退出
9. [root@iZ94ijenvxaZ phpredis-2.2.8]# /phpstudy/phpstudy.sh restart //重启服务器哦
三:redis在php中的使用
1.数据类型以及使用场景
1>string(字符串):String是最常用的一种数据类型,普通的key/value存储都可以归为此类,这里就不所做解释了。
2>hash(哈希):存储一个用户信息对象数据,用户ID为查找的key,存储的value用户对象包含姓名,年龄,生日等信息,
如果用普通的key/value结构来存储(其实存的是以为关联数组)
3>list(列表):Redis list的应用场景非常多,也是Redis最重要的数据结构之一,比如twitter的关注列表,粉丝列表等
都可以用Redis的list结构来实现,并且我们在做秒杀的时候,为了可以让mysql在高并发的时候不会崩掉,可以
先把数据存入队列,在做数据库添加(使用的是一维索引数组),
4>set(集合):Redis set对外提供的功能与list类似是一个列表的功能,特殊之处在于set是可以自动排重的,当你需要存
储一个列表数据,又不希望出现重复数据时,set是一个很好的选择,并且set提供了判断某个成员是否在一个set集
合内的重要接口,这个也是list所不能提供的。
5>zset(sorted set:有序集合):Redis sorted set的使用场景与set类似,区别是set不是自动有序的,而sorted set可以
通过用户额外提供一个优先级(score)的参数来为成员排序,并且是插入有序的,即自动排序。当你需要一个有序的
并且不重复的集合列表,那么可以选择sorted set数据结构,比如twitter 的public timeline可以以发表时间作为
score来存储,这样获取时就是自动按时间排好序的。
2.举例使用:
$redis = new redis();
$redis->connect('127.0.0.1', 6379);
var_dump($redis_); //如果为true,连接成功
1>.string(key-value) 比较简单可以存字符串,数据,最大键可以存512MB。
$arr=json_encode(['q','w']);
$redis->set('ce',$arr); //存
$redis->delete('ce'); //删除缓存
$arr= $redis->get('ce'); //取
var_dump($arr);
2>.Hash (哈希) Redis hash是一个string类型的field和value的映射表,hash特别适合用
于存储对象。相对于将对象的每个字段存成单个 string 类型。将一个对象 存储在 hash 类
型中会占用更少的内存,并且可以更方便的存取整个对象。
$redis->delete('test'); //删除
$redis->hSet('test', 'a', 'x');
$redis->hSet('test', 'b', 'y');
$redis->hSet('test', 'c', 'z');
print_r($redis->hkeys('test')); //结果:Array ( [0] => a [1] => b [2] => c )
print_r($redis->hvals('test')); //结果:Array ( [0] => x [1] => y [2] => z )
print_r($redis->hgetall('test')); //结果:Array ( [a] => x [b] => y [c] => z )
3>list(对列) 列表最多可存储 232 - 1 元素 (4294967295, 每个列表可存储40多亿)。
$redis->lpush('test','a'); //lpush lpush lpushkey string 在 key 对应 list 的头部添加字符串元素,
// 返回 1 表示成功,0 表示 key 存 在且不是 list 类型
$redis->delete('test');
$redis->lpush('test','c');
$redis->lpush('test','3');
$redis->rpush('test','a'); // 对应 list 的尾部添加字符串元素。
$redis->rpush('test','b');
$redis->rpush('test','c');
$redis->rpush('test','a');
print_r($redis->lRange('test','0','3')); //结果:Array ( [0] => c [1] => b [2] => a [3] => a ) // 返回指定区间 内的元素
4>序列
$redis->sadd('test','111'); //存
$redis->sadd('test','333');
print_r($redis->sort('test')); //结果:Array ( [0] => 111 [1] => 333 )
3.持久化:
通常 Redis 将数据存储在内存中或虚拟内存中,它是通过以下两种方式实现对数据的持 久化。
1> 快照方式:(默认持久化方式)
这种方式就是将内存中数据以快照的方式写入到二进制文件中,默认的文件名为 dump.rdb。 客户
端也可以使用 save 或者 bgsave 命令通知 redis 做一次快照持久化。save 操作是在 主线程中保存
快照的,由于 redis 是用一个主线程来处理所有客户端的请求,这种方式会阻 塞所有客户端请求。所
以不推荐使用。另一点需要注意的是,每次快照持久化都是将内存数 据完整写入到磁盘一次,并不是
增量的只同步增量数据。如果数据量大的话,写操作会比较 多,必然会引起大量的磁盘 IO 操作,可能
会严重影响性能。
注意:由于快照方式是在一定间隔时间做一次的,所以如果 redis 意外当机的话,就会 丢失最后一次快照
后的所有数据修改。
2>日志追加方式
这种方式 redis 会将每一个收到的写命令都通过 write 函数追加到文件中(默认 appendonly.aof)。
当 redis 重启时会通过重新执行文件中保存的写命令来在内存中重建整 个数据库的内容。当然由于操作系
统会在内核中缓存 write 做的修改,所以可能不是立即写 到磁盘上。这样的持久化还是有可能会丢失部分修改。
不过我们可以通过配置文件告诉 redis 我们想要通过 fsync 函数强制操作系统写入到磁盘的时机。有三种方式
如下(默认是: 每秒 fsync 一次)
appendonlyyes //启用日志追加持久化方式
appendfsyncalways //每次收到写命令就立即强制写入磁盘,最慢的,但是保证完全 的持久化,不推荐使用
appendfsynceverysec //每秒钟强制写入磁盘一次,在性能和持久化方面做了很好的折 中,推荐
appendfsyncno //完全依赖操作系统,性能最好,持久化没保证
日志追加方式同时带来了另一个问题。持久化文件会变的越来越大。例如我们调用 incr test 命令 100 次,文件中必
须保存全部 100 条命令,其实有 99 条都是多余的。因为要恢复 数据库状态其实文件中保存一条 settest100 就够了。为
了压缩这种持久化方式的日志文件。 redis 提供了 bgrewriteaof bgrewriteaof bgrewriteaof bgrewriteaof命令。收
到此命令 redis 将使用与快照类似的方式将内存中的数据 以命令的方式保存到临时文件中,最后替换原来的持久化日志文
件。