php-redis中的sort排序函数总结


Posted in PHP onJuly 08, 2015

很多人把redis当成一种数据库,其实是利用redis来构造数据库的模型,有那种数据库的味道。但是在怎么构建还是key和value的关系,与真正的关系型数据库还是不一样的。

效率高,不方便;方便的,效率不高;又方便,效率又高的要花钱。

php-redis里面的sort函数,在做web的时候取数据还是比较方便,有点关系型数据库的味道。在说sort前,先说一下前面漏的几个比较常用的函数。

 1) keys

描述:查找符合给定模式的key
参数:匹配模式
返回值:符合给定模式的key列表

2) mset

描述:同时设置一个或多个key-value对。当发现同名的key存在时,MSET会用新值覆盖旧值,如果你不希望覆盖同名key,请使用MSETNX命令。MSET是一个原子性(atomic)操作,所有给定key都在同一时间内被设置,某些给定key被更新而另一些给定key没有改变的情况,不可能发生。
参数:数组
返回值:总是返回OK(因为MSET不可能失败)

3) mget

描述:返回所有(一个或多个)给定key的值。如果某个指定key不存在,那么返回特殊值nil。因此,该命令永不失败。
参数:key的数组
返回值:一个包含所有给定key的值的列表

示例:

<?php  

    $redis = new redis();  

    $redis->connect('192.168.1.108', 6379);  

    $redis->flushall();   

       

    $array=array('tank'=>'1',  

              'zhang'=>'2',  

              'ying'=>'3',  

              'test'=>'4');  

    $redis->mset($array);  

    print_r($redis->keys('*s*'));        // 结果:Array ( [0] => test )  

    print_r($redis->keys('y???'));       // 结果:Array ( [0] => ying )  

    print_r($redis->keys('t[e]*'));  // 结果:Array ( [0] => test )  

    print_r($redis->keys('*'));      // 结果:Array ( [0] => ying [1] => test [2] => zhang [3] => tank )   

       

    print_r($redis->mget(array("tank","ying")));     // 结果:Array ( [0] => 1 [1] => 3 )  

?>

4) sort

描述:按条件取得数据
参数:

array(

    'by' => 'pattern', //匹配模式

    'limit' => array(0, 1),

    'get' => 'pattern'

    'sort' => 'asc' or 'desc',

    'alpha' => TRUE,

    'store' => 'external-key'

)

返回或保存给定列表、集合、有序集合key中经过排序的元素。

一般排序

<?php  

    $redis = new redis();  

    $redis->connect('192.168.1.108', 6379);  

    $redis->flushall();  

    $redis->lpush('test', 1);  

    $redis->lpush('test', 10);  

    $redis->lpush('test', 8);  

       

    print_r($redis->sort('test')); //结果:Array ( [0] => 1 [1] => 8 [2] => 10 )  

?>

字母排序

<?php  

    $redis = new redis();  

    $redis->connect('192.168.1.108', 6379);  

    $redis->flushall();  

    $redis->lpush('test', 'a');  

    $redis->lpush('test', 'd');  

    $redis->lpush('test', 'b');  

       

    print_r($redis->sort('test')); //结果:Array ( [0] => b [1] => d [2] => a )  

    print_r($redis->sort('test',array('ALPHA'=>TRUE))); //结果:Array ( [0] => a [1] => b [2] => d )  

?>

 

排序取部分数据

<?php  

    $redis = new redis();  

    $redis->connect('192.168.1.108', 6379);  

    $redis->flushall();  

    $redis->lpush('test', 31);  

    $redis->lpush('test', 5);  

    $redis->lpush('test', 2);  

    $redis->lpush('test', 23);    

       

    $array = array('LIMIT'=>array(0,3),"SORT"=>'DESC');  

    print_r($redis->sort('test',$array));  //结果:Array ( [0] => 31 [1] => 23 [2] => 5 )  

?>

使用外部key进行排序

有时候你会希望使用外部的key作为权重来比较元素,代替默认的对比方法。

假设现在有用户(user)表数据如下:

id   name

score  

-------------------------------  

1

 tank
    89  

2

 zhang
   40  

4       ying 
   70  

3 
   fXXK 
    90

id数据保存在key名为id的列表中。
name数据保存在key名为name_{id}的列表中
score数据保存在score_{id}的key中。

<?php  

    $redis = new redis();  

    $redis->connect('192.168.1.108', 6379);  

    $redis->flushall();   

       

    $redis->lpush('id', 1);  

    $redis->set('name_1', 'tank');  

    $redis->set('score_1',89);  

       

    $redis->lpush('id', 2);  

    $redis->set('name_2', 'zhang');  

    $redis->set('score_2', 40);  

       

    $redis->lpush('id', 4);  

    $redis->set('name_4','ying');  

    $redis->set('score_4', 70);  

       

    $redis->lpush('id', 3);  

    $redis->set('name_3', 'fXXK');  

    $redis->set('score_3', 90);  

       

    /** 

     * 按score从大到小排序,取得id 

     */ 

    $sort=array('BY'=>'score_*',  

                'SORT'=>'DESC' 

                );  

    print_r($redis->sort('id',$sort)); //结果:Array ( [0] => 3 [1] => 1 [2] => 4 [3] => 2 )   

       

    /** 

     * 按score从大到小排序,取得name 

     */ 

    $sort=array('BY'=>'score_*',  

                'SORT'=>'DESC',  

                'GET'=>'name_*' 

                );  

    print_r($redis->sort('id',$sort)); //结果:Array ( [0] => fXXK [1] => tank [2] => ying [3] => zhang )    

       

    /** 

     * 按score从小到大排序,取得name,score 

     */ 

    $sort=array('BY'=>'score_*',  

                'SORT'=>'DESC',  

                'GET'=>array('name_*','score_*')  

                );  

    print_r($redis->sort('id',$sort));  

    /** 

     *结果:Array 

            ( 

                [0] => fXXK 

                [1] => 90 

                [2] => tank 

                [3] => 89 

                [4] => ying 

                [5] => 70 

                [6] => zhang 

                [7] => 40 

            )) 

     */ 

       

    /** 

     * 按score从小到大排序,取得id,name,score 

     */ 

    $sort=array('BY'=>'score_*',  

                'SORT'=>'DESC',  

                'GET'=>array('#','name_*','score_*')  

                );  

    print_r($redis->sort('id',$sort));  

    /** 

     * 结果:Array 

            ( 

                [0] => 3 

                [1] => fXXK 

                [2] => 90 

                [3] => 1 

                [4] => tank 

                [5] => 89 

                [6] => 4 

                [7] => ying 

                [8] => 70 

                [9] => 2 

                [10] => zhang 

                [11] => 40 

            ) 

     */ 

?>
PHP 相关文章推荐
初学CAKEPHP 基础教程
Nov 02 PHP
一步一步学习PHP(7) php 字符串相关应用
Mar 05 PHP
PHP用mysql数据库存储session的代码
Mar 05 PHP
PHP中Fatal error session_start()错误解决步骤
Aug 05 PHP
PHP也能干大事 随机函数
Apr 14 PHP
php实现编辑和保存文件的方法
Jul 20 PHP
PHP会话处理的10个函数
Aug 11 PHP
PHP中文竖排转换实现方法
Oct 23 PHP
ThinkPHP的常用配置选项汇总
Mar 24 PHP
php计算多个集合的笛卡尔积实例详解
Feb 16 PHP
php查询内存信息操作示例
May 09 PHP
php使用goto实现自动重启swoole、reactphp、workerman服务的代码
Apr 13 PHP
PHP通过串口实现发送短信
Jul 08 #PHP
PHP使用CURL模拟登录的方法
Jul 08 #PHP
一个PHP实现的轻量级简单爬虫
Jul 08 #PHP
PHP设置进度条的方法
Jul 08 #PHP
smarty内部日期函数html_select_date()用法实例分析
Jul 08 #PHP
php类的定义与继承用法实例
Jul 07 #PHP
php抽象类用法实例分析
Jul 07 #PHP
You might like
php时间不正确的解决方法
2008/04/09 PHP
php入门学习知识点二 PHP简单的分页过程与原理
2011/07/14 PHP
基于PHP Socket配置以及实例的详细介绍
2013/06/13 PHP
php不使用插件导出excel的简单方法
2014/03/04 PHP
繁简字转换功能
2006/07/19 Javascript
JS+XML 省份和城市之间的联动实现代码
2009/10/14 Javascript
分享20多个很棒的jQuery 文件上传插件或教程
2011/09/04 Javascript
JS声明变量背后的编译原理剖析
2012/12/28 Javascript
jQuery 获取浏览器所在的IP地址的小例子
2013/11/08 Javascript
JS 日期比较大小的简单实例
2014/01/13 Javascript
JavaScript iframe数据共享接口实现方法
2016/01/06 Javascript
socket.io学习教程之基本应用(二)
2017/04/29 Javascript
vue中mint-ui的使用方法
2018/04/04 Javascript
vue底部加载更多的实例代码
2018/06/29 Javascript
对layui中的onevent 和event的使用详解
2019/09/06 Javascript
vue中的过滤器及其时间格式化问题
2020/04/09 Javascript
[03:36]2015国际邀请赛第二日现场精彩集锦
2015/08/06 DOTA
python3下实现搜狗AI API的代码示例
2018/04/10 Python
Go/Python/Erlang编程语言对比分析及示例代码
2018/04/23 Python
用TensorFlow实现多类支持向量机的示例代码
2018/04/28 Python
python制作填词游戏步骤详解
2019/05/05 Python
详解Django ORM引发的数据库N+1性能问题
2020/10/12 Python
Jupyter Notebook添加代码自动补全功能的实现
2021/01/07 Python
linux面试题参考答案(9)
2015/01/07 面试题
社区党员先进事迹
2014/01/22 职场文书
教师师德反思材料
2014/02/15 职场文书
幼儿园小班教师寄语
2014/04/03 职场文书
幼儿园感谢信
2015/01/21 职场文书
电气工程师岗位职责
2015/02/12 职场文书
售房协议书范本
2015/08/11 职场文书
安全教育的主题班会
2015/08/13 职场文书
2016年暑假家长对孩子评语
2015/12/01 职场文书
爱心捐款倡议书:点燃希望,传递温暖
2019/11/04 职场文书
详解TS数字分隔符和更严格的类属性检查
2021/05/06 Javascript
Golang Gob编码(gob包的使用详解)
2021/05/07 Golang
python实现Nao机器人的单目测距
2021/09/04 Python