加入收藏 | 设为首页 | 会员中心 | 我要投稿 淮安站长网 (https://www.0517zz.cn/)- 运营、云管理、经验、智能边缘、云硬盘!
当前位置: 首页 > 建站 > 正文

Redis避不开的五种数据结构

发布时间:2018-10-23 20:14:51 所属栏目:建站 来源:编辑部的故事
导读:副标题#e# Redis 中有 5 种数据结构,分别是字符串(String)、哈希(Hash)、列表(List)、集合(Set)和有序集合(Sorted Set),因为使用 Redis 场景的开发中肯定是无法避开这些基础结构的,所以熟练掌握它们也就成了一项必不可少的能力。本文章精要地介绍了 Redi

zinterstore 命令参数比较多:

  • destination:将交集的计算结果,保存到这个键中。
  • numkeys:需要做交集计算键的个数。
  • key [key ...]:需要做交集计算的键。
  • WEIGHTS weight:每个键的权重,在做交集计算时,每个键中的分数值都会乘以这个权重,默认每个键的权重为 1。

AGGREGATE SUM|MIN|MAX:计算成员交集后,分值可以按照 sum(和)、min(最小值)、max(最大值)做汇总,默认值为 sum。

Redis避不开的五种数据结构

下面我们将权重设置为 0.5,这样当计算交集后,有序集合中的元素分数将都会减半,并且使用 max 参数汇总。

Redis避不开的五种数据结构

并集

zunionstore destination numkeys key [key ...] [WEIGHTS weight] [AGGREGATE SUM|MIN|MAX]

Redis避不开的五种数据结构

zunionstore 命令的相关参数和 zinterstore 命令相同。

时间复杂度

内部编码

有序集合类型的内部编码有两种,它们分别是:

  • ziplist(压缩列表):当有序集合的元素个数小于 128 个(默认设置),同时每个元素的值都小于 64 字节(默认设置),Redis 会采用 ziplist 作为有序集合的内部实现。
  • skiplist(跳跃表):当上述条件不满足时,Redis 会采用 skiplist 作为内部编码。

备注:上述中的默认值,也可以通过以下参数设置:zset-max-ziplist-entries 和 zset-max-ziplist-value。

下面我们用以下示例来验证上述结论。

当元素个数比较少,并且每个元素也比较小时,内部编码为 ziplist:

Redis避不开的五种数据结构

当元素个数超过 128 时,内部编码为 skiplist。下面我们将采用 python 动态创建128个元素,下面为源码:

  1. import redis  
  2. r = redis.Redis(host='127.0.0.1', port=6379)  
  3. if r.object('encoding', 'zsetkey') != None:  
  4. print('Key为【zsetkey】的字节编码为【%s】' % r.object('encoding', 'zsetkey').decode('utf-8')) 
  5. for i in range(1, 600):  
  6. r.zadd('zsetkey',i,1)  
  7. if r.object('encoding', 'zsetkey') != None:  
  8. print('Key为【zsetkey】的字节编码为【%s】' % r.object('encoding', 'zsetkey').decode('utf-8'))  
  9. Key为【zsetkey】的字节编码为【ziplist】  
  10. Key为【zsetkey】的字节编码为【skiplist】 

当有序集合中有任何一个元素大于 64 个字节时,内部编码为 skiplist。

  1. import redis  
  2. r = redis.Redis(host='127.0.0.1', port=6379)  
  3. if r.object('encoding', 'zsetkey') != None:  
  4. print('Key为【zsetkey】的字节编码为【%s】' % r.object('encoding', 'zsetkey').decode('utf-8'))  
  5. value = ''  
  6. for i in range(1, 600):  
  7. value += str(i)  
  8. r.zadd('zsetkey',value,1)  
  9. if r.object('encoding', 'zsetkey') != None:  
  10. print('Key为【zsetkey】的字节编码为【%s】' % r.object('encoding', 'zsetkey').decode('utf-8'))  
  11. Key为【zsetkey】的字节编码为【skiplist】 
Redis避不开的五种数据结构

到这里,本文就结束了,写了这么多,其实主要大部分是关于命令的简单介绍,其中也介绍了一些关键要点,如有不正确的地方,欢迎留言。

(编辑:淮安站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

推荐文章
    热点阅读