Python Redis 的使用(续)

这篇文章将继续RedisPython下的使用,之前我们写了Redis数据库中字符串,散列类型以及列表的使用,在这篇文章中将介绍集合类型,事务,管道等内容。

集合类型

集合的概念在很多编程语言里都有实现,集合中所有元素都是不同的,并且没有顺序,在Redis中,一个集合可以存储2^32-1个字符串类型的数据,集合区别于列表主要在于无序和唯一的,而集合相对于列表而言有一个很大的优势就是在数据操作的复杂度为O(1)。这是因为集合是通过散列表实现的。集合的另外一个优点就是可以很方便的在进行多个集合之前的并集、交集和差集的运算。

Redis中集合增加元素的命令是SADD删除元素的命令是SREM,获取所有元素的命令是SMEMBERS, 判断一个元素是否在集合中是SISMEMBER, 集合运算, 交集SINTER, 并集SUNION, 差集SDIFF

下面来看看Python中如何操作redis集合

# 集合中添加元素
In [112]: r.sadd("post:1:tags", "python", "redis", "code")
Out[112]: 3

In [113]: r.sadd("post:2:tags", "redis", "java")
Out[113]: 2

In [114]: r.sadd("post:2:tags", "set")
Out[114]: 1
# 获取所有元素
In [115]: r.smembers("post:2:tags")
Out[115]: {'java', 'redis', 'set'}
# 获取差集
In [116]: r.sdiff("post:2:tags", "post:1:tags")
Out[116]: {'java', 'set'}
# 获取并集
In [117]: r.sunion("post:2:tags", "post:1:tags")
Out[117]: {'code', 'java', 'python', 'redis', 'set'}
# 获取交集
In [118]: r.sinter("post:2:tags", "post:1:tags")
Out[118]: {'redis'}
# 查看一个元素是否在集合中
In [119]: r.sismember("post:2:tags", "java")
Out[119]: True
# 随机获取一个元素
In [120]: r.srandmember("post:2:tags")
Out[120]: 'redis'

In [121]: r.srandmember("post:2:tags")
Out[121]: 'java'
# 随机获取多个元素
In [122]: r.srandmember("post:2:tags", 2)
Out[122]: ['java', 'redis']
# 当数目为负数时会获取|count|个元素,数目可能多于集合中元素的总数目,元素可能相同。当元素数量较少的时候随机性并不好
In [7]: r.srandmember("post:2:tags", -6)
Out[7]: ['set', 'set', 'set', 'java', 'java', 'java']
# 获取元素数目
In [5]: r.scard("post:2:tags")
Out[5]: 3

有序集合

有序集合区别于普通集合主要是有序的,有序集合的在普通集合的基础上为每个元素增加了一个分数,因此元素可以按照分数排序,有序集合不仅支持一般的集合操作,还可以按照分数进行有序索引。

有序集合通过散列表和跳跃表实现,因此数据访问要比列表快,不过占用的内存空间要比列表大。

应用举例

# 添加元素
In [19]: r.zadd("scoreboard", "Tom", 40, "Mark", 90)
Out[19]: 2

In [20]: r.zadd("scoreboard", "Jack", 89.45)
Out[20]: 1
# 分数支持无穷大和无穷小
In [38]: r.zadd("scoreboard", "Martin", '+inf')
Out[38]: 1
In [40]: r.zadd("scoreboard", "Joe", '-inf')
Out[40]: 1
In [41]: r.zscore("scoreboard", "Joe")
Out[41]: -inf
# 获取分数
In [21]: r.zscore("scoreboard", "Jack")
Out[21]: 89.45

按照索引获取元素,索引是从0开始的,注意zrange并不是按照分数获取元素的。

In [25]: r.zrange("scoreboard", start=0, end=100)
Out[25]: ['Tom', 'Jane', 'Jack', 'Mark']

In [26]: r.zrange("scoreboard", start=0, end=100, withscores=True)
Out[26]: [('Tom', 40.0), ('Jane', 60.0), ('Jack', 89.45), ('Mark', 90.0)]

按照分数范围获取元素

In [36]: r.zrangebyscore("scoreboard", 60 , 100)
Out[36]: ['Jane', 'Jack', 'Mark']

In [37]: r.zrangebyscore("scoreboard", 60 , 100, withscores=True)
Out[37]: [('Jane', 60.0), ('Jack', 89.45), ('Mark', 90.0)]

加减分数

In [51]: r.zincrby("scoreboard", 'Tom', 4.5)
Out[51]: 44.5

In [52]: r.zincrby("scoreboard", 'Jack', -45)
Out[52]: 44.45

相关文章

发表新评论