zoukankan      html  css  js  c++  java
  • redis在php中的应用(string篇)

    string(字符串)

    1、SET

    Redis SET 命令用于设置给定 key 的值。如果 key 已经存储其他值, SET 就覆写旧值,且无视类型。

    语法:

    redis 127.0.0.1:6379> SET KEY_NAME VALUE

    返回值: 设置成功时返回 OK 。当seconds参数不合法时,返回一个错误。

    可用版本:>= 2.0.0

    时间复杂度:O(1)

    具体实例:

    <?php
    $redis = new redis();
    $redis -> connect('127.0.0.1',6379);
    $redis -> flushAll();
    
    // This first case: 最字符串类型的 key 进行 set
    $redis -> set('favorite_fruit','apple');
    var_dump($redis -> get('favorite_fruit'));       // string apple
    
    // This second case: 最非字符串类型的 key 进行 set
    $redis -> lPush('pats','dog');
    $redis -> type('pats');                // list
    $redis -> set('pats','cat');           // 不管类型为什么,都可以完成覆盖
    var_dump($redis -> get('pats'));       // string cat

    2、SETNX

    Redis Setnx(SET if Not eXists) 命令在指定的 key 不存在时,为 key 设置指定的值

    语法:

    redis 127.0.0.1:6379> SETNX KEY_NAME VALUE

    返回值: 设置成功,返回 1 。 设置失败,返回 0 。

    可用版本: >= 1.0.0

    时间复杂度:O(1)

    具体实例:

    <?php
    $redis = new redis();
    $redis -> connect('127.0.0.1',6379);
    $redis -> flushAll();
    
    $redis -> setnx('job','programmer');
    $redis -> setnx('job','code-farmer');
    var_dump($redis -> get('job'));       // string programmer ,没有被覆盖

    3、SETEX

    Redis Setex 命令为指定的 key 设置值及其过期时间。如果 key 已经存在, SETEX 命令将会替换旧的值。

    语法:

    redis 127.0.0.1:6379> SETEX KEY_NAME TIMEOUT VALUE

    该命令类似于一下 2 个命令:

    $redis -> set('key','value');       // 设置值
    $redis -> expire('key','seconds');  // 设置生存时间

    不同之处在于,SETEX 是一个原子性操作,设置值和生存时间同时完成,该命令在redis用做缓存是非常有用。

    返回值: 设置成功时返回OK。当seconds参数不合法时,返回一个错误。。

    可用版本: >= 2.0.0

    时间复杂度:O(1)

    具体实例:

    <?php
    $redis = new redis();
    $redis -> connect('127.0.0.1',6379);
    $redis -> flushAll();
    
    // This first case: key 不存在
    $redis -> setex('mykey',20,'redis');
    echo $redis -> get('mykey');           // redis
    sleep(2);
    var_dump($redis -> ttl('mykey'));      // 18
    
    // This second case: key 已存在,覆盖
    $redis -> set('job','programmer');
    $redis -> setex('job',10,'code-farmer');
    echo $redis -> get('job');              // code
    sleep(2);
    var_dump($redis -> ttl('job'));         // 8

    4、SETRANGE

    Redis Setrange 命令用指定的字符串覆盖给定 key 所储存的字符串值,覆盖的位置从偏移量 offset 开始。

    语法:

    redis 127.0.0.1:6379> SETRANGE KEY_NAME OFFSET VALUE

    返回值: 被修改后的字符串长度。

    可用版本: >= 2.2.0

    时间复杂度:对小(small)的字符串,平摊复杂度O(1)。(关于什么字符串是”小”的,请参考APPEND命令)否则为O(M),M为value参数的长度。

    具体实例:

    <?php
    $redis = new redis();
    $redis -> connect('127.0.0.1',6379);
    $redis -> flushAll();
    
    // This first case: 对非空字符串进行 SETRANGE
    $redis -> set('key1','Hello world');
    $redis -> setRange('key1',6,'redis');
    var_dump($redis -> get('key1'));           // Hello redis
    
    // This second case: 对空字符串进行 SETRANGE
    if(! $redis -> exists('fake_key')) {
        $redis -> setRange('fake_key',5,'redis');
        var_dump($redis -> get('fake_key'));  // string '�����redis' (length=10) ,空白处被 � 填充了。
    }

    5、MSET

    Redis Mset 命令用于同时设置一个或多个 key-value 对。

    (1)当发现同名的key存在时,MSET会用新值覆盖旧值,如果你不希望覆盖同名key,请使用MSETNX命令。

    (2)MSET是一个原子性(atomic)操作,所有给定key都在同一时间内被设置,某些给定key被更新而另一些给定key没有改变的情况,不可能发生。

    语法:

    redis 127.0.0.1:6379> MSET key1 value1 key2 value2 .. keyN valueN 

    返回值: 总是返回OK(因为MSET不可能失败)

    可用版本: >= 1.0.1

    时间复杂度:O(N),为要设置的 key 数量。

    具体实例:

    <?php
    $redis = new redis();
    $redis -> connect('127.0.0.1',6379);
    $redis -> flushAll();
    
    // This first case: 没有旧值存在,同时设置多个值
    $array_mset = array(
        'year' => 2017,
        'month' => 5,
        'date' => 10,
        'time' => '11:04'
    );
    $redis -> mset($array_mset);
    var_dump($redis -> keys('*'));
    //  array (size=4)
    //      0 => string 'time' (length=4)
    //      1 => string 'date' (length=4)
    //      2 => string 'month' (length=5)
    //      3 => string 'year' (length=4)
    
    // This second case: 有旧值存在,完成覆盖。
    $redis -> set('favorite_fruit','apple');
    $array_mset = array('favorite_fruit'=>'banana');
    $redis -> mset($array_mset);
    var_dump($redis -> get('favorite_fruit'));          // banana

    6、MSETNX

    Redis Msetnx 命令用于所有给定 key 都不存在时,同时设置一个或多个 key-value 对。

    (1)即使只有一个key已存在,MSETNX也会拒绝所有传入key的设置操作

    (2)MSETNX是原子性的,所有字段要么全被设置,要么全不被设置。

    语法:

    redis 127.0.0.1:6379> MSETNX key1 value1 key2 value2 .. keyN valueN 

    返回值: 当所有 key 都成功设置,返回 1 。 如果所有给定 key 都设置失败(至少有一个 key 已经存在),那么返回 0 

    可用版本: >= 1.0.1

    时间复杂度:O(N),为要设置的key的数量。

    具体实例:

    <?php
    $redis = new redis();
    $redis -> connect('127.0.0.1',6379);
    $redis -> flushAll();
    
    // This first case: 没有旧值存在,同时设置多个值
    $array_mset = array(
        'year' => 2017,
        'month' => 5,
        'date' => 10,
        'time' => '14:59'
    );
    $redis -> msetnx($array_mset);
    var_dump($redis -> keys('*'));
    //  array (size=4)
    //      0 => string 'time' (length=4)
    //      1 => string 'date' (length=4)
    //      2 => string 'month' (length=5)
    //      3 => string 'year' (length=4)
    
    // This second case: 有旧值存在,无法完成覆盖。
    $redis -> set('favorite_fruit','apple');
    $array_mset = array('favorite_fruit'=>'banana');
    var_dump($redis -> msetnx($array_mset));            // boolean false
    var_dump($redis -> get('favorite_fruit'));          // apple , favorite_fruit的值并没有发生改变

    7、APPEND

      Redis Append 命令用于为指定的 key 追加值

      (1)如果 key 已经存在并且是一个字符串, APPEND 命令将 value 追加到 key 原来的值的末尾。

      (2)如果 key 不存在, APPEND 就简单地将给定 key 设为 value ,就像执行 SET key value 一样。

    语法:

    redis 127.0.0.1:6379> APPEND KEY_NAME NEW_VALUE

    返回值: 追加指定值之后, key 中字符串的长度。

    可用版本: >= 2.0.0

    时间复杂度:平摊复杂度O(1)

    具体实例:

    <?php
    $redis = new redis();
    $redis -> connect('127.0.0.1',6379);
    $redis -> flushAll();
    
    // This first case: 对已存在的字符串 append ,追加到字符串末尾
    $redis -> set('favorite_fruit','cherry ');
    $redis -> append('favorite_fruit','is very delicious');
    var_dump($redis -> get('favorite_fruit'));   // string 'cherry is very delicious'
    
    // This second case: 对不存在的字符串 append , 相当于 set 的功能
    $redis -> del('job');                    // 确保一个不存在的 key
    $redis -> append('job','PHPer');
    var_dump($redis -> get('job'));          // string 'PHPer'

    8、GET

      Redis Get 命令用于获取指定 key 的值。如果 key 不存在,返回 nil 。如果key 储存的值不是字符串类型,返回一个错误

    语法:

    redis 127.0.0.1:6379> GET KEY_NAME

    返回值: 返回 key 的值,如果 key 不存在时,返回 nil。 如果 key 不是字符串类型,那么返回一个错误。

    可用版本: >= 1.0.0

    时间复杂度:O(1)

    具体实例:

    <?php
    $redis = new redis();
    $redis -> connect('127.0.0.1',6379);
    $redis -> flushAll();
    
    // This first case: key 存在且是字符串类型
    $redis -> set('favorite_fruit','cherry');
    var_dump($redis -> get('favorite_fruit'));   // string 'cherry'
    
    // This second case: key 不存在
    $redis -> del('fake_key');                  // 确保一个不存在的 key
    var_dump($redis -> get('fake_key'));        // boolean false
    
    // This third case: key 不在但不是字符串类型
    $redis -> lPush('job','programmer');        // list 类型
    var_dump($redis -> get('job'));             // boolean false

    9、MGET

      Redis Mget 命令返回所有(一个或多个)给定 key 的值。 如果给定的 key 里面,有某个 key 不存在,那么这个 key 返回特殊值 nil 。

    语法:

    redis 127.0.0.1:6379> MGET KEY1 KEY2 .. KEYN

    返回值:一个包含所有给定 key 的值的列表。

    可用版本: >= 1.0.0

    时间复杂度:O(1)

    具体实例:

    <?php
    $redis = new redis();
    $redis -> connect('127.0.0.1',6379);
    $redis -> flushAll();
    
    // This first case: 给定的 key 都存在
    $array_mset = array(
        'year' => 2017,
        'month' => 5,
        'day' => 10,
        'time' => '15:31'
    );
    $redis -> mset($array_mset);
    $array_mget = array('year','month','day','time');
    var_dump($redis -> mget($array_mget));
    //  array (size=4)
    //      0 => string '2017' (length=4)
    //      1 => string '5' (length=1)
    //      2 => string '10' (length=2)
    //      3 => string '15:31' (length=5)
    
    // This second case:给定的 key 中有 key 不存在的情况
    $array_mget = array('year','month','fake_key');
    var_dump($redis -> mget($array_mget));
    //  array (size=3)
    //      0 => string '2017' (length=4)
    //      1 => string '5' (length=1)
    //      2 => boolean false

    10、GETRANGE

      Redis Mget 命令返回所有(一个或多个)给定 key 的值。 如果给定的 key 里面,有某个 key 不存在,那么这个 key 返回特殊值 nil 

    语法:

    redis 127.0.0.1:6379> GETRANGE KEY_NAME start end

    返回值:截取得到的子字符串。

    可用版本: >= 2.4.0(在<=2.0的版本里,GETRANGE被叫作SUBSTR。)

    时间复杂度:O(N),N为要返回的字符串的长度。(复杂度最终由返回值长度决定,但因为从已有字符串中建立子字符串的操作非常廉价(cheap),所以对于长度不大的字符串,该操作的复杂度也可看作O(1))。

    具体实例:

    <?php
    $redis = new redis();
    $redis -> connect('127.0.0.1',6379);
    $redis -> flushAll();
    
    $redis -> set('mykey','hello world');
    echo $redis -> getRange('mykey',0,-1) . '</br>';    // 从开头到结束, hello world
    echo $redis -> getRange('mykey',0,4) . '</br>';     // 从 0 到 4 , hello
    echo $redis -> getRange('mykey',-5,-1) . '</br>';   // 从 -5 到 -1 , world
    var_dump($redis -> getRange('mykey',-1,-5)). '</br> ';  // 从 -1 到 -5 , "" ,不支持回绕操作
    echo $redis -> getRange('mykey',0,100). '</br> ';   // 从 0 到 100 , hello world ,若范围超过了字符串的长度,超过部分自动被忽略

    11、GETSET

      Redis Getset 命令用于设置指定 key 的值,并返回 key 旧的值。

    语法:

    redis 127.0.0.1:6379> GETSET KEY_NAME VALUE

    返回值:返回给定 key 的旧值。

    (1)当 key 没有旧值时,即 key 不存在时,返回 nil 。

    (3)当 key 存在但不是字符串类型时,返回一个错误。

    可用版本: >= 1.0.0

    时间复杂度:O(1)

    具体实例:

    <?php
    $redis = new redis();
    $redis -> connect('127.0.0.1',6379);
    $redis -> flushAll();
    
    // This first case: key 值存在且为字符串类型
    $redis -> set('favorite_fruit','cherry');
    var_dump($redis -> getSet('favorite_fruit','pineapple'));    // cherry
    
    // This second case: key 值存在但不为字符串类型
    $redis -> lPush('job','programmer');
    var_dump($redis -> getSet('job','code-farmer'));    // boolean false
    
    // This third case: key 值不存在
    $redis -> del('fake_key');
    var_dump($redis -> getSet('fake_key','not-exists'));    // boolean false

    12、STRLEN

      Redis Strlen 命令用于获取指定 key 所储存的字符串值的长度。当 key 储存的不是字符串值时,返回一个错误。

    语法:

    redis 127.0.0.1:6379> STRLEN KEY_NAME

    返回值:字符串值的长度。 当 key 不存在时,返回 0。

    可用版本: >= 2.2.0

    时间复杂度:O(1)

    具体实例:

    <?php
    $redis = new redis();
    $redis -> connect('127.0.0.1',6379);
    $redis -> flushAll();
    
    // This first case: key 值存在
    $redis -> set('favorite_fruit','cherry');
    var_dump($redis -> strlen('favorite_fruit'));    // int 6
    
    // This second case: key 值不存在
    $redis -> del('fake_key');
    var_dump($redis -> strlen('fake_key'));    // int 0

    13、INCR

      Redis Incr 命令将 key 中储存的数字值增一。

      (1)如果 key 不存在,那么 key 的值会先被初始化为 0 ,然后再执行 INCR 操作。

      (2)如果值包含错误的类型,或字符串类型的值不能表示为数字,那么返回一个错误。

      (3)本操作的值限制在 64 位(bit)有符号数字表示之内。

    语法:

    redis 127.0.0.1:6379> INCR KEY_NAME 

    返回值:执行 INCR 命令之后 key 的值。

    可用版本:>= 1.0.0

    时间复杂度:O(1)

    具体实例:

    <?php
    $redis = new redis();
    $redis -> connect('127.0.0.1',6379);
    $redis -> flushAll();
    
    // This first case: key 值存在且为数字
    $redis -> set('number',10);
    var_dump($redis -> incr('number'));    // int 11
    var_dump($redis -> get('number'));     // string '11'  , 其值在 redis 中是以字符串的形式保存的
    
    // This second case: key 值不存在
    $redis -> del('fake_key');
    var_dump($redis -> incr('fake_key'));    // int 1
    
    // This third case: key 值存但不为数字
    $redis -> set('favorite_fruit','cherry');
    var_dump($redis -> incr('favorite_fruit'));    // boolean false
    
    // This fourth case: key 值存但为其它的类型
    $redis -> lPush('job',20);
    var_dump($redis -> incr('job'));    // boolean false

    14、INCRBY

      Redis Incrby 命令将 key 中储存的数字加上指定的增量值。

      (1)如果 key 不存在,那么 key 的值会先被初始化为 0 ,然后再执行 INCRBY 命令。

      (2)如果值包含错误的类型,或字符串类型的值不能表示为数字,那么返回一个错误。

      (3)本操作的值限制在 64 位(bit)有符号数字表示之内。

    语法:

    redis 127.0.0.1:6379> INCRBY KEY_NAME INCR_AMOUNT

    返回值:加上指定的增量值之后, key 的值。

    可用版本:>= 1.0.0

    时间复杂度:O(1)

    具体实例:

    <?php
    $redis = new redis();
    $redis -> connect('127.0.0.1',6379);
    $redis -> flushAll();
    
    // This first case: key 值存在且为数字
    $redis -> set('number',10);
    var_dump($redis -> incrBy('number',5));    // int 15
    var_dump($redis -> get('number'));     // string '15'  , 其值在 redis 中是以字符串的形式保存的
    
    // This second case: key 值不存在
    $redis -> del('fake_key');
    var_dump($redis -> incrBy('fake_key','5'));    // int 5
    
    // This third case: key 值存但不为数字
    $redis -> set('favorite_fruit','cherry');
    var_dump($redis -> incrBy('favorite_fruit',5));    // boolean false
    
    // This fourth case: key 值存但为其它的类型
    $redis -> lPush('job',20);
    var_dump($redis -> incrBy('job',5));    // boolean false

    15、INCRBYFLOAT

      Redis Incrbyfloat 命令为 key 中所储存的值加上指定的浮点数增量值。

    语法:

    redis 127.0.0.1:6379> INCRBYFLOAT KEY_NAME INCR_AMOUNT

    返回值:执行命令之后 key 的值。

    可用版本:>= 2.6.0

    具体实例:

    <?php
    $redis = new redis();
    $redis -> connect('127.0.0.1',6379);
    $redis -> flushAll();
    
    // This first case: key 值存在且为数字
    $redis -> set('number',10.2);
    var_dump($redis -> incrByFloat('number',0.3));    // float 10.5
    var_dump($redis -> get('number'));     // string '10.5'  , 其值在 redis 中是以字符串的形式保存的
    
    // This second case: key 值不存在
    $redis -> del('fake_key');
    var_dump($redis -> incrByFloat('fake_key',0.3));    // float 0.3
    
    // This third case: key 值存但不为数字
    $redis -> set('favorite_fruit','cherry');
    var_dump($redis -> incrByFloat('favorite_fruit',0.3));    // boolean false
    
    // This fourth case: key 值存但为其它的类型
    $redis -> lPush('job',20.2);
    var_dump($redis -> decrBy('job',0.3));    // boolean false

    16、DECR

      Redis Decr 命令将 key 中储存的数字值减一。

      (1)如果 key 不存在,那么 key 的值会先被初始化为 0 ,然后再执行 DECR 操作。

      (2)如果值包含错误的类型,或字符串类型的值不能表示为数字,那么返回一个错误。

      (3)本操作的值限制在 64 位(bit)有符号数字表示之内。

    语法:

    redis 127.0.0.1:6379> DECR KEY_NAME 

    返回值:执行命令之后 key 的值。。

    可用版本:>= 1.0.0

    时间复杂度:O(1)

    具体实例:

    <?php
    $redis = new redis();
    $redis -> connect('127.0.0.1',6379);
    $redis -> flushAll();
    
    // This first case: key 值存在且为数字
    $redis -> set('number',10);
    var_dump($redis -> decr('number'));    // int 9
    var_dump($redis -> get('number'));     // string '9'  , 其值在 redis 中是以字符串的形式保存的
    
    // This second case: key 值不存在
    $redis -> del('fake_key');
    var_dump($redis -> decr('fake_key'));    // int -1
    
    // This third case: key 值存但不为数字
    $redis -> set('favorite_fruit','cherry');
    var_dump($redis -> decr('favorite_fruit'));    // boolean false
    
    // This fourth case: key 值存但为其它的类型
    $redis -> lPush('job',20);
    var_dump($redis -> decr('job'));    // boolean false

    17、DECRBY

      Redis Decrby 命令将 key 所储存的值减去指定的减量值。

      (1)如果 key 不存在,那么 key 的值会先被初始化为 0 ,然后再执行 DECRBY 操作。

      (2)如果值包含错误的类型,或字符串类型的值不能表示为数字,那么返回一个错误。

      (3)本操作的值限制在 64 位(bit)有符号数字表示之内。

    语法:

    redis 127.0.0.1:6379> DECRBY KEY_NAME DECREMENT_AMOUNT

    返回值:减去指定减量值之后, key 的值。

    可用版本:>= 1.0.0

    时间复杂度:O(1)

    具体实例:

    <?php
    $redis = new redis();
    $redis -> connect('127.0.0.1',6379);
    $redis -> flushAll();
    
    // This first case: key 值存在且为数字
    $redis -> set('number',10);
    var_dump($redis -> decrBy('number',5));    // int 5
    var_dump($redis -> get('number'));     // string '5'  , 其值在 redis 中是以字符串的形式保存的
    
    // This second case: key 值不存在
    $redis -> del('fake_key');
    var_dump($redis -> decrBy('fake_key',5));    // int -5
    
    // This third case: key 值存但不为数字
    $redis -> set('favorite_fruit','cherry');
    var_dump($redis -> decrBy('favorite_fruit',5));    // boolean false
    
    // This fourth case: key 值存但为其它的类型
    $redis -> lPush('job',20);
    var_dump($redis -> decrBy('job',5));    // boolean false

    18、SETBIT

      Redis Setbit 命令用于对 key 所储存的字符串值,设置或清除指定偏移量上的位(bit)。

      (1)位的设置或清除取决于value参数,可以是0也可以是1

      (2)当key不存在时,自动生成一个新的字符串值。

      (3)字符串会增长(grown)以确保它可以将value保存在指定的偏移量上。当字符串值增长时,空白位置以0填充。

      (4)offset参数必须大于或等于0,小于2^32(bit映射被限制在512MB内)。

    语法:

    redis 127.0.0.1:6379> Setbit KEY_NAME OFFSET

    返回值:指定偏移量原来储存的位。

    可用版本:>= 2.2.0

    时间复杂度:O(1)

    具体实例:

    <?php
    $redis = new redis();
    $redis -> connect('127.0.0.1',6379);
    $redis -> flushAll();
    
    $bit = 67;
    echo decbin($bit);          // 1000011 , 转为二进制数
    var_dump($redis ->setBit('bit_val',0,0));   // int 0 ,原来的空位都为 0
    var_dump($redis ->setBit('bit_val',1,1));   // int 0
    var_dump($redis ->setBit('bit_val',2,0));   // int 0
    var_dump($redis ->setBit('bit_val',3,0));   // int 0
    var_dump($redis ->setBit('bit_val',4,0));   // int 0
    var_dump($redis ->setBit('bit_val',5,0));   // int 0
    var_dump($redis ->setBit('bit_val',6,1));   // int 0
    var_dump($redis ->setBit('bit_val',7,1));   // int 0
    
    var_dump($redis -> get('bit_val'));         // string 大写字母 'C',其 ASCII 值为67 ,二进制为 0100 0011
    var_dump($redis ->getBit('bit_val','6'));   // int 1
    var_dump($redis ->getBit('bit_val','8'));   // int 0 ,  offset 比字符串的长度大,返回0
    var_dump($redis ->getBit('bit_not_exist','1'));   // int 0 ,  key 不存在,返回0
    
    var_dump($redis ->setBit('bit_val',5,1));   // int 0 ,将原来的第 5 位改为 1
    var_dump($redis ->setBit('bit_val',6,0));   // int 1 ,由于第 6 位被设置过为 1 ,现在返回原来位的值 1 ,但是第 6 位现在的值已经为 0 了
    
    var_dump($redis -> get('bit_val'));         // string 大写字母 'E',其 ASCII 值为69 ,二进制为 0100 0101

    19、GETBIT

      Redis Getbit 命令用于对 key 所储存的字符串值,获取指定偏移量上的位(bit)。

    语法:

    redis 127.0.0.1:6379> GETBIT KEY_NAME OFFSET

    返回值:字符串值指定偏移量上的位(bit)。当偏移量 OFFSET 比字符串值的长度大,或者 key 不存在时,返回 0。

    可用版本:>= 2.2.0

    时间复杂度:O(1)

    具体实例:

    参见setBit

  • 相关阅读:
    【Codeforces 340D】Bubble Sort Graph
    在写EF 时把时间格式化的做法
    判断早八点晚八点内做事情的方法
    EF分组后把查询的字段具体映射到指定类里面的写法
    MYSQL 之SET GLOBAL innodb_buffer_pool_size =n
    指定类型的成员XX”不支持实体LINQ。只有初始化,成员单位,和实体导航性能的支持。
    MVC中某个页面不需要引用母版页的正确写法
    新建一个controller并指定为默认的方法
    如果有反向代理的情况下,获取最原始的IP的办法
    解决MVC运行controller的时候只有有参构造函数但是程序一定要走无参构造函数的方法
  • 原文地址:https://www.cnblogs.com/tiger-lzl/p/9994802.html
Copyright © 2011-2022 走看看