PHP 中 Redis 常用操作(zset 类型)

Redis 有序集合和集合一样也是string类型元素的集合,且不允许重复的成员。

不同的是每个元素都会关联一个 double 类型的分数。redis 正是通过分数来为集合中的成员进行从小到大的排序。

有序集合的成员是唯一的,但分数(score)却可以重复。处理元素时,也要加上score的处理

集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)。 集合中最大的成员数为 232 - 1 (4294967295, 每个集合可存储40多亿个成员)。

添加元素(zAdd)

1
2
3
4
5
$redis->zAdd('zSet', 10, 'A');
$redis->zAdd('zSet', 106, 'B');
$redis->zAdd('zSet', 20, 'C');
$redis->zAdd('zSet', 15, 'D');
$redis->zAdd('zSet', 11, 'E');

元素分值增减(zIncrBy)

1
2
$redis->zIncrBy('zSet', 20.5, 'A');      // 30.5
$redis->zIncrBy('zSet', 12, 'B'); // 128

获取根据 score 排序后的数据段(zRange,zRevRange)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// 升序
$redis->zRange('zSet', 0, -1)
//array (size=5)
// 0 => string 'E' (length=1)
// 1 => string 'D' (length=1)
// 2 => string 'C' (length=1)
// 3 => string 'A' (length=1)
// 4 => string 'B' (length=1)

// 降序
// 分值前三
$redis->zRevRange('zSet', 0, 2, true);
//array (size=3)
// 'B' => float 118
// 'A' => float 30.5
// 'C' => float 20

获取 score 过滤后排序的数据段(zRangeByScore,zRevRangeByScore)

根据分值过滤之后的列表

需要提供分值区间

1
2
3
4
5
6
7
8
$redis->zAdd('key', 0, 'val0');
$redis->zAdd('key', 2, 'val2');
$redis->zAdd('key', 10, 'val10');
$redis->zRangeByScore('key', 0, 3); // array('val0', 'val2')
$redis->zRangeByScore('key', 0, 3, array('withscores' => TRUE); // array('val0' => 0, 'val2' => 2)
$redis->zRangeByScore('key', 0, 3, array('limit' => array(1, 1)); // array('val2' => 2)
$redis->zRangeByScore('key', 0, 3, array('limit' => array(1, 1)); // array('val2')
$redis->zRangeByScore('key', 0, 3, array('withscores' => TRUE, 'limit' => array(1, 1)); // array('val2' => 2)

获取元素个数(zCard)

1
$redis->zCard('zSet');      // 

获取区间内的元素个数(zCount)

1
2
3
4
5
$redis->zAdd('key', 0, 'val0');
$redis->zAdd('key', 2, 'val2');
$redis->zAdd('key', 10, 'val10');
// 0 ~ 3 之间
$redis->zCount('key', 0, 3); // array('val0', 'val2')

获取元素的 score (zScore)

1
$redis->zScore('zSet', 'A')     // 30.5

获取某个元素在集合中的排名(zRank)

从0开始

1
$redis->zRank('zSet', 'A');    // 3

删除元素(zRem)

1
$redis->zRem('zSet', 'A');

根据排名来删除(zRemRangeByRank)

1
2
//按照升序排序删除第一个和第二个元素
$redis->zRemRangeByRank('zSet', 0, 1)

根据区间来删除(zRemRangeByScore)

1
2
//删除 score 在[15, 30]之间的元素
$redis->zRemRangeByScore('zSet', 15, 30);