您的位置 首页 php

php redis 扩展类常用操作

php redis 扩展类常用操作(1)

一、连接 redis 服务

 
try {
    $redis = new Redis();
    $redis->connect('127.0.0.1', 6379);
    $redis->auth('mumayi105'); // redis 服务如何加锁时需要传递
    // 查看服务是否运行; 成功时返回1, 失败时连接报错“由于目标计算机积极拒绝,无法连接。”
    echo "Server is running: " . $redis->ping(); // ping 方法用于检测 redis 服务是否启动
}catch (Exception $e){
    echo $e->getMessage();
}
  

二、Redis 键相关操作

1. 删除指定key

 $redis->set('key1', 'value1');
$redis->set('key2', 'value2');
//成功时返回键个数,失败时返回0
$res = $redis->del('key1', 'key2');
  

2. 序列化给定key,并返回序列化的值

 $redis->set('foo', 'bar');
// 以特定于 Redis的格式序列化 key中的值并将其返回
$val = $redis->dump('foo');
// 将dump序列化的值反序列化,存储在key中; 成功时返回 true,失败时返回false
$redis->restore('key', 0, $val);
  

注: restore 方法重复向同一键名存储反序列化的值时会报错

 Fatal error:  Uncaught RedisException: BUSYKEY Target key name already exists. in D:\phpstudy_pro\WWW\ak9896_github\demo\demo_example\redis\test.php:37
Stack trace:
#0 D:\phpstudy_pro\WWW\ak9896_github\demo\demo_example\redis\test.php(37): Redis->restore('key', 0, '\x00\x04bar1\t\x00F[\xF0\x13d\x97\xFA...')
#1 {main}
  thrown in ... on line n
    

3. 检查给定key 是否存在

 $redis->exists('foo'); // 成功时返回1,失败时返回0
  

4. 设置 key 过期时间

  // 设置 foo 过期时间为10s 
$redis->expire('foo', 10);

// 同样是为key设置过期时间,不同在于 expireAt 方法接收的参数是 UNIX 时间戳
$redis->expireAt('key', 1638201600); 

// 设置 key 的过期时间以毫秒计
$redis->pExpire('key', 10000);
  

5. 查找所有符合给定模式的 key

 $redis->set('runoob1', 'redis');
$redis->set('runoob2', 'mysql');
$redis->set('runoob3', 'mongodb');

$keys = $redis->keys('runoob*');  // 返回数组 ["runoob1", "runoob2", "runoob3"]
  

6. 将当前数据库的 key 移动到给定的数据库 db 当中

 // 选择当前存储库为 db0
$redis->select(0);
$redis->set('key', 'value');
// 将 key 移动到 db1
$redis->move('key',1);
echo "在存储库 db0 中 key是否存在: " . $redis->exists('key');
// 切换到存储库 db1
$redis->select(1);
echo "\r\n";
echo "检查 db1 中 key是否存在:" . $redis->exists('key');  

7. 移除 key 过期时间, key 将持久保持

 $redis->setex('key', 10000, 'value');
$redis->persist('key'); // 成功返回true, 失败返回 false  

8. 返回 key 的过期时间

 $redis->setex('key', 180, 'value');
echo "过期时间:" . $redis->pttl('key'); //   以毫秒为单位返回 key 的剩余的过期时间。
echo "<br/>剩余过期时间:" . $redis->ttl('key'); // 以秒为单位,返回给定 key 的剩余生存时间
  

9. 从当前数据库中随机返回一个key

 echo $redis->randomKey();  // 成功时返回 key 键名,失败时返回 false
  

10. 修改 key 的名称

 redis->set('key', 'value');
$redis->rename('key','newkey');  // 成功时返回 true

$redis->renameNx('newkey', 'bar'); // 仅当 bar键名不存在时,将 newkey 改名为 newkey 
  

11. 返回 key 所储存值的类型

 echo $redis->type('bar'); 
// 返回值为int类型,代表类型如下
// 1 - string
// 2 - set
// 3 - list
// 4 - zset
// 5 - hash
// 0 - 其他类型  

12. 迭代

  • scan – 用于迭代数据库中的键名;
 for($i=0; $i<100; $i++){
    $redis->set('key' . $i, 'value'. $i);
}
$iterator = null;
while (false !== ($keys = $redis->scan($iterator, 'key*'))){
    foreach($keys as $key){
        echo $key . PHP_EOL;
    }
}  
  • sscan – 用于迭代集合键中的元素 $redis->sAdd(‘set’, ‘A’);
    $redis->sAdd(‘set’, ‘B’);
    $redis->sAdd(‘set’, ‘C’);
    $redis->sAdd(‘set’, ‘D’);
    $iterator = null;
    while ($members = $redis->sScan(‘set’, $iterator)){
    foreach ($members as $member){
    echo $member . PHP_EOL;
    }
    }
    // 输出
    /*
    D
    B
    C
    A
    */
  • hscan – 用于迭代哈希键中的键值对 $arr = [
    ‘google’ => ‘goole.com’,
    ‘runoob’ => ‘runoob.com’,
    ‘weibo’ => ‘weibo.com’,
    4 => ‘taobao.com’
    ];
    $res = $redis->hMSet(‘sites’, $arr);

    $iterator = null;
    while ($elements = $redis->hScan(‘sites’, $iterator)){
    foreach($elements as $key=>$value){
    echo $key . ‘=>’ . $value . PHP_EOL;
    }
    }
    // 输出
    /*
    google=>goole.com
    runoob=>runoob.com
    weibo=>weibo.com
    4=>taobao.com
    */

  • zscan – 用于迭代有序集合中的元素
 $redis->zAdd('site', 1,'google', 2,'runoob',3,'taobao', 4,'weibo');
$iterator = null;
while ($members = $redis->zScan('site', $iterator)){
    foreach ($members as $member=>$score){
        echo $member . '=>' . $score . PHP_EOL;
    }
}
// 输出 
/*
google=>1
runoob=>2
taobao=>3
weibo=>4
*/  

三、Redis 字符串相关操作

1. 设置指定 key 的值

 // 成功返回 true, 失败时返回 false
$redis->set('key','value');  

// 等同于调用 setex, 设置 key1 的值为 value1 ,有效时间为10s
$redis->set('key1', 'value1', 10);

// 仅当key2不存在时,设置它的值为 value2; 有效时间为10s
$redis->set('key2', 'value2', ['nx', 'ex' => 10]);

// 仅当 key 存在时,设置它的值为 value3; 有效时间为1000毫秒
$redis->set('key', 'value3', ['xx', 'px' => 1000]);

// 设置 key 的值与过期时间,如果 key 存在,替换旧值
$redis->setex('key', 3600, 'today');

// 仅当 key 不存在时设置它的值; 成功返回true, 失败返回 false
$redis->setnx('key5', 'sun');

// 同设置一个或多个键值对
$res = $redis->mset([
    'key0' => 'value0',
    'key1' => 'value1'
]);
$redis->get('key0');
$redis->get('key1');


// setRange - 用 redis 替换 key 从指定偏移量开始的字符串值
$redis->set('key', 'hello word');
$redis->setRange('key', 6, 'redis'); //返回最新字符串长度
$redis->get('key'); // hello redis


// 同时设置一个或多个键值对,当且仅当所有键都不存在时生效; 成功返回 true,失败返回 false
$res = $redis->msetnx([
    'key7' => 'value7',
    'key8' => 'value8'
]);


// 设置 key9 的值为 value9 ,有效时间为 10000 毫秒
$redis->psetex('key9',10000, 'value9');


// 对 key 所存储的字符串值,设置或清除指定偏移量上的位(bit)
$redis->set('key', '*');
// ord("*") = 42 = 0x2f = "0010 1010"
// 将二进制位坐标 (从0开始, 从左向右) 5的位置设置为1
$redis->setBit('key', 5, 1);
// 同上,将“*”的二进制位坐标7的位置设为1
$redis->setBit('key', 7, 1);
// 最终 key 的值为 “/”, 十进制值为 47, 转换二进制为 0010 1111
$rs = $redis->get('key');
  

2. 获取指定 key 的值

 // 成功时返回key的值,失败时返回 false
$redis->get('key');

// 截取 key中字符串的子字符串,截取范围是0~2;
// 成功时返回子字符串 val,失败时返回空字符串
$redis->getRange('key', 0,2);  

// 将 key 的值设为 newvalue, 并返回旧值; 
//如果 key不存在值,则将值设为newvalue 并返回false
$redis->getSet('key', 'newvalue');

// 用于对 key 所储存的字符串值,获取指定偏移量上的位(bit); (从左往右)
$redis->set('key', "\x7f"); // \x7f 转换二进制 0111 1111
$res = $redis->getBit('key', 0); // 返回0
$res = $redis->getBit('key', 1); // 返回1

// 获取所有给定 key 的值
$redis->mget([ 'key', 'key1', 'key2' ]);
  

3. 返回 key 值的长度

 $redis->strlen('key6');  

4. 将 key 所存储的数字值加上增量

 // 加1
$redis->set('key10', 10);
$redis->incr('key10');
echo $redis->get('key10'); // 返回11

// 增加给定的增量值
$redis->incrBy('key10', 5);
echo $redis->get('key10'); // 返回16

// 加上给定的浮点增量值 
$redis->incrByFloat('key10', 0.5);
echo $redis->get('key10');  // 返回16.5
  

5. 将 key 所存储的数字值减1

注:key的值必须整数和字符串类型包含的纯数值,当它的值为浮点数、带数值的字符串时 返回原值

 // 减1
$redis->set('key10', 16);
$redis->decr('key10');
echo $redis->get('key10') . "<br/>";

// 减去给定的减量值
$redis->decrBy('key10', 5);
echo $redis->get('key10') . "<br/>";  

6. 将指定的 value 追加到 key 所存储值的末尾

 $redis->set('key', 'Hello');
$redis->append('key', ' world');
echo $redis->get('key'); //返回 Hello world
  

四、Redis hash 相关操作

Redis hash 是一个 string 类型的字段和值的映射表,它适合用于存储对象。每个 hash 可以存储 2的32次方减1个键值对。

1. hset – 用于为哈希表中的字段赋值

 // 将哈希表 key 中的字段 field1 的值设为 value1; 
// 成功时返回1,失败时返回0; 但是如果 key1已存在,只是重新赋值的话 仍返回0,并覆盖原值
 $redis->hSet('key', 'field1', 'value1');
   

2. hMSet – 同时将多个 field-value (域值)对设置到哈希表中

 // 成功返回 true
$redis->hMSet('key', [
    'field1' => 'value1',
    'field2' => 'value3'
]);  

3. hSetNx – 只有当字段 field 不存在时,设置哈希表字段的值

 // 成功返回 true, 失败返回 false
$redis->hSetNx('key', 'field3', 'value2');   

4. hDel – 删除一个或多个哈希表字段

 // 成功时返回删除个数,失败时返回0
$redis->hDel('key','field1'); 
$redis->hDel('key','field1', 'field2');
  

5. hExists – 查看哈希表 key 中,指定字段是否存在

  $redis->hExists('key', 'field2');  

6. hGet – 获取存储在哈希表中指定字段的值

  // 成功时返回字段值,失败时返回 false
 $redis->hGet('key', 'field2');  

7. hGetAll – 获取在哈希表中指定 key 的所有字段和值

 $redis->hGetAll('key');
/* 输出
 array(2) {
  ["field2"]=>
  string(6) "value3"
  ["field3"]=>
  string(6) "value2"
}
*/  

8.hMGet – 获取所有给定字段的值

  $redis->hMGet('h', ['x', 'float']);  

9. hIncrBy – 为哈希表 key 中的指定字段的整数值加上增量

 $redis->hIncrBy('h','x',1); // 返回增量后的结果 
  

10. hIncrByFloat – 为哈希表 key 中的指定字段的浮点数值加上增量

 $redis->hIncrByFloat('h', 'x', 1.5); // 返回增量后的结果   

11. hkeys – 获取指定哈希表中的所有字段

 $redis->hKeys('h');
/* 输出
array(2) {
  [0]=>
  string(1) "x"
  [1]=>
  string(5) "float"
}
*/  

12. hVals – 获取哈希表中所有值

 $redis->hVals('key');
/*  输出
  array(3) {
  [0]=>
  string(6) "value1"
  [1]=>
  string(6) "value3"
  [2]=>
  string(6) "value2"
}
*/  

13. hlen – 获取哈希表中字段的数量

  $redis->hLen('h');  

14. hScan – 迭代哈希表中的键值对

 $iterator = null;
while ($elements = $redis->hScan('h', $iterator)) {
    foreach ($elements as $key => $value) {
        echo $key . ' => ' . $value . PHP_EOL;
    }
}
/* 输出
x => 9.5
float => 3
*/  

五、Redis 列表相关操作

Redis list 是简单的字符串列表。

一个列表最多可以包含2的32次方减1个元素(每个列表可存超过40亿个元素)

列表元素从左向右排列

1. blPop – 移出并获取列表的第一个元素

 // 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。
$redis->lPush('list', 'A');
$redis->lPush('list', 'B');
$redis->lPush('list', 'C');
$rs = $redis->blPop('list', 10);
// 如果列表为空,等待10秒后 返回空数组; 否则,返回包含2个元素的数组,第一个是被弹出元素所属的 key , 第二个是被弹出元素的值; 
/* 输出: 
  array(2) {
  [0]=>
  string(4) "list"
  [1]=>
  string(1) "C"
}
*/  

2. brPop – 移出并获取列表的最后一个元素

 // 如果列表没有元素会阻塞列表 直到等待超时或发现可弹出元素为止
$redis->brPop('list', 10);
/* 输出
  array(2) { 
   [0]=> string(4) "list" ’
   [1]=> string(1) "A" 
  }
*/  

3. brpoplpush – 从列表中取出最后一个元素插入到另一个列表的头部

 // 如果列表没有元素会阻塞列表 直到等待超时或发现可弹出元素为止
$rs = $redis->brpoplpush('list', 'list1', 10);
var_dump($rs);
/* 输出
string(1) "B"
*/  

4. lindex – 用于通过索引获取列表中的元素

 //下标0 表示列表的第一元素; -1 表示列表的最后一个元素;
// 如果指定索引值不在列表的区间范围内,返回 false
$redis->lPush('mylist', 'world', 'hello');
$redis->lIndex('mylist',0); // 返回 world
$redis->lIndex('mylist',2); // 返回 false 
  

5. linsert – 在列表的元素前或后插入元素

 $redis->lPush('key1', 'A');
$redis->lPush('key1', 'B');
$redis->lPush('key1', 'C');

$redis->lInsert('key1', Redis::BEFORE, 'C', 'X');
$rs = $redis->lRange('key1', 0, -1);
var_dump($rs);
/* 输出
 array(4) {
  [0]=>
  string(1) "X"
  [1]=>
  string(1) "C"
  [2]=>
  string(1) "B"
  [3]=>
  string(1) "A"
}
 */
$redis->lInsert('key1', Redis::AFTER, 'C', 'Y');
$rs = $redis->lRange('key1', 0, -1);
var_dump($rs);
/* 输出
 array(5) {
  [0]=>
  string(1) "X"
  [1]=>
  string(1) "C"
  [2]=>
  string(1) "Y"
  [3]=>
  string(1) "B"
  [4]=>
  string(1) "A"
}
*/  

6. lLen – 获取列表长度

 $redis->lLen('key1');
  

7. lPop – 移出并获取列表的第一个元素

  $redis->lPop('key1');
   

8. lPush – 将一个或多个值插入到列表头部

 // 如果 key 不存在,一个空列表会被创建拼执行 lpush 操作;
// 当 key 存在但不是列表类型时,返回false; 
$redis->lPush('key1', 'AA');
  

9. lPushx – 将一个值插入到已存在的列表头部

  // 列表存在时,返回当前列表元素个数; 列表不存在时返回 0; 
 // 如果 key 存在且不是列表类型时,返回 false
 $redis->lPushx('key1','CC');
   

10. lRange – 获取列表指定范围内的元素

 // 0 表示列表的第一个元素; -1 表示列表的最后一个元素
$redis->lRange('key1', 0, -1);
  

11. lRem – 移除列表元素

 // lRem(key, value, count)
// count > 0: 从表头开始向表尾搜索,移除与 value 相等的元素,数量为 count 
// count < 0 : 从表头开始向表尾搜索,移除与 value 相等的元素,数据为 count 的绝对值; 
// count = 0: 移除表中所有与 value 相关的值 
$redis->lRange('key1', 0, -1);
$redis->lRem('key1', 'AA', 0);
$redis->lRange('key1', 0, -1);
  

12. lSet – 通过索引设置列表元素的值

 $redis->lSet('key1', 0, 'bar');
  

13. lTrim – 对一个列表修剪

 // 让列表只保留指定区间内的元素,不在指定区间这内的元素都将被删除
$redis->rPush('key1', 'A');
$redis->rPush('key1', 'B');
$redis->rPush('key1', 'C');
$rs = $redis->lRange('key1', 0, -1);
var_dump($rs);
$redis->lTrim('key1', 0, 1);
$rs = $redis->lRange('key1',0,-1);
var_dump($rs);
/* 输出 
array(3) {
  [0]=>
  string(1) "A"
  [1]=>
  string(1) "B"
  [2]=>
  string(1) "C"
}

array(2) {
  [0]=>
  string(1) "A"
  [1]=>
  string(1) "B"
}
*/  

14. rPop – 移除列表的最后一个元素

 //返回值为移除的元素
$redis->rPop('key1');
   

15. rpoplpush – 移除列表的最后一个元素添加到另一个列表并返回

 $redis->lPush('x', 'abc');
$redis->lPush('x','def');
$redis->lPush('y', '123');
$redis->lPush('y', '456');

$rs = $redis->rpoplpush('x', 'y');
var_dump($rs);
var_dump($redis->lRange('x', 0, -1));
var_dump($redis->lRange('y', 0, -1));
  

16. rPush – 从列表尾部添加一个或多个元素

 $redis->rPush('key1', 'A');
$redis->rPush('key1', 'B');
$redis->rPush('key1', 'C');
$rs = $redis->lRange('key1', 0, -1);
  

17. rPushx – 在已存在的列表尾部添加值

 $redis->rPushx('key1', 'D');
$redis->lRange('key1', 0, -1);
  

如果你看到这里了,请帮忙点个赞! 因为我没想过头条上发编程类的内容,也会有人看~

谢谢了~ 祝您虎年吉祥如意!

文章来源:智云一二三科技

文章标题:php redis 扩展类常用操作

文章地址:https://www.zhihuclub.com/79603.shtml

关于作者: 智云科技

热门文章

网站地图