Redis学习05之 SET集合

集合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 —