redis的安装,使用

一:安装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 将使用与快照类似的方式将内存中的数据 以命令的方式保存到临时文件中,最后替换原来的持久化日志文
    件。