数据类型:集合数据类型(set)
# 1、增加一个或者多个元素,自动去重 SADD key member1 member2 # 2、查看集合中所有元素 SMEMBERS key # 3、删除一个或者多个元素,元素不存在自动忽略 SREM key member1 member2 # 4、元素是否存在 SISMEMBER key member # 5、随机返回集合中指定个数的元素,默认为1个 SRANDMEMBER key [count] # 6、弹出成员 (默认为1)随机弹出 SPOP key [count] # 7、返回集合中元素的个数,不会遍历整个集合,只是存储在键当中了 SCARD key # 8、把元素从源集合移动到目标集合 SMOVE source destination member 例句:smove myset1 myset2 2 将myset1中的2移动到myset2里面(相当于剪切) # 9、差集(number1 1 2 3 number2 1 2 4) #差集:number里面有的 number里面没有的 SDIFF key1 key2 # 10、差集保存到另一个集合中 SDIFFSTORE destination key1 key2 # 11、交集(两个里面都有的) SINTER key1 key2 #将交集的数据复制给新的set SINTERSTORE destination key1 key2 # 11、并集(合在一起去掉重复的) SUNION key1 key2 SUNIONSTORE destination key1 key2
# 1、给name对应的集合中添加元素 sadd(name,values) r.sadd("set_name","tom") r.sadd("set_name","tom","jim") # 2、获取name对应的集合的所有成员: 集合 smembers(name) # 3、获取name对应的集合中的元素个数 scard(name) r.scard("set_name") # 4、检查value是否是name对应的集合内的元素:True|False sismember(name, value) # 5、随机删除并返回指定集合的一个元素 spop(name) mumber = r.spop('set_name') # 6、删除集合中的某个元素 srem(name, value) r.srem("set_name", "tom") # 7、获取多个name对应集合的交集 sinter(keys, *args) r.sadd("set_name","a","b") r.sadd("set_name1","b","c") r.sadd("set_name2","b","c","d") print(r.sinter("set_name","set_name1","set_name2")) #输出:{b'b'} # 8、获取多个name对应的集合的并集 sunion(keys, *args) r.sunion("set_name","set_name1","set_name2")
案例: 新浪微博的共同关注
需求: 当用户访问另一个用户的时候,会显示出两个用户共同关注过哪些相同的用户
设计: 将每个用户关注的用户放在集合中,求交集即可
实现:
user001 = {'peiqi','qiaozhi','danni'}
user002 = {'peiqi','qiaozhi','lingyang'}
user001和user002的共同关注为:
SINTER user001 user002
结果为: {'peiqi','qiaozhi'}
import redis r = redis.Redis(host='192.168.153.136',port=6379,db=0) # 用户1关注的人 r.sadd('user_first','peiqi','qiaozhi','danni') # 用户2关注的人 r.sadd('user_second','peiqi','qiaozhi','lingyang') # user_first和user_second的共同关注的人为??求差集 result = r.sinter('user_first','user_second') # 把集合中的每个元素转为string数据类型 focus_on_set = set() for r in result: focus_on_set.add(r.decode()) print(focus_on_set)