zoukankan      html  css  js  c++  java
  • php redis 常用操作

    今天在改代码的时候,遇到代码里面有使用redis拓展,于是来学习了解一下php-redis相关的操作,以便在今后的项目中可以熟练运用。

    Redis是什么

      官方(http://www.redis.cn/)是这么说的,Redis是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件。它支持多种类型的数据结构,如字符串(strings),散列(hashes),列表(lists),集合(sets),有序集合(sortedsets)与范围查询,bitmaps,hyperloglogs和地理空间(geospatial)索引半径查询。Redis内置了复制(replication),LUA脚本(Luascripting),LRU驱动事件(LRUeviction),事务(transactions)和不同级别的磁盘持久化(persistence),并通过Redis哨兵(Sentinel)和自动分区(Cluster)提供高可用性(highavailability)。

      总结:Redis是一个内存中的数据结构存储系统,支持多种类型的数据结构,包含字符串(strings),散列(hashes),列表(lists),集合(sets),有序集合(sortedsets)等。

      知道了redis是什么,那么接下来就有一个疑问,redis既然是数据结构存储系统,那就相当于是数据库了,既然是数据库,我们已经有了mysql,mssql,oracle等关系数据库,而且它们应用都非常的普遍和广泛,那redis存在的意义何在呢?

    Redis的优势

      1、性能极高 – Redis能读的速度是110000次/s,写的速度是81000次/s 。
      2、丰富的数据类型 – Redis支持二进制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 数据类型操作。
      3、原子性 – Redis的所有操作都是原子性的,意思就是要么成功执行要么失败完全不执行。单个操作是原子性的。多个操作也支持事务,即原子性,通过MULTI和EXEC指令包起来。
      4、丰富的特性 – Redis还支持 publish/subscribe, 通知, key 过期等等特性。
      5、Redis有着更为复杂的数据结构并且提供对他们的原子性操作,这是一个不同于其他数据库的进化路径。Redis的数据类型都是基于基本数据结构的同时对程序员透明,无需进行额外的抽象。
      6、Redis运行在内存中但是可以持久化到磁盘,所以在对不同数据集进行高速读写时需要权衡内存,因为数据量不能大于硬件内存。在内存数据库方面的另一个优点是,相比在磁盘上相同的复杂的数据结构,在内存中操作起来非常简单,这样Redis可以做很多内部复杂性很强的事情。同时,在磁盘格式方面他们是紧凑的以追加的方式产生的,因为他们并不需要进行随机访问。

      通过以上分析,我们可以看出redis有不同于关系数据库的优势,这就是它存在的意义。

    Redis的安装

      请参考https://www.runoob.com/redis/redis-install.html,包含了window下和linux下的安装步骤。

    下面来说一说php-redis的相关操作

    【链接redis服务器】

    1 $redis = new Redis();//实例化redis拓展 - 如果未安装redis拓展,请对照php版本安装对应的redis,才能使用以下功能
    2 $connect = $redis->connect('127.0.0.1', 6379);//连接redis服务器
    3 $redis->auth("redispassword");//redis密码验证
    4 var_dump($connect); //bool(true)
    5 
    6 $redis->select(1);//选择指定库,默认0-15

    phpinfo检测redis拓展是否安装

    redis客户端工具截图

    【String类型操作】

     1 $redis->set('key','TK');//设置键为key值为TK
     2 
     3 $redis->set('number','1');//设置键为key值为1
     4 
     5 $redis->setex('key',5,'TK'); //设置键为key值为TK且有效期为5秒
     6 
     7 $redis->psetex('key',5000,'TK'); //设置键为key值为TK且有效期为5000毫秒(同5秒)
     8 
     9 $redis->setnx('key','XK'); //若键值存在返回false 不存在返回true
    10 
    11 $redis->delete('key'); // 删除键值 可以传入数组 array('key1','key2')删除多个键
    12 
    13 $redis->getSet('key','XK'); //将键key的值设置为XK, 并返回这个键值原来的值TK
    14 
    15  $ret = $redis->multi()  //批量事务处理,不保证处理数据的原子性
    16 
    17         ->set('key1', 'val1')
    18 
    19         ->get('key1')
    20 
    21         ->setnx('key', 'val2')
    22 
    23         ->get('key2')
    24 
    25         ->exec();
    26 
    27 $redis->watch('key');   // 监控键key 是否被其他客户端修改,如果KEY在调用watch()和exec()之间被修改,exec失败
    28 
    29 //频道订阅  
    30 function f($redis, $chan, $msg) {
    31     switch($chan) {        
    32 
    33         case 'chan-1':            
    34 
    35         echo $msg;            
    36 
    37         break;        
    38 
    39         case 'chan-2':            
    40 
    41         echo $msg;            
    42 
    43         break;        
    44 
    45         case 'chan-2':            
    46 
    47         echo $msg;            
    48 
    49         break;
    50     }
    51 }
    52 
    53 $redis->subscribe(array('chan-1', 'chan-2', 'chan-3'), 'f'); // subscribe to 3 
    54 
    55 $redis->publish('chan-1', 'hello, world!'); // send message.
    56 
    57 $redis->exists('key'); //验证键是否存在,存在返回true
    58 
    59 $redis->incr('number'); //键值加1
    60 
    61 $redis->incrby('number',-10); //键值加减10
    62 
    63 $redis->incrByFloat('number', +/- 1.5); //键值加减小数
    64 
    65 $redis->decr('number'); // 键值减1
    66 
    67 $redis->decrBy('number',10); // 键值减10
    68 
    69 $mget = $redis->mget(array('number','key')); // 批量获取键值,返回一个数组
    70 
    71 $redis->mset(array('key0' => 'value0', 'key1' => 'value1')); // 批量设置键值
    72 
    73 $redis->msetnx(array('key0' => 'value0', 'key1' => 'value1')); // 批量设置键值,类似将setnx()方法批量操作
    74 
    75 $redis->append('key', '-Smudge'); //原键值TK,将值追加到键值后面,键值为TK-Smudge
    76 
    77 $redis->getRange('key', 0, 5); // 键值截取从0位置开始到5位置结束
    78 
    79 $redis->getRange('key', -6, -1); // 字符串截取从-6(倒数第6位置)开始到-1(倒数第1位置)结束
    80 
    81 $redis->setRange('key', 0, 'Smudge'); // 键值中替换字符串,0表示从0位置开始,有多少个字符替换多少位置,其中汉字占2个位置
    82 
    83 $redis->strlen('key'); //键值长度
    84 
    85 $redis->getBit('key'); //键值长度
    86 
    87 $redis->setBit('key'); //键值长度

    【list类型操作】

     1 $redis->delete('list-key'); // 删除链表
     2 
     3 $redis->lPush('list-key', 'A'); //插入链表头部/左侧,返回链表长度
     4 
     5 $redis->rPush('list-key', 'B'); //插入链表尾部/右侧,返回链表长度
     6 
     7 $redis->lPushx('list-key', 'C'); // 插入链表头部/左侧,链表不存在返回0,存在即插入成功,返回当前链表长度
     8 
     9 $redis->rPushx('list-key', 'C'); // 插入链表尾部/右侧,链表不存在返回0,存在即插入成功,返回当前链表长度
    10 
    11 $redis->lPop('list-key'); //返回LIST顶部(左侧)的VALUE ,后入先出(栈)
    12 
    13 $redis->rPop('list-key'); //返回LIST尾部(右侧)的VALUE ,先入先出(队列)
    14 
    15 $redis->blPop(); //移出并获取列表的第一个元素, 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止
    16 
    17 $redis->brPop(); //移出并获取列表的最后一个元素, 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止
    18 
    19 $redis->lSize('list-key'); // 如果是链表则返回链表长度,空链表返回0 ,若不是链表或者不为空,则返回false ,判断非链表 " === false "
    20 
    21 $redis->lGet('list-key',-1); // 通过索引获取链表元素 0获取左侧一个  -1获取最后一个
    22 
    23 $redis->lSet('list-key', 0, 'X'); //0位置元素替换为 X
    24 
    25 $redis->lRange('list-key', 0, 3); //链表截取 从0开始 3位置结束 ,结束位置为-1 获取开始位置之后的全部
    26 
    27 $redis->lTrim('list-key', 0, 1); // 截取链表(不可逆) 从0索引开始 1索引结束
    28 
    29 $redis->lRem('list-key', 'C', 2); //链表从左开始删除元素2个C
    30 
    31 $redis->lInsert('list-key', Redis::BEFORE, 'C', 'X'); // 在C元素前面插入X  , Redis::AfTER(表示后面插入),链表不存在则插入失败 返回0 若元素不存在返回-1
    32 
    33 $redis->rpoplpush('list-key', 'list-key2'); //从源LIST的最后弹出一个元素,并且把这个元素从目标LIST的顶部(左侧)压入目标LIST。
    34 
    35 $redis->brpoplpush(); //rpoplpush的阻塞版本,这个版本有第三个参数用于设置阻塞时间,即如果源LIST为空,那么可以阻塞监听timeout的时间,如果有元素了则执行操作。

    【Set类型操作】

     1 $redis->sMembers('key'); //获取容器key中所有元素
     2 
     3 $redis->sAdd('key' , 'TK'); // (从左侧插入,最后插入的元素在0位置),集合中已经存在TK 则返回false,不存在添加成功 返回true
     4 
     5 $redis->sRem('key' , 'TK'); // 移除容器中的TK
     6 
     7 $redis->sMove('key','key1','TK'); //将容易key中的元素TK 移动到容器key1  操作成功返回TRUE
     8 
     9 $redis->sIsMember('key','TK'); //检查VALUE是否是SET容器中的成员
    10 
    11 $redis->sCard('key'); //返回SET容器的成员数
    12 
    13 $redis->sPop('key'); //随机返回容器中一个元素,并移除该元素
    14 
    15 $redis->sRandMember('key');//随机返回容器中一个元素,不移除该元素
    16 
    17 $redis->sInter('key','key1'); // 返回两个集合的交集 没有交集返回一个空数组,若参数只有一个集合,则返回集合对应的完整的数组
    18 
    19 $redis->sInterStore('store','key','key1'); //将集合key和集合key1的交集 存入容器store 成功返回1
    20 
    21 $redis->sUnion('key','key1'); //集合key和集合key1的并集  注意即使多个集合有相同元素,只保留一个
    22 
    23 $redis->sUnionStore('store','key','key1');  //集合key和集合key1的并集保存在集合store中,  注意即使多个集合有相同元素 只保留一个
    24 
    25 $redis->sDiff('key','key1','key2'); //返回数组,该数组元素是存在于key集合而不存在于集合key1 key2

    【Hash类型操作】

     1 $redis->hSet('h', 'name', 'TK'); // 在h表中 添加name字段 value为TK
     2 
     3 $redis->hSetNx('h', 'name', 'TK'); // 在h表中 添加name字段 value为TK 如果字段name的value存在返回false 否则返回 true
     4 
     5 $redis->hGet('h', 'name'); // 获取h表中name字段value
     6 
     7 $redis->hLen('h'); // 获取h表长度即字段的个数
     8 
     9 $redis->hDel('h','email'); // 删除h表中email 字段
    10 
    11 $redis->hKeys('h'); // 获取h表中所有字段
    12 
    13 $redis->hVals('h'); // 获取h表中所有字段value
    14 
    15 $redis->hGetAll('h'); // 获取h表中所有字段和value 返回一个关联数组(字段为键值)
    16 
    17 $redis->hExists('h', 'email'); //判断email 字段是否存在与表h 不存在返回false
    18 
    19 $redis->hIncrBy('h', 'age', -2); // 设置h表中age字段value加(-2) 如果value是个非数值 则返回false 否则,返回操作后的value
    20 
    21 $redis->hIncrByFloat('h', 'age', -0.33);  // 设置h表中age字段value加(-2.6) 如果value是个非数值 则返回false 否则返回操作后的value(小数点保留15位)
    22 
    23 $redis->hMset('h', array('score' => '80', 'salary' => 2000)); // 表h 批量设置字段和value
    24 
    25 $redis->hMGet('h', array('score','salary')); // 表h 批量获取字段的value

    先整理4种最常用的,其他的后续再学习整理

  • 相关阅读:
    微服务架构技术栈选型手册(万字长文)
    Visual Studio 2013 always switches source control plugin to Git and disconnect TFS
    Visual Studio 2013 always switches source control plugin to Git and disconnect TFS
    MFC对话框中使用CHtmlEditCtrl
    ATL开发 ActiveX控件的 inf文件模板
    ActiveX: 如何用.inf和.ocx文件生成cab文件
    Xslt 1.0中使用Array
    如何分隔两个base64字符串?
    An attempt was made to load a program with an incorrect format
    JQuery 公网 CDN
  • 原文地址:https://www.cnblogs.com/firstlady/p/11193767.html
Copyright © 2011-2022 走看看