zoukankan      html  css  js  c++  java
  • thinkphp 使用redis 整理(二) mark 一下

    参考手册   http://www.cnblogs.com/weafer/archive/2011/09/21/2184059.html

    redis  几种数据类型选择,参考 :

        https://blog.csdn.net/xlgen157387/article/details/60958657

      https://www.cnblogs.com/George1994/p/7191011.html

    PHP + redis 类库: https://www.cnblogs.com/whoamme/p/5379469.html

    实际代码中应用:

    参考 : http://www.runoob.com/redis/redis-data-types.html 

    整理如下:

    数组 排序  array_multisort(array_column($list,'order_no'),SORT_DESC,$list); // 根据数组中某个字段 倒序排序

    $findkey = $this->redis->Keys('product:news:'.$pro_id); // zset    或者 string

    $this->redis->delete($findkey);

    可直接 使用 $this->redis->del('product:news:1');    即指定key 进行删除 $this->redis->del('index_info');

    删除 所有detail :

        $ret = $this->redis->Keys('news:detail:*');

        $this->redis->delete($ret);

    几种常用数据类型

    1.String  字符串类型, key value 的数据类型   (推荐/置顶  的几条数据)

    当查询返回的数据$data是数组时,(单个值时,不需要json_encode … 处理)


     注意:两数组合并时,避免null 影响合并,需转换数据类型。

    $data=array_merge((array)$pushdata,(array)$data);   
    [rɪˈkɜ:sɪv]   递归的

    array_merge_recursive() 与 array_merge() 函数的区别在于处理两个或更多个数组元素有相同的键名时。array_merge_recursive() 不会进行键名覆盖,而是将多个相同键名的值递归组成一个数组。

    二维数组 选择某个字段 作为key  键名: 出处 https://blog.csdn.net/m0_38030271/article/details/80660271
    $newArr= array_column($array,NULL,'某个字段');


     ==========


     ==========

    赋值:$this->redis->set(‘news:topdata‘,json_encode($data));

    取值:json_decode($this->redis->get(‘news: topdata’),true);  数据转换成数组

    2.Hash 哈希 类型,一个string 类型的field ,value 的映射表,适合 存储对象(详情页detail时  利用该类型)

    注意 :获取多条数据时,hMget;    单条数据时,hGet,例如 上下篇:

    Json_decode($this->redis->hGet(‘news:list’,$preno),true); // 上下篇

     ==========

     

     ========== 

    删除: $this->redis->del(‘news:list’);// 删除 全部

    移除某一条:$this->redis->hDel(‘news:list’, $id);  // 注意 hDel 需要传递两个参数

    赋值:

      多条数据:$this->redis->hMset(‘news:list’,$data);// $data 即查询返回的二维数组

      单条数据:$this->redis->hSet(‘news:list’, $id , json_encode($data) );

    判断news:list是否有数据 可使用:$this->redis->hLen(‘news:list’);

    取值:$this->redis->hMget(‘news:list’,$ids);// 返回json 格式  

    $news = jsonToArray($news);// 转换成 数组

    function jsonToArray($array)

    {     

      return array_map('arrayMapHandler',$array);  

    }

    function arrayMapHandler($v){
      $res = json_decode($v,true);
      if($res || $v == '[]'){
        return $res; 
      }else{
        return $v;
      }
    }

    详情 detail

     ========== 

     

     ========== 

    赋值:$this->redis->hMset(‘news:detail:’.$id,$detail);// …->field(‘…’)->find();

    取值:$this->redis->hMget(‘news:detail:’.$id,[‘id’,’title’,’content’]);  //

      获取 某个字段的值

      $data= $this->redis->hMGet('solution:detail:213',['status']);  echo $data['status'];

      $stu = $this->redis->hGet('solution:detail:213','status');  echo $stu;

    判断detail 是否存在: If(!$this->redis->exists(‘news:detail:’.$id)){// 不存在,此时需要记入redis}

    3.ZSET(sorted set :有序集合) 类型,和set 一样也是string类型元素的集合不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。成员是唯一的,但分数 score 却可以重复

     ========== 

     

     ========== 

    删除:$this->redis->del(‘news:id’);// 多条

    移除某一条:$this->redis ->zRem(‘news:id’, $id);

    赋值:

      多条数据:

        $ids = $model->…->getField(‘order_no,id’);// 返回以 order_no 为key 的数组

        $this->redis->zAddArray (‘news:id’, $ids);

      $arr = $model->...->field('id,name,sex,sort,....')->order('sort desc')->select();

      $data = [];

      foreach($arr as $key =>$val){

        $arr[$val['sort']] = $val; // 返回 以sort 为主键的数组

      }

       $this->redis->zAddArray("product:", $data );

     单条数据:$this->redis->zAdd(‘news:id’, $cur_orderno, $cur_id);

    获取个数 或者 判断news:id 是否存在,可使用:$sum = $this->redis->zCard(‘news:id’);// zCard  返回有序集合的成员数

    取值: 取新闻为例,分页读取新闻列表数据时

    $page = I(‘get.page’,1,’intval’);

    $row =10;

    $start = ($page-1)*$row;

    $end = $start +($row-1);

    $ids = $this->redis->zRevRange(‘news:id’, $start , $end);// 返回 有序集中指定区间内成员,通过索引,分数从高到低

    【$ids = $this->redis->zRevRange('news:id',0,-1)】 即返回全部

    $news = $this->redis->hMget(‘news:list‘,   $ids);

    $news =jsonToArray($news);

    上下篇处理

    zRevRangeByScore :从高到低的分数排序 ,读取范围内的数据    http://blog.csdn.net/chwshuang/article/details/52834380

    zRangeByScore : 读取范围内的数据

    参数: 有序集合键名称,  max ,min, [WITHSCORES] [LIMIT offset count]

    +inf和-inf分别表示Sorted-Sets中分数的最大值和最小值  

    $order_no = $this->redis->zScore('news:id',$id); // 返回名称为key的zset中元素 $id 的score

    $nextno = $this->redis->zRevRangeByScore('news:id', $order_no, '-inf', ['limit'=>[1,1]] ); // 下一篇    

    $preno = $this->redis->zRangeByScore('news:id', $order_no, '+inf', ['limit'=>[1,1]] ); // 上一篇

    zset   并集zUnion,交集 zInter  

  • 相关阅读:
    贪心——poj百炼3468:电池寿命
    贪心——部分背包
    C++编程规范
    调和级数求和
    人工神经网络
    Latex各种符号
    poj1088 滑雪,dp
    数据挖掘建模过程
    Java MyEclipse:The type java.lang.CharSequence cannot be resolved. It is indirectly referen
    Java调用阿里云短信接口发送手机验证码
  • 原文地址:https://www.cnblogs.com/yehuisir/p/11063177.html
Copyright © 2011-2022 走看看