python对redis的常用操作 下 (无序集合,有序集合)

无序集合:

首先介绍增加,删除和获得所有元素的方法。我将会用第二部分来讨论集合的特殊操作:

In [136]: x.sadd("challenge", 1,2,3,4,5,6,7,5,4,4,3,4,2)
7

In [138]: x.smembers("challenge")
set(['1', '3', '2', '5', '4', '7', '6'])

In [139]: x.srem("challenge", 1, 3)
2

In [140]: x.smembers("challenge")
set(['2', '5', '4', '7', '6'])

上面依次是增加一个集合键challenge并且给它同时赋予多个值,

然后使用smembers方法查看集合中元素

移除键里面的1和3两个元素吗操作成功两个元素返回2

再次使用smembers确认。

 

然后我们来讨论下集合元素特有的几个方法,求交集,差集以及并集:

# 差集的计算使用a-b然后除掉a中有b的部分 最后输出a
In [143]: x.smembers("clip")
set(['1', '3', '2'])

In [144]: x.smembers("challenge")
set(['2', '5', '4', '7', '6'])

In [145]: x.sdiff("clip", "challenge")
set(['1', '3'])

# 交集
In [146]: x.sinter("clip", "challenge")
set(['2'])

# 并集
In [147]: x.sunion("clip", "challenge")
set(['1', '3', '2', '5', '4', '7', '6'])

 

下面再讨论几个常用的方法:

# 计算集合数量
In [149]: x.smembers("clip")
set(['1', '3', '2'])

In [150]: x.scard("clip")
3

# 随机获得集合中的一个元素 该方法并不是很随机,取决于“桶”中元素的多少,具体了解其集合实现以及散列表
In [156]: x.srandmember("challenge")
'6'

In [157]: x.srandmember("challenge")
'4'

In [158]: x.srandmember("challenge")
'2'

# 随机弹出元素,弹出后不再出现在集合中

 In [159]: x.spop("challenge")
 '6'

  In [160]: x.smembers("challenge")
  set(['2', '5', '4', '7'])

 

有序集合类型:

有序集合类型又点特别,所以我摘抄了一些《redis入门指南第二版》里面的介绍:

“在集合类型的基础上有序集合类型为集合中的每个元素都关联了一个分数,这使得我们不仅可以完成插入、删除和判断元素是否存在等集合类型支持的操作,还能够获得分数最高(或最低)的前N个元素、获得指定分数范围内的元素等与分数有关的操作。虽然集合中每个元素都是不同的,但是它们的分数却可以相同。

有序集合类型在某些地方和列表类型有些相似。

1. 两者都是有序的。

2. 两者都可以获得某一范围的元素。

但同时两者又有比较大的区别,这使得它们的应用场景是不同的

1. 列表类型是通过链表实现的,获取靠近两端数据的速度极快,而当元素增多之后,访问中间数据的速度会变得非常慢,所以它更加适合实现如‘新鲜事’, ‘日志’ 这样很少访问中间元素的应用。

2. 有序集合类型是使用散列表和跳跃表实现的,所以及时读区位于中间位置的数据速度也非常快。

3. 列表中不能简单的调整某个元素的位置,但是有序集合可以做到(可以调整对应位置元素的分数达到效果)”

4. 有序集合要比列表更耗费内存。”

 

# 注意zadd python的调用方法和redis原生的不太一样,reids原生使用的是先分数后值的形式而python里面的操作正好相反。
In [166]: x.zadd("laplace", "unicorn", 88, "gundom", 87, "gunicorn", 1)
3

# 取区域范围内的值和值的分数,排序默认使用分数升序,返回的分数是浮点型
In [175]: x.zrange("laplace", 0, 20, withscores=True)
[('gunicorn', 1.0), ('gundom', 87.0), ('unicorn', 88.0)]

#逆序即是zrange和zrevrange
In [178]: x.zrevrange("laplace", 0, 20, withscores=True)
[('unicorn', 88.0), ('gundom', 87.0), ('gunicorn', 1.0)]

# 获取指定键的某个值的分数
In [176]: x.zscore("laplace", "unicorn")
88.0

 更详细更完整的命令使用可以查看reference里面的redis-py的doc。里面有非常详细的使用方法。

 

Reference:

http://redis-py.readthedocs.io/en/latest/   redis-py document

 

 

 

 

《redis入门指南(第二版)》by 李子骅

 

posted @ 2016-07-19 20:09  piperck  阅读(1483)  评论(0编辑  收藏  举报