Redis,与Memcached类似,是一个键值结构的非关系型数据库,基于内存运行,可持久化储存、集群负载均衡,常用于内容缓存、消息队列、临时计数以及日志储存场景。

由于数据库性能的原因,一些频繁读取或需异步处理的数据我们需要通过Redis来实现,如商品秒杀、消息通知、网站信息设置缓存、操作日志及访问日志储存等,Redis基于内存且高速的模式可以大大减轻我们数据库的负担。

一、前置

ThinkPHP 5.1
PHP 7.2.9
Redis 3.0.504
Nginx 1.15.11

二、连接Redis

2.1 设置密码

在Redis目录下redis.conf文件里添加requirepass 你要设置的Redis密码

2.2 添加Redis配置

由于我们需要集中管理相关配置,所以需要在TP5 Config.php文件缓存设置里新增Redis配置


// +----------------------------------------------------------------------
// | 缓存设置
// +----------------------------------------------------------------------

'cache'                  => [
    // 复合缓存类型
    'type'          => 'complex',
    // 默认缓存
   'default'   =>  [
        'type'      =>  'File',
        'path'      =>  CACHE_PATH
    ],
    'file'      =>  [
        // 驱动方式
        'type'      => 'File',
        // 缓存保存目录
        'path'      => CACHE_PATH,
        // 缓存前缀
        'prefix'    => '',
        // 缓存有效期 0表示永久缓存
        'expire'    => 0,
    ],
    // 新增Redis配置
    'redis'     =>  [
        'type'      => 'redis',
        'host'      => '127.0.0.1',
        'port'      => 6379,
        'expire'    => 0,
        'password'  => 'root'
    ]
],

这样的话我们就可以无需在Redis驱动文件或具体页面设置配置了,直接调用就好,需要修改时只需要修改Config.php文件。

2.3 修改Redis驱动文件

在thinkphp\library\think\cache\driver\redis.php构造函数里最前面新增

// 配置默认参数(读取Config.php)
$config = config('cache');
$this->options['host']      = $config['redis']['host'];
$this->options['port']      = $config['redis']['port'];
$this->options['password']  = $config['redis']['password'];

三、具体使用

3.1 获得对象

$redis = new Redis();
dump($redis);die;

// 此时,我们就获取到了一个Redis对象
object(think\cache\driver\Redis)#20 (3) {
  ["options":protected] => array(8) {
    ["host"] => string(9) "127.0.0.1"
    ["port"] => int(6379)
    ["password"] => string(4) "root"
    ["select"] => int(0)
    ["timeout"] => int(0)
    ["expire"] => int(0)
    ["persistent"] => bool(false)
    ["prefix"] => string(0) ""
  }
  ["handler":protected] => object(Redis)#21 (0) {
  }
  ["tag":protected] => NULL
}

3.2 多字段插入

HMSET方法可批量插入多个字段值(key,array[field=>value]),返回一个布尔值。
如果只需要插入一个可以使用HSET(HSET需要三个参数,Key,field,value)
EXPIRE方法用于设置Key的有效期,在配置好Redis持久化相关的配置后,在有效期内重启或崩溃,该值将会在下一次启动时重新载入内存。

$Result = $redis->handler()->HMSET('base_config',[
        'web_name'=>'DIMM',
        'web_desc'=>'左手代码,右手诗',
        'web_keys'=>'dimm,php,acg,javascript,shuaike,nodeJs,vue,小程序'
    ]);
    $redis->handler()->EXPIRE('base_config',1800);
    dump($Result);
// 

3.3 多字段获取

HMGET方法可批量获取多个字段值(key,array[field]),会返回一个一维数组,键为字段名,值为字段值。
如果只需要获取一个可以使用HGET(HGET需要两个参数,key,field),如果需要查询该Key下面所有字段和值,可以使用HGETALL('Key名')方法。

$Result = $redis->handler()->HMGET('base_config',['web_name','web_desc','web_keys']);
dump($Result);

3.4 查询是否存在

HEXISIS方法可以获取字段值是否存在(是否在这个Key里面),该方法会返回一个布尔值。

$Result = $redis->handler()->HEXISTS('base_config','web_name');
dump($Result);

3.5 删除Key

$redis->rm() 同 $redis->handler()->delete(),输入一个Key名,返回删除状态,值为int 1 或 0

$rmResult = $redis->rm('base_config');
dump($rmResult);