php redis list

2019-07-23  本文已影响0人  周pan

list add

// 1 list add
// lpush:   lpush key value [ value1 value2 value3 ]
// rpush:   rpush key value [ value1 value2 value3 ]
// linsert: linsert key before|after privot value
$k31 = 'imei:list:1';
$k32 = 'imei:list:2';
$k33 = 'imei:list:3';
$redis->ltrim($k31, -1, 0);//清空列表
$redis->ltrim($k32, -1, 0);//清空列表
$redis->ltrim($k33, -1, 0);//清空列表

$redis->rpush($k31, '1', '2', '3');
$redis->lpush($k32, '4', '5', '6');
$redis->lpush($k33, '4', '5', '6');
$redis->linsert($k33, 'before', '5', 'a');

$res1 = $redis->lrange($k31, 0, -1);// Array ( [0] => 1 [1] => 2 [2] => 3 )
$res2 = $redis->lrange($k32, 0, -1);// Array ( [0] => 6 [1] => 5 [2] => 4 )
$res3 = $redis->lrange($k33, 0, -1);// Array ( [0] => 6 [1] => a [2] => 5 [3] => 4 )

list 查找

// 1 list 查找
// 获取指定范围内元素列表 lrange:        lrange key start end
// 获取列表指定列表下标的元素 lindex:    lindex key index
// 获取列表的长度 llen:                llen key
$k31 = 'imei:list:1';
$k32 = 'imei:list:2';
$k33 = 'imei:list:3';
$redis->ltrim($k31, -1, 0);//清空列表
$redis->ltrim($k32, -1, 0);//清空列表
$redis->ltrim($k33, -1, 0);//清空列表

$redis->rpush($k31, '1', '2', '3');
$redis->lpush($k32, '4', '5', '6');
$redis->lpush($k33, '4', '5', '6');

$res1 = $redis->lrange($k31, 0, -1);// Array ( [0] => 1 [1] => 2 [2] => 3 )
$res2 = $redis->lindex($k32, 2);    // string(1) "4" 
$res3 = $redis->llen($k33);         // string(1) "3"

list 删除

// 3 list 删除
// 从列表左侧弹出元素 lpop:            返回弹出元素
// 从列表右侧弹出元素 rpop:            返回弹出元素
// 按照索引范围修剪列表 ltirm:         ltirm key start end
// 删除指定元素 lrem:                 lrem count value   返回删除元素个数
// count>0 从左到右,删除最多count个元素
// count<0 从右到左,删除最多count绝对值个元素
// count=0 删除所有
$k31 = 'imei:list:1';
$k32 = 'imei:list:2';
$k33 = 'imei:list:3';
$k34 = 'imei:list:4';
$redis->ltrim($k31, -1, 0);//清空列表
$redis->ltrim($k32, -1, 0);//清空列表
$redis->ltrim($k33, -1, 0);//清空列表
$redis->ltrim($k34, -1, 0);//清空列表

$redis->rpush($k31, '1', '2', '3');
$redis->lpush($k32, '4', '5', '6');
$redis->rpush($k33, '1', '2', '2', '3', '3', '3', '4', '4', '4', '4', ' 5', '5', '5', '5', '5');
$redis->rpush($k34, '1', '2', '3', '4', '5');

$res1 = $redis->lpop($k31);          // string(1) "1"
print_r($redis->lrange($k31, 0, -1));// Array ( [0] => 2 [1] => 3 )
$res2 = $redis->rpop($k32);          // string(1) "4"
print_r($redis->lrange($k32, 0, -1));// Array ( [0] => 6 [1] => 5 )
$res3 = $redis->lrem($k33, 5, 4);    // string(1) "4"
print_r($redis->lrange($k33, 0, -1));//Array ( [0] => 1 [1] => 2 [2] => 2 [3] => 3 [4] => 3 [5] => 3 [6] => 5 [7] => 5 [8] => 5 [9] => 5 [10] => 5 )
$res4 = $redis->lrem($k33, -2, 3);    // string(1) "2"
print_r($redis->lrange($k33, 0, -1)); //Array ( [0] => 1 [1] => 2 [2] => 2 [3] => 3 [4] => 5 [5] => 5 [6] => 5 [7] => 5 [8] => 5 )
$res5 = $redis->lrem($k33, 0, 3);     // string(1) "1"
print_r($redis->lrange($k33, 0, -1)); // Array ( [0] => 1 [1] => 2 [2] => 2 [3] => 5 [4] => 5 [5] => 5 [6] => 5 [7] => 5 )
$res6 = $redis->ltrim($k34, 0, 2);    // bool(true)
print_r($redis->lrange($k34, 0, -1)); // Array ( [0] => 1 [1] => 2 [2] => 3 )

list 修改

// 4 list 修改
// 修改指定下标的元素 lset:            lset key index newValue
$k31 = 'imei:list:1';
$redis->ltrim($k31, -1, 0);//清空列表

$redis->rpush($k31, '1', '2', '3');

$res1 = $redis->lset($k31, 1, 100);          // bool(true) 
print_r($redis->lrange($k31, 0, -1));        // Array ( [0] => 1 [1] => 100 [2] => 3 )

list 阻塞操作

// 4 list 阻塞操作
// 阻塞式弹出 blpop: blpop key [ key1 ... ] timeout
// 阻塞式弹出 brpop: brpop key [ key1 ... ] timeout
// note: blpop brpop分别是lpop rpop的阻塞版本 他们除了弹出方向不同 使用方法基本相同
// 说明:
// 1)列表都为空:如果timeout=3 那么客户端要等待3秒后返回,如果timeout=0, 那么客户端会一直阻塞下去
//   如果在timeout期间列表添加了数据,客户端会立即返回

$k31 = 'imei:list:1';
$k32 = 'imei:list:2';
$redis->ltrim($k31, -1, 0);//清空列表
$redis->ltrim($k32, -1, 0);//清空列表

$redis->rpush($k31, '1', '2', '3');
$redis->rpush($k32, '4', '5', '6');

$res1 = $redis->blpop($k31, $k32, 3);
print_r($res1);                         // Array ( [0] => imei:list:1 [1] => 1 )
print_r($redis->lrange($k31, 0, -1));   // Array ( [0] => 2 [1] => 3 )
print_r($redis->lrange($k32, 0, -1));   // Array ( [0] => 4 [1] => 5 [2] => 6 )
// 2)有一个列表不为空:客户端会立即返回
//   使用brpop时,如果是多个键,那么brpop会从左至右遍历键,一旦有一个键能弹出元素,客户端立即返回
//   如果是多个客户端对同一个键执行brpop, 那么先执行brpop命令的客户端可以获取得到弹出的值
$k31 = 'imei:list:1';
$redis->ltrim($k31, -1, 0);//清空列表
// client 1
$redis->blpop($k31, 0);
// client 2
$redis->blpop($k31, 0);
// client 3
$redis->blpop($k31, 0);
// client 4
$redis->rpush($k31, '1');
// client 1 会最获取到元素1 因为client 1最先执行brpop, 而client 2, client3继续阻塞

上一篇下一篇

猜你喜欢

热点阅读