predis的5种数据结构类型(string,set,zset,hash,list)使用方法及基础使用场景

set 无序集合

使用场景:比如某个文章分类下面所有的文章,把每篇文章的内容序列化作为value存入一个集合中,存入使用sadd方法,取出使用smembers方法,更多方法介绍参看手册:http://doc.redisfans.com/set/index.html

<?php
$redis_server = array(
 array(
                'host'                  => '127.0.0.1',
                'port'                  => '6379',
                'password'              => 'JPem29ssjSzmGUf9FTuz',
                'database'              => 0,
                'alias'                 => 'master',
                'read_write_timeout'    => 0
            ),
);
$options = array(
            'replication' => true,
            'prefix' => 'wap:'
        );
$redis = new Predis\Client($redis_server, $options);

$catid = 10;
//指定key
$redis_key = sprintf('set:catid_%d', $catid);

//pdo获取文章数据
$query = $pdo->query('select * from article where catid='.$catid);
$article = $query->fetchAll(PDO::FETCH_ASSOC);

foreach($article as $v){
 $redis_val = json_encode($v);
//存入redis
 $redis->sadd($redis_key, $redis_val);
}

//获取指定key的数据
$result = $redis->smembers($redis_key);

sortedset-有序集合

使用场景:比如某个文章分类下面所有的文章,现在想获取浏览量前10的文章,理论上讲可以通过set获取所有数据,然后遍历数组根据浏览量排序,但是有序集合自带光环,把每篇文章的内容序列化作为value存入一个集合中,浏览量作为score,这样即可实现按浏览量排序前10,只需一条命令即可。
存入使用zadd方法,取出使用zrange方法,更多方法介绍参看手册:http://doc.redisfans.com/sorted_set/index.html

<?php
$redis_server = array(
 array(
                'host'                  => '127.0.0.1',
                'port'                  => '6379',
                'password'              => 'JPem29ssjSzmGUf9FTuz',
                'database'              => 0,
                'alias'                 => 'master',
                'read_write_timeout'    => 0
            ),
);
$options = array(
            'replication' => true,
            'prefix' => 'wap:'
        );
$redis = new Predis\Client($redis_server, $options);

$catid = 10;
//指定key
$redis_key_zset= sprintf('zset:catid_%d', $catid);

//pdo获取文章数据
$query = $pdo->query('select * from article where catid='.$catid);
$article = $query->fetchAll(PDO::FETCH_ASSOC);

foreach($article as $v){
 $redis_val = json_encode($v);
 $redis_score = $v['views'];//文章浏览量
//存入redis
 $redis->zadd($redis_key_zset, $redis_score, $redis_val);
}

//获取指定key的数据
$result = $redis->zrange($redis_key_zset, 0, -1);

sortedset-有序集合

使用场景:比如某个文章分类下面所有的文章,现在想获取浏览量前10的文章,理论上讲可以通过set获取所有数据,然后遍历数组根据浏览量排序,但是有序集合自带光环,把每篇文章的内容序列化作为value存入一个集合中,浏览量作为score,这样即可实现按浏览量排序前10,只需一条命令即可。
有序集合类型有多种操作方法:降序zrevrange,升序range,集合中某一元素的排名zrank
存入使用zadd方法,降序取出使用zrevrange方法,升序取出使用range方法,更多方法介绍参看手册:http://doc.redisfans.com/sorted_set/index.html

<?php
$redis_server = array(
 array(
                'host'                  => '127.0.0.1',
                'port'                  => '6379',
                'password'              => 'JPem29ssjSzmGUf9FTuz',
                'database'              => 0,
                'alias'                 => 'master',
                'read_write_timeout'    => 0
            ),
);
$options = array(
            'replication' => true,
            'prefix' => 'wap:'
        );
$redis = new Predis\Client($redis_server, $options);

$catid = 10;
//指定key
$redis_key_zset= sprintf('zset:catid_%d', $catid);

//pdo获取文章数据
$query = $pdo->query('select * from article where catid='.$catid);
$article = $query->fetchAll(PDO::FETCH_ASSOC);

foreach($article as $v){
 $redis_val = json_encode($v);
 $redis_score = $v['views'];//文章浏览量
//存入redis
 $redis->zadd($redis_key_zset, $redis_score, $redis_val);
}

//获取指定key的数据
$result = $redis->zrevrange($redis_key_zset, 0, -1);

string-字符串

使用场景:常见的kv,键值字符串长度最大为512M,可以存大量数据进来。就是简单的当成cache来用,替代memcache。可以考虑把某一分类下的文章序列化存到一个key里。
使用set方法添加,使用get方法获取。string类型相对来说比较简单一些。更多用法请看手册:http://doc.redisfans.com/string/index.html

<?php
$redis_server = array(
 array(
                'host'                  => '127.0.0.1',
                'port'                  => '6379',
                'password'              => 'JPem29ssjSzmGUf9FTuz',
                'database'              => 0,
                'alias'                 => 'master',
                'read_write_timeout'    => 0
            ),
);
$options = array(
            'replication' => true,
            'prefix' => 'wap:'
        );
$redis = new Predis\Client($redis_server, $options);

$catid = 10;
//指定key
$redis_key_string= sprintf('string:catid_%d', $catid);

//pdo获取文章数据
$query = $pdo->query('select * from article where catid='.$catid);
$article = $query->fetchAll(PDO::FETCH_ASSOC);
$redis_val = json_encode($article);
$redis->set($redis_key_string, $redis_val);

//获取指定key的数据
$result = $redis->get($redis_key_string);

hash-哈希表

使用场景:hash表类型可以存储更细的信息,比如某一条文章,包含标题,内容,分类,浏览量等信息,可以把这些字段信息单独存成hash类型,比如要读取id为110这条信息的标题、浏览量等字段信息
这样的话可以直接用hmget方法获取,hvals方法获取所有的字段内容,存储使用hset,hmset方法。
更多用法请看手册:http://doc.redisfans.com/hash/index.html

<?php
$redis_server = array(
 array(
                'host'                  => '127.0.0.1',
                'port'                  => '6379',
                'password'              => 'JPem29ssjSzmGUf9FTuz',
                'database'              => 0,
                'alias'                 => 'master',
                'read_write_timeout'    => 0
            ),
);
$options = array(
            'replication' => true,
            'prefix' => 'wap:'
        );
$redis = new Predis\Client($redis_server, $options);

$catid = 10;


//pdo获取文章数据
$query = $pdo->query('select * from article where catid='.$catid);
$article = $query->fetchAll(PDO::FETCH_ASSOC);

foreach($article as $v){
 //指定key
 $redis_key_hash= sprintf('hash:catid_%d:articleid_%d', $catid, $v['articleid']);

//存入redis,该篇文章的所有字段内容,使用hmset方法
 $redis->hmset($redis_key_zset, $v);
}

//获取指定key的数据
$redis_key= sprintf('hash:catid_%d:articleid_%d', $catid, 110);
$result = $redis->hmget($redis_key, ['title', 'views']);

list-列表

使用场景:list列表类型一般情况下用于队列处理,入列lpush-队首、rpush-队尾,出列lpop-队首、rpop-队尾等。
比如我发布完一篇文章需要生成一个静态文件,同时把这篇文章推送到微博上去,这些操作可能都是比较耗费时间的,
这里可以使用队列实现,把文章信息序列化存入队列中,
在后台开启一个任务计划定时从队列中读取信息。
再比如:用户访问网站,需要统计当前页面的访问数据,同时把这些数据写入mysql库中,在并发并不高的情况可以直接连接数据库操作数据更新插入等,
但如果网站并发非常高的情况下,mysql负载肯定会非常高,也可以同样使用这种方式,因为程序把访问信息写入redis是非常快的,
后台定时从redis获取数据并写入mysql数据库中。
更多用法请看手册:http://doc.redisfans.com/list/index.html

当每次发布完文章之后都会执行以下代码往redis队列中入列一条记录

<?php
$redis_server = array(
 array(
                'host'                  => '127.0.0.1',
                'port'                  => '6379',
                'password'              => 'JPem29ssjSzmGUf9FTuz',
                'database'              => 0,
                'alias'                 => 'master',
                'read_write_timeout'    => 0
            ),
);
$options = array(
            'replication' => true,
            'prefix' => 'wap:'
        );
$redis = new Predis\Client($redis_server, $options);

$cache_list_key = 'cachelist';//队列key
//设置入列参数值
$cache_param = array(
    "pushdata"          => array(
        "id"            => 110,
        "title"         => 'redis队列使用方法',
        "catid"         => 10,
        "description"   => 'redis队列使用方法具体详解及使用场景',
    ),
    "pushtime"          => date('Y-m-d H:i:s')
);
$redis->rpush($cache_list_key, json_encode($cache_param));

后台任务计划同样简单

<?php
$redis_server = array(
 array(
                'host'                  => '127.0.0.1',
                'port'                  => '6379',
                'password'              => 'JPem29ssjSzmGUf9FTuz',
                'database'              => 0,
                'alias'                 => 'master',
                'read_write_timeout'    => 0
            ),
);
$options = array(
            'replication' => true,
            'prefix' => 'wap:'
        );
$redis = new Predis\Client($redis_server, $options);

$cache_list_key = 'cachelist';//队列key
$list_length = $redis->llen($cache_list_key);

for($i=1;$i<=$list_length-1;$i++){
    $cache_param_json = $redis->lpop($cache_list_key);
    $cache_param = json_decode($cache_param_json, true);
    if(isset($cache_param['pushdata']) && !empty($cache_param['pushdata'])){
        $id             = $cache_param['pushdata']['id'];
        $title          = $cache_param['pushdata']['title'];
        $catid          = $cache_param['pushdata']['catid'];
        $description    = $cache_param['pushdata']['description'];
       
        //得到文章信息之后进一步执行生成文章代码及推送微博
    }
}

redis3.2版本中支持GEO地理位置信息检索,请看官网文档https://redis.io/commands/geoadd

注:请注意代码中key的变化


本文固定链接:成事博客predis的5种数据结构类型(string,set,zset,hash,list)使用方法及基础使用场景
喜欢 (0)分享 (0)
发表我的评论
取消评论

表情     9 + 6 = ? (必填)

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址