集合SETs和Sorted SETs有序集合都是集合操作基本一样,只是差别后者数据是有序的,前者无序。集合是Redis的基本数据结构之一,集合中同样和列表一下也可以存放很多数据,列表是左右顺序可以存储重复数据的结构,集合是无充存放且不存在重复数据,有序集合它保留了集合不能重复元素的特性.但不同的是,有序集合是可排序的.但是他和列表使用索引下标进行排序依据不同的是,它给每个元素设置一个分数(score)作为排序的依据.
| 数据结构 | 允许重复 | 支持顺序 | 顺序实现方式 | 应用场景 |
| 列表 | 是 | 是 | 索引下标 | 队列、抢购、时间顺序 |
| 集合 | 否 | 否 | 无 | 标签、去重,社交圈 |
| 有序集合 | 否 | 是 | 分值 | 排行榜、积分 |
集合的命令有10条,有序集合有20几条,下面只是简单的使用。
操作
SADD 增加一个或多个member
SREM 删除member
获取
SPOP 获取并删除
SMEMBERS 获取所有
SISMEMBER 获取指定member
集合
SINTER 集合交集
SUNION 集合并集
SDIFF 集合差集,前比后多
统计
SCARD 统计多少member
集合案例
import redis
client = redis.Redis(host='127.0.0.1')
classes = ['English','Chinese','Match','Computer']
def get_students():
students = client.sunion(*classes)
return len(students)
def get_stu_intersection(class_a, class_b):
students = client.sinter(class_a, class_b)
return len(students)
def get_stu_diff(class_a, class_b):
students = client.sdiff(class_a, class_b)
return len(students)
def get_stu_union(class_a, class_b):
students = client.sunion(class_a, class_b)
return len(students)
client.sadd('English', 'tom', 'jack','zhang')
client.sadd('Match', 'tom', 'jack','mike','lee')
>>> get_students()
5
>>> get_stu_intersection('English','Match')
2
>>> get_stu_union('English','Match')
5
打标签
>>> class Tagging:
... def __init__(self, client, item):
... self.client = client
... self.key = make_tag_key(item)
... def add(self, *tags):
... self.client.sadd(self.key, *tags)
... def remove(self, *tags):
... self.client.srem(self.key, *tags)
... def is_included(self, tag):
... return self.client.sismember(self.key, tag)
... def get_all_tags(self):
... return self.client.smembers(self.key)
... def count(self):
... return self.client.scard(self.key)
...
>>> book_tags = Tagging(client, "The C Programming Language")
>>> book_tags.add('c')
>>> book_tags.add('programming language')
>>> book_tags.add('computer book')
>>> book_tags.get_all_tags()
set(['c', 'programming language', 'computer book'])
>>> for i in book_tags.get_all_tags():
... print i
...
c
programming language
computer book
另外有些好友推荐也可以使用SET 差集,调用client.srandmember随机获取几个人。
— over —