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" // }
|