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'}
返回的数据也是python
的set
的数据结构
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