python的redis操作(3)之set(集合)

󰃭 2016-04-13

导读

redis 的set(集合) 这种数据结构可以保存一个无序列表, 其中的元素不会重复,对其中的每个元素的add和remove的时间复杂度都是O(1), 即在常量时间内完成, 以下是python对redis的set的操作说明

准备

import redis
r_con = redis.Redis("127.0.0.1",6379)

sadd

像某个key的set中添加元素

r_con.sadd("names", "tony") #1
r_con.sadd("names", "tony") #0
r_con.sadd("names", "wang") #1

如果添加成功, 则返回1, 添加已存在的数据的时候返回0

smembers

返回key的集合列表

r_con.smembers("names") #{'tony', 'wang'}

返回的数据也是pythonset的数据结构

scard

返回某个key的set的元素数量

r_con.scard("names") #2
r_con.scard("t") #0

sismember

返回value是否存在于key的set中

r_con.sismember("names", "Tony") #False
r_con.sismember("names", "tony") #True

spop

从key的set中随机移除一个value并返回该value

r_con.sadd("names", "Yi_Zhi_Yu") #1
r_con.sadd("names", "one fisher") #1
r_con.smembers("names") #{'Yi_Zhi_Yu', 'one fisher', 'tony', 'wang'}
r_con.spop("names") # wang
r_con.spop("names") # Yi_Zhi_Yu
r_con.smembers("names") #{'one fisher', 'tony'}
r_con.spop("names") # tony
r_con.spop("names") # one fisher
r_con.spop("names") # (这里已经没有任何结果了, names已经空了)

srandmember

与spop类似, 但不会移除value, 且其包含一个count参数 如果count 不传值, 仅返回一个随机的value, 时间复杂度O(1) 如果count 有值, 返回count个随机的value, 时间复杂度O(count), 如果count < 0, 返回的abs(count)个value, 且可能会有重复的value

r_con.sadd("names", "Yi_Zhi_Yu") #1
r_con.sadd("names", "one fisher") #1
r_con.sadd("names", "wang") #1
r_con.sadd("names", "tony") #1
r_con.srandmember("names") #wang
r_con.srandmember("names") #wang
r_con.srandmember("names") #Yi_Zhi_Yu
r_con.srandmember("names") #tony
r_con.srandmember("names",3) #['tony', 'one fisher', 'wang'] 
r_con.srandmember("names",3) #['Yi_Zhi_Yu', 'one fisher', 'wang']
r_con.srandmember("names",2) #['Yi_Zhi_Yu', 'tony']
r_con.smembers("names") #{'Yi_Zhi_Yu', 'one fisher', 'tony', 'wang'}
r_con.srandmember("names",-3) #['tony', 'one fisher', 'tony'](有重复)

srem

移除key的set的一个或多个value, 并返回成功移除的数值

r_con.smembers("names") #{'Yi_Zhi_Yu', 'one fisher', 'tony', 'wang'}
r_con.srem("names", "tony", "wang", "T") #2
r_con.smembers("names") #{'Yi_Zhi_Yu', 'one fisher'}

smove

将key1的set的value 移动到 key2的set中, 成功返回True, 失败返回False

r_con.smembers("names") #{'Yi_Zhi_Yu', 'one fisher', 'tony', 'wang'}
r_con.smembers("anames") # set()
r_con.smove("names", "anames", "tony") #True
r_con.smove("names", "anames", "tony") #False
r_con.smove("names", "anames", "wang") #True
r_con.smembers("names") #{'Yi_Zhi_Yu', 'one fisher'}
r_con.smembers("anames") #{'tony', 'wang'}

sdiff

返回一个set(集合), 这个set是key的set和key2,key3…的set的差集(即只在key的set中出现的value, 且不存在与key2,key3…的set中)

时间复杂度为O(N), N表示所有key的set的数量之和

r_con.smembers("A movies") #{'batman', 'superman'}
r_con.smembers("B movies") #{'batman', 'iron man', 'x-man'}
r_con.smembers("C movies") #{'Rural love story', 'batman'}

r_con.sdiff("A movies","B movies") #{'superman'}
r_con.sdiff("A movies","B movies", "C movies") #{'superman'}

sdiffstore

与sdiff 一致, 但会将diff的结果保存到一个key中

r_con.sdiffstore("ABC movies", "A movies","B movies", "C movies") #1
r_con.smembers("ABC movies") #{'superman'}

sinter

返回多个key的set的交集 时间复杂度O(M*N), M表示最短的set的元素数量, N表示set的个数

r_con.sinter("A movies","B movies", "C movies") #{'batman'}

sinterstore

与sinter 一致, 但会将交集的结果保存到一个key中(参考sdiffstore)

sunion

返回多个key的set的并集 时间复杂度O(N), N表示所有的set的元素数量之和

r_con.sunion("A movies","B movies", "C movies") 
#{'Rural love story', 'batman', 'iron man', 'superman', 'x-man'}

sunionstore

参考sinterstore