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

Redis set对外提供的功能与list类似是一个列表的功能,特殊之处在于set是可以自动排重的,当你需要存储一个列表数据,又不希望出现重复数据,set是一个很好的选择,并且set提供了判断某个成员是否在一个set集合内的接口,这是也是list所不能提供了。

Redis的Set是string类型的无需集合。它底层其实是一个value为null的hash表,所以添加、删除、查找的复杂度都是O(1)。

集合数据的特征:

  • 元素不能重复,保持唯一性
  • 元素无序,不能使用索引(下标)操作

添加元素到集合(sAdd)

1
2
$redis->sAdd('k', 'v1');                // int(1)
$redis->sAdd('k', 'v1', 'v2', 'v3'); // int(2)

随机获取一个元素或多个(sPop)

无序性,是随机的

1
2
3
4
$redis->sAdd('k', 'v1', 'v2', 'v3', 'v4');
$redis->sPop('k'); // 'v1',
$redis->sPop('k'); // 'v3',
$redis->sPop('k', 2); // ['v1','v3'],

删除集合里指定的值(sRem)

1
2
$redis->sAdd('k', 'v1', 'v2', 'v3');
$redis->sRem('k', 'v2', 'v3'); // k => array('v1')

遍历集合(sScan)

1
2
3
4
5
6
//不使用迭代器,匹配所有的元素,进行遍历
$iterator = null;
$elements = $redis->sScan('team', $iterator, '*');
foreach ($elements as $element) {
echo $element, '<br>';
}

获取所有成员(sMembers)

1
2
3
$redis->sAdd('k', 'v1', 'v2', 'v3');
$members = $redis->sMembers('k');
var_dump($members);

获取集合元素个数(sCard)

1
2
$redis->sAdd('k', 'v1', 'v2', 'v3');
$redis->sCard('k'); // 3

并集(sUnion),差集(sDiff),交集(sInter)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
$redis->sAdd('s0', '1', '2');
$redis->sAdd('s1', '3', '1');
$redis->sAdd('s2', '3', '4');

var_dump($redis->sUnion('s0', 's1', 's2'));
//array(4) {
// [0]=>
// string(1) "3"
// [1]=>
// string(1) "4"
// [2]=>
// string(1) "1"
// [3]=>
// string(1) "2"
//}

var_dump($redis->sDiff('s1', 's2'));
//array(2) {
// [0]=>
// string(1) "1"
// [0]=>
// string(1) "4"
// }

var_dump($redis->sDiff('s1', 's2'));
//array(1) {
// [0]=>
// string(1) "3"
// }