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 相关文章推荐
PHP分页显示制作详细讲解
Oct 09 PHP
php设计模式 Prototype (原型模式)代码
Jun 26 PHP
PHP验证码函数代码(简单实用)
Sep 29 PHP
PHP基于imap获取邮件实例
Nov 11 PHP
作为程序员必知的16个最佳PHP库
Dec 09 PHP
Laravel5中防止XSS跨站攻击的方法
Oct 10 PHP
Yii2学习笔记之汉化yii设置表单的描述(属性标签attributeLabels)
Feb 07 PHP
Thinkphp3.2简单解决多文件上传只上传一张的问题
Sep 26 PHP
PHP迭代器和迭代的实现与使用方法分析
Apr 19 PHP
ThinkPHP5 的简单搭建和使用详解
Nov 15 PHP
ThinkPHP5+UEditor图片上传到阿里云对象存储OSS功能示例
Aug 05 PHP
TP5框架使用QueryList采集框架爬小说操作示例
Mar 26 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中SERIALIZE和JSON的序列化与反序列化操作区别分析
2016/10/11 PHP
利用PHP判断是否是连乘数字串的方法示例
2017/07/03 PHP
Yii框架组件的事件机制原理与用法分析
2020/04/07 PHP
PHP设计模式(九)外观模式Facade实例详解【结构型】
2020/05/02 PHP
jquery实现弹出层完美居中效果
2014/03/03 Javascript
JavaScript数据结构和算法之二叉树详解
2015/02/11 Javascript
js鼠标点击图片切换效果代码分享
2015/08/26 Javascript
浅析JS原型继承与类的继承
2016/04/07 Javascript
jQuery实现手机版页面翻页效果的简单实例
2016/10/05 Javascript
jQuery中的deferred使用方法
2017/03/27 jQuery
ES6正则的扩展实例详解
2017/04/25 Javascript
Vue2.0 组件传值通讯的示例代码
2017/08/01 Javascript
js实现登录注册框手机号和验证码校验(前端部分)
2017/09/28 Javascript
简单了解vue.js数组的常用操作
2019/06/17 Javascript
VUE+node(express)实现前后端分离
2019/10/13 Javascript
create-react-app中添加less支持的实现
2019/11/15 Javascript
用Python实现协同过滤的教程
2015/04/08 Python
python中requests库session对象的妙用详解
2017/10/30 Python
python语言中with as的用法使用详解
2018/02/23 Python
使用Python如何测试InnoDB与MyISAM的读写性能
2018/09/18 Python
padas 生成excel 增加sheet表的实例
2018/12/11 Python
Python3数字求和的实例
2019/02/19 Python
Django学习笔记之为Model添加Action
2019/04/30 Python
用python拟合等角螺线的实现示例
2019/12/27 Python
Python3.7黑帽编程之病毒篇(基础篇)
2020/02/04 Python
vue学习笔记之动态组件和v-once指令简单示例
2020/02/29 Python
基于python实现计算且附带进度条代码实例
2020/03/31 Python
浅谈sklearn中predict与predict_proba区别
2020/06/28 Python
大学生毕业自我鉴定范文
2013/11/03 职场文书
护理专业自荐信范文
2014/02/26 职场文书
经销商年会策划方案
2014/05/29 职场文书
优秀本科毕业生自荐信
2014/07/04 职场文书
领导班子整改方案和个人整改措施
2014/10/25 职场文书
活动新闻稿范文
2015/07/17 职场文书
2019开业庆典剪彩仪式主持词!
2019/07/22 职场文书
python opencv常用图形绘制方法(线段、矩形、圆形、椭圆、文本)
2021/04/12 Python