redis使用及配置之缓存详解

  • 时间:
  • 浏览:0
  • 来源:跟我学网络

1、Redis的介绍

       Redis是一个Key-Value存储系统。它支持存储的value类型有:string(字符串),list(链表), set(无序集合),zset(sorted set有序集合)和hash,也可以把redis看成一个数据结构服务器。这些数据类型都支持pust/popadd/remove及取交集、并集和差集运算,Redis支持各种不同方式的排序。数据都是缓存在内存中的,它也可以周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并实现了master-slave(主从)同步。

       Redis提供的API语言包括C、C++、C#、Java、JavaScript、Lua、Objective-C、Perl、PHP、Python、Ruby、Go、Tcl等。

       使用Redis:新浪微博,200+ Server、400 port、4G data.

       使用方式:与memcache相同

              1. 应用程序直接访问Redis数据库;

              2. 应用程序直接访问Redis,只有当访问Redis失败时才访问MySQL

       应用场合:

              1. 取最新N个数据的操作

              2. 排行榜应用

              3. 需要精确设定过期时间的应用

              4. 计数器应用

              5. Uniq操作,获取某段时间所有数据排重值

              6. 实时系统,反垃圾系统

              7. Pub/Sub构建实时消息系统

              8. 构建队列系统

              9. 缓存

              10. 存储微博关注关系

       Redis有库无表无字段无行列。MongoDB有库有集合(对应于Mysql中的表)

 2、redis客户端

可以通过百度网盘下载:

 http://pan.baidu.com/s/1pLH79jX

客户端打开图示:

 通过redisClient客户端可以看到我们存储到redis中的数据;

3、应用示例

TestAPI已经写了get(/TestRedis/get)和set(/TestRedis/set)示例。

下载了predis之后,将predis包加入项目目录中:

 redis访问路径我们一般配置在配置文件中:redis_config.php文件中添加下面的代码:

<?php
$master_redis_config = array('tcp://172.16.0.39:6379', array('profile' => '3.0'));
$slave_redis_config = array('tcp://172.16.0.39:6379', array('profile' => '3.0'));
?>

在需要使用redis文件中加入下面代码,自动加载redis服务:

require_once 'predis/autoload.php';

使用redis存储服务时,代码如下:

    private function hsetRedisDatas($hash_table, $key, $value){
        $redis_config = Flight::get('master_redis_config');
        $redis = new Predis\Client($redis_config[0]);
        $redis->hset($hash_table,$key, $value);
    }

注意:这里使用了Flight框架加载配置文件,获取redis访问路径;

获取redis数据时,代码如下:

    private function hgetRedisDatas($hash_table, $key){
        $redis_config = Flight::get('master_redis_config');
        $redis = new Predis\Client($redis_config[0]);
        $result = $redis->hget($hash_table,$key);
        return $result;
    }

 在存储和获取redis中的数据时,使用这两个私有方法就可以了;

    public function getShippingName($shipping_id){
        $shipping_name = self::hgetRedisDatas('shipping_name', $shipping_id);
        if (empty($shipping_name)){
            $shipping_name = "当redis没有缓存数据时,通过读取数据库获取数据";
            if (!empty($shipping_name) && !isset($shipping_name['error_code'])){
                self::hsetRedisDatas('shipping_name', $shipping_id, $shipping_name);
            }
        }
        return $shipping_name;
    }

 更新redis缓存

create/update/delete---同时存到redis和数据库

query--先从redis查,没有记录才从数据库查,并把从数据库查的结果也放一份到redis

做好缓存之后,出现了一个问题,就是如何更新redis缓存呢?

有时候我们调用其他项目的接口来获取数据,那么怎么样通过redis来进行缓存呢?

1、一种方法是让对方做缓存

这种方式的缺点是对方并不一定喜欢给你做缓存,增加了对方的开发成本;

2.第二种方法是我们当第一次调用对方接口的时候,我们自己做缓存,确保相同参数的接口,我们只调用一次对方接口;

只需要在请求结束的时候,清空缓存就行了,这样就能保证每次获取到的都是对方最新的数据;

    private static function removeRedisDatas(){
        $redis_config = Flight::get('master_redis_config');
        $redis = new \Predis\Client($redis_config[0]);
        $redis->del($redis->keys('inventory*'));
    }

我们在redis中定义特殊的key,例如inventory*,这样我们就可以将inventory开头的缓存清空,而不至于影响其他redis缓存数据;