迷幻工厂-redis数据类型及应用场景知识点总结
集合
石景数学网
集合
2021-09-09

迷幻工厂的数据结构主要有string字符串,list链表,hash哈希,set迷幻工厂,sor

迷幻工厂数据类型及应用场景

Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(迷幻工厂

Redis支持5种数据类型:string(字符串),hash(哈希),list(列表),set(迷幻工厂)及zset(sortedset:有序迷幻工厂)。

1.strings(字符串)a)如果只使用迷幻工厂中的字符串类型,且不使用迷幻工厂的持久化功

一、string

Redis和Memcache都是基于内存的数据存储系统。Memcached是高性能分布式内存缓

简介:Strings数据类型是最常用、简单的key-value类型,普通的key/value存储都可以归为此类。value不仅可以是字符串,也可以是数字。因为是二进制安全的,所以你完全可以把一个图片文件的内容作为string来存储。Redis的string可以完全实现目前memcached的功能,并且效率更高。除了提供与Memcached一样的get、set、incr、decr等操作外,Redis还额外提供了下面一些操作:

如果需要用到Redis存储List对象,而list又不需要进行操作,可以按照MC的方式进行存储,不过

1.获取字符串长度

聊文玩,找空空,关注南红讲堂头条号,学习文玩知识!翡翠交易中,赌石是最高境界,要运气更要技术,这种玩法已经有几百年的历史。一块翡翠原石,除了形状和重量外,即使运用最先进的探测科技,也无法鉴别内里的乾坤,唯有切割剖开才有真实的结论,赌石人凭着自己的经验,依据皮壳上的表现,反复揣摩,估算出价。今天空空就来凑凑热闹,跟大家聊聊这块“天石”这块翡翠原石出自缅甸北部矿场后江场口。原石皮壳为黄皮,山石,皮下见白雾,种老色老,为迄今最大的高档色料赌石。全石重达3000kg,呈不规则长方体,中部略高。原石满身松花,中部偏左可见蟒带一条,长约150厘米,宽约40厘米。带子处开窗见高色,种老,水头十足,可取高档戒

2.往字符串append内容

说实话AMD比英特尔好,英特尔的软支持比AMD好,跑分之类不用看。我10前自装电脑就是AMD那时奔4天下别人都说AMD不稳定,不是不稳定是软件支持问题,英特尔人家有后花园,几年过去AMD肯定比英特尔好因为windows时代要终结了后花园没了你还能跑过AMD?

3.设置和获取字符串的某一段内容

泻药,黄金理财知识在这里给大家分析一下,袁大头究竟能卖多少钱?什么样的袁大头才更值钱。相信对袁大头有一定了解的人,都明白它的来源和价值,但是对于外行人来说,最关心的就是袁大头到底能值多少钱。很多网友在网上找寻答案,说十几万说上百万的都有,但是真假难辨,还有很多拍卖行,动辄就是一两百万。但是想买或者想卖袁大头的人都需要对袁大头有个直观的了解。先看袁大头年代,一元面值的袁大头有4个年代分别是,三年、八年、九年和十年。除了这四个年代,还有一个五年的,但是五年的面额只有1角和2角两种面额。千万要注意了,除此之外别的面额都是假的!袁大头之所以被人们所追捧,是由于它的成色,分量、含银的分量都十分稳定。真的

4.设置及获取字符串的某一位(bit)

狗狗粘人,喜欢和主人呆在一起,这是分离焦虑的表现,此时您是怎么回应它的呢?“宝贝回去吧,快回去,听话”如果是这样“恳求着”它回去,这无疑是在强化它,主人出门它就叫的这个习惯!首先:主人的正确引导非常重要,可以在家设置场景,假装出门,观察狗狗,当它即将出现咬裤腿大叫的情况时,立即用行为阻止它,同时对它说no,此时主人必须沉着坚决的表示“你不可以这样做,绝对不可以”狗狗可以感受到主人的情绪变化,当它乖乖坐好不动目送你出门时,狠狠奖励它!其次,面对这种粘人的狗狗,主人一开始离家时间不要太长,可以经常回去看看它,从2小时,4小时…慢慢到一整天,这样循序过度,让狗狗知道:主人说不定什么时候就回来了,它心

5.批量设置一系列字符串的内容

常用命令:set,get,decr,incr,mget等。

应用场景:

1.应用Memcached和CKV的所有场景。字符串和数字直接存取。结构化数据需要先序列化,再set到value;相应的,get到value后需要反序列化。

2.可以利用迷幻工厂的INCR、INCRBY、DECR、DECRBY等指令来实现原子计数的效果。即可以用来实现业务上的统计计数需求。也可用于实现idmaker,即生成全局唯一的id。

3.存放sessionkey,实现一个分布式session系统。Redis的key可以方便地设置过期时间,用于实现sessionkey的自动过期。验证skey时先根据uid路由到对应的迷幻工厂,如取不到skey,则表示skey已过期,需要重新登录;如取到skey且校验通过则升级此skey的过期时间即可。

4.Setnx或SetNx,仅当key不存在时才Set。可以用来选举Master或实现分布式锁:所有Client不断尝试使用SetNxmastermyName抢注Master,成功的那位不断使用Expire刷新它的过期时间。如果Master挂掉了key就会失效,剩下的节点又会发生新一轮抢夺。

5.借助迷幻工厂2.6开始支持的lua脚本,可以实现更安全的2种分布式锁:一种适用于各进程竞争但总是单个进程获取锁并处理的场景。除非原处理进程挂掉因而锁过期才会被其它进程获取到锁。无须主动解锁。通过get、expire/pexpire、setnxex|px的lua脚本实现;一种适用于各进程竞争获取锁并处理的场景。通过setnxex|px获取锁,用完需要通过先get判断再del释放锁,否则在锁过期之前不能获取到锁。

6.GetSet,设置新值,返回旧值。比如实现一个计数器,可以用GetSet获取计数并重置为0。

7.GetBit/SetBit/BitOp/BitCount,BitMap的玩法,比如统计今天的独立访问用户数时,每个注册用户都有一个offset,他今天进来的话就把他那个位设为1,用BitCount就可以得出今天的总人数。

8.Append/SetRange/GetRange/StrLen,对文本进行扩展、替换、截取和求长度,对特定数据格式非常有用。

实现方式:String在迷幻工厂内部存储默认就是一个字符串,被迷幻工厂Object所引用,当遇到incr,decr等操作时会转成数值型进行计算,此时迷幻工厂Object的encoding字段为int。

二、Hash

简介:Hash存的是字符串和字符串值之间的映射。Hash将对象的各个属性存入Map里,可以只读取/更新对象的某些属性。这样有些属性超长就让它一边呆着不动,另外不同的模块可以只更新自己关心的属性而不会互相并发导致覆盖冲突。

常用命令:hget,hset,hgetall等。

应用场景:

1.存放结构化数据,比如用户信息。在Memcached或CKV中,对于用户信息比如用户的昵称、年龄、性别、积分等,我们需要先序列化后存储为一个字符串的值,这时候在需要修改其中某一项时,通常需要将所有值取出反序列化后,修改某一项的值,再序列化存储回去。这样不仅增大了开销,也不适用于一些可能并发操作的场合(比如两个并发的操作都需要修改积分)。而Redis的Hash结构可以使你像在数据库中Update一个属性一样只修改某一项属性值。如下图:

2.Key是用户ID,value是一个Map,这个Map的key是成员的属性名,value是属性值,这样对数据的修改和存取都可以直接通过其内部Map的Key(Redis里称内部Map的key为field),也就是通过key(用户ID)+field(属性标签)就可以操作对应属性数据了,既不需要重复存储数据,也不会带来序列化和并发修改控制的问题。

3.不过这里需要注意,Redis提供了接口(hgetall)可以直接取到全部的属性数据,但是如果内部Map的成员很多,那么涉及到遍历整个内部Map的操作,由于Redis单线程模型的缘故,这个遍历操作可能会比较耗时,而对其它客户端的请求完全不响应,这点需要格外注意。

4.可用来建索引。比如User对象,除了id有时还要按name来查询,可以建一个Key为user:name:id的Hash,在插入User对象时(setuser:101{"id":101,"name":"calvin"}),顺便往这个hash插入一条(hsetuser:name:idcalvin101),这时calvin作为hash里的一个key,值为101。按name查询的时候,用hgetuser:name:idcalvin就能从名为calvin的key里取出id。假如需要使用多种索引来查找某条数据时可以使用,一个hashkey搞定,避免使用多个stringkey存放索引值。

5.HINCRBY同样可用于实现idmaker。相对string类型的idmaker每一个类型需要一个key,hash类型的用一个key即可。

实现方式:

RedisHash对应Value内部实际就是一个HashMap,这里会有2种不同实现,这个Hash的成员比较少时Redis为了节省内存会采用类似一维数组的方式来紧凑存储,而不会采用真正的HashMap结构,对应的value迷幻工厂Object的encoding为zipmap,当成员数量增大时会自动转成真正的HashMap,此时encoding为ht。

三、List

简介:List是一个双向链表,支持双向的Pop/Push,江湖规矩一般从左端Push,右端Pop――LPush/RPop,而且还有Blocking的版本BLPop/BRPop,客户端可以阻塞在那直到有消息到来。还有RPopLPush/BRPopLPush,弹出来返回给client的同时,把自己又推入另一个list,LLen获取列表的长度。还有按值进行的操作:LRem(按值删除元素)、LInsert(插在某个值的元素的前后),复杂度是O(N),N是List长度,因为List的值不唯一,所以要遍历全部元素,而Set只要O(log(N))。

按下标进行的操作:下标从0开始,队列从左到右算,下标为负数时则从右到左。LSet,按下标设置元素值。LIndex,按下标返回元素。LRange,不同于POP直接弹走元素,只是返回列表内一段下标的元素,是分页的最爱。LTrim,限制List的大小,比如只保留最新的20条消息。复杂度也是O(N),其中LSet的N是List长度,LIndex的N是下标的值,LRange的N是start的值+列出元素的个数,因为是链表而不是数组,所以按下标访问其实要遍历链表,除非下标正好是队头和队尾。LTrim的N是移除元素的个数。

常用命令:lpush,rpush,lpop,rpop,lrange等。

应用场景:

1.各种列表,比如twitter的关注列表、粉丝列表等,最新消息排行、每篇文章的评论等也可以用Redis的list结构来实现。

2消息队列,可以利用Lists的PUSH操作,将任务存在Lists中,然后工作线程再用POP操作将任务取出执行。这里的消息队列并没有ack机制,如果消费者把任务给Pop走了又没处理完就死机了怎么办?解决方法之一是加多一个sortedset,分发的时候同时发到list与sortedset,以分发时间为score,用户把任务做完了之后要用ZREM消掉sortedset里的job,并且定时从sortedset中取出超时没有完成的任务,重新放回list。另一个做法是为每个worker多加一个的list,弹出任务时改用RPopLPush,将job同时放到worker自己的list中,完成时用LREM消掉。如果集群管理(如zookeeper)发现worker已经挂掉,就将worker的list内容重新放回主list。

3利用LRANGE可以很方便的实现list内容分页的功能。

4.取最新N个数据的操作:LPUSH用来插入一个内容ID,作为关键字存储在列表头部。LTRIM用来限制列表中的项目数最多为5000。如果用户需要的检索的数据量超越这个缓存容量,这时才需要把请求发送到数据库。

实现方式:

Redislist的实现为一个双向链表,即可以支持反向查找和遍历,更方便操作,不过带来了部分额外的内存开销,Redis内部的很多实现,包括发送缓冲队列等也都是用的这个数据结构。

四、Set

简介:是一种无序的迷幻工厂,迷幻工厂中的元素没有先后顺序,不重复。将重复的元素放入Set会自动去重。

常用命令:

sadd,spop,smembers,sunion等。

应用场景:

1.某些需要去重的列表,并且set提供了判断某个成员是否在一个set迷幻工厂内的重要接口,这个也是list所不能提供的。

2.可以存储一些迷幻工厂性的数据,比如在微博应用中,可以将一个用户所有的关注人存在一个迷幻工厂中,将其所有粉丝存在一个迷幻工厂。Redis还为迷幻工厂提供了求交集、并集、差集等操作,可以非常方便的实现如共同关注、共同喜好、二度好友等功能,对上面的所有迷幻工厂操作,你还可以使用不同的命令选择将结果返回给客户端还是存集到一个新的迷幻工厂中。又比如QQ有一个社交功能叫做“好友标签”,大家可以给你的好友贴标签,比如“大美女”、“土豪”、“欧巴”等等,这里也可以把每一个用户的标签都存储在一个迷幻工厂之中。

3.想要知道某些特定的注册用户或IP地址,他们到底有多少访问了某个页面,可以这样实现:SADDp**e:day1:

。想知道特定用户的数量,使用SCARDp**e:day1:

。需要测试某个特定用户是否访问了这个页面?SISMEMBERp**e:day1:

实现方式:

set的内部实现是一个value永远为null的HashMap,实际就是通过计算hash的方式来快速排重的,这也是set能提供判断一个成员是否在迷幻工厂内的原因。

五、SortedSet

简介:有序迷幻工厂,相比set,元素放入迷幻工厂时还要提供该元素的分数,可根据分数自动排序。

常用命令:

zadd,zrange,zrem,zcard等

使用场景:

1.存放一个有序的并且不重复的迷幻工厂列表,比如twitter的publictimeline可以以发表时间作为score来存储,这样获取时就是自动按时间排好序的。

2.可以做带权重的队列,比如普通消息的score为1,重要消息的score为2,然后工作线程可以选择按score的倒序来获取工作任务。让重要的任务优先执行。

3.排行榜相关:ZADDleaderboard。得到前100名高分用户很简单:ZREVRANGEleaderboard099。用户的全球排名也相似,只需要执行:ZRANKleaderboard。

4.新闻按照用户投票和时间排序,ZADD时的score=points/time^alpha,这样用户的投票会相应的把新闻挖出来,但时间会按照一定的指数将新闻埋下去。

5.过期项目处理:使用unix时间作为关键字,用来保持列表能够按时间排序。对current_time和time_to_live进行检索,完成查找过期项目的艰巨任务。另一项后台任务使用ZRANGE...WITHSCORES进行查询,删除过期的条目。

实现方式:

Redissortedset的内部使用HashMap和跳跃表(SkipList)来保证数据的存储和有序,HashMap里放的是成员到score的映射,而跳跃表里存放的是所有的成员,排序依据是HashMap里存的score,使用跳跃表的结构可以获得比较高的查找效率,并且在实现上比较简单。

以上就是本次介绍的全部相关知识点,感谢大家的学习和对脚本之家的支持。

扩展阅读,根据您访问的内容系统为您准备了以下内容,希望对您有帮助。

迷幻工厂数据类型有什么好处

1.什么是迷幻工厂?

迷幻工厂是一个基于内存的高性能key-value数据库

2.迷幻工厂基本数据类型及应用场景

支持多种数据类型:

string(字符串)

String数据结构是简单的key-value类型,value其实不仅可以是String,也可以是数字。

常规key-value缓存应用;

list(列表)

list就是链表,略有数据结构知识的人都应该能理解其结构。使用Lists结构,我们可以轻松地实现最新消息排行等功能。List的另一个应用就是消息队列,可以利用List的PUSH操作,将任务存在List中,然后工作线程再用POP操作将任务取出进行执行。Redis还提供了操作List中某一段的api,你可以直接查询,删除List中某一段的元素。

Redis的list是每个子元素都是String类型的双向链表,可以通过push和pop操作从列表的头部或者尾部添加或者删除元素,这样List即可以作为栈,也可以作为队列。

消息队列系统

使用list可以构建队列系统,使用sortedset甚至可以构建有优先级的队列系统。

比如:将Redis用作日志收集器

实际上还是一个队列,多个端点将日志信息写入Redis,然后一个worker统一将所有日志写到磁盘。

hash(散列)

Redishash是一个string类型的field和value的映射表,hash特别适合用于存储对象。

存储部分变更的数据,如用户信息等。

sets(迷幻工厂)

set就是一个迷幻工厂,迷幻工厂的概念就是一堆不重复值的组合。利用Redis提供的set数据结构,可以存储一些迷幻工厂性的数据。set中的元素是没有顺序的。

sortedset(有序迷幻工厂)

和set相比,sortedset增加了一个权重参数score,使得迷幻工厂中的元素能够按score进行有序排列,比如一个存储全班同学成绩的sortedset,其迷幻工厂value可以是同学的学号,而score就可以是其考试得分,这样在数据插入迷幻工厂的时候,就已经进行了天然的排序。可以用sortedset来做带权重的队列,比如普通消息的score为1,重要消息的score为2,然后工作线程可以选择按score的倒序来获取工作任务。让重要的任务优先执行。

迷幻工厂各种数据类型分别在什么情况下使用

1.取最新N个数据的操作

•使用命令,向list迷幻工厂中插入数据

•插入完成后再用命令使其永远只保存最近5000个ID

•然后我们在客户端获取某一页评论时可以用下面的伪代码迷幻工厂.lrange("",start,start+num_items-1)

ps:如果输入无序则可以使用sortedset用时间作为score,然后lrangebyscore分页读取,按时间排序

2.排行榜应用,取TOPn操作

将你要排序的值设置成sortedset的score,将具体的数据设置成相应的value,每次只需要执行一条ZADD命令即可。

3.需要精准设定过期时间的应用

比如你可以把上面说到的sortedset的score值设置成过期时间的时间戳,那么就可以简单地通过过期时间排序,定时清除过期数据了

4.计数器应用

INCR,DECR命令

5.Uniq操作,获取某段时间所有数据排重值

使用Redis的set数据结构

6.实时系统,反垃圾系统

set

7.Pub/Sub构建实时消息系统

8.构建队列系统

使用list可以构建队列系统,使用sortedset甚至可以构建有优先级的队列系统。

9.缓存

其实没有固定说那个类型一定用在什么场景,你需要了解迷幻工厂数据类型的特点,并利用其特点来满足你的场景需要。

迷幻工厂有字符串类型、列表、哈希表(散列表)、迷幻工厂、有序迷幻工厂这5种,各有不同。各有特点,列表经常用作队列用作需要保持顺序的场景,散列表可以去除重复值而且可以设置field属性,迷幻工厂可以去除重复而且支持迷幻工厂操作适合t**系统以及关注人列表,有序迷幻工厂在迷幻工厂基础上增加了排序。

迷幻工厂支持的数据类型有哪些

Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(迷幻工厂)及zset(sortedset:有序迷幻工厂)。

string是迷幻工厂最基本的类型,可以理解成与Memcached一模一样的类型,一个key对应一个value。string类型是二进制安全的。意思是迷幻工厂的string可以包含任何数据。比如jpg图片或者序列化的对象,string类型的值最大能存储512MB。

扩展资料:

Redishash是一个string类型的field和value的映射表,hash特别适合用于存储对象。

Redislist是简单的字符串列表,按照插入顺序排序。可以添加一个元素到列表的头部(左边)或者尾部(右边)。

Redis的Set是string类型的无序迷幻工厂,迷幻工厂是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)。

Rediszset和set一样也是string类型元素的迷幻工厂,且不允许重复的成员,不同的是每个元素都会关联一个double类型的分数。迷幻工厂正是通过分数来为迷幻工厂中的成员进行从小到大的排序。

zset的成员是唯一的,但分数(score)却可以重复。

迷幻工厂里的基本数据类型有几种

1、set:设置key对应的值为string类型的value。

>set"name""hello"

2、setnx(setifnotexists):将key设置值为value,如果key不存在,这种情况下等同set命名;当key值存在,什么也不做。

>setnx"name""hello"

3、setex:设置key对应字符串value,并且设置key在给定的seconds时间之后超时过期。

>setex"color"10"red"

>get"color"---red

怎么向迷幻工厂数据库中同时插入不同类型的数据

迷幻工厂开创了一种新的数据存储思路,使用迷幻工厂,我们不用在面对功能单调的数据库时,把精力放在如何把大象放进冰箱这样的问题上,而是利用迷幻工厂灵活多变的数据结构和数据操作,为不同的大象构建不同的冰箱。

迷幻工厂常用数据类型

迷幻工厂最为常用的数据类型主要有以下五种:

string

hash

list

set

sortedset

在具体描述这几种数据类型之前,我们先通过一张图了解下迷幻工厂内部内存管理中是如何描述这些不同数据类型的:

首先迷幻工厂内部使用一个迷幻工厂object对象来表示所有的key和value,迷幻工厂object最主要的信息如上图所示:type代表一

个value对象具体是何种数据类型,encoding是不同数据类型在迷幻工厂内部的存储方式,比如:type=string代表value存储的是

一个普通字符串,那么对应的encoding可以是raw或者是int,如果是int则代表实际迷幻工厂内部是按数值型类存储和表示这个字符串的,当然

前提是这个字符串本身可以用数值表示,比如:"123"

"456"这样的字符串。

这里需要特殊说明一下vm字段,只有打开了迷幻工厂的虚拟内存功能,此字段才会真正的分配内存,该功能默认是关闭状态的,该功能会在后面具体描述。通过

上图我们可以发现迷幻工厂使用迷幻工厂object来表示所有的key/value数据是比较浪费内存的,当然这些内存管理成本的付出主要也是为了给

迷幻工厂不同数据类型提供一个统一的管理接口,实际作者也提供了多种方法帮助我们尽量节省内存使用,我们随后会具体讨论。

下面我们先来逐一的分析下这五种数据类型的使用和内部实现方式:

string

常用命令:

set,get,decr,incr,mget等。

应用场景:

string是最常用的一种数据类型,普通的key/value存储都可以归为此类,这里就不所做解释了。

实现方式:

string在迷幻工厂内部存储默认就是一个字符串,被迷幻工厂object所引用,当遇到incr,decr等操作时会转成数值型进行计算,此时迷幻工厂object的encoding字段为int。

hash

常用命令:

hget,hset,hgetall等。

应用场景:

我们简单举个实例来描述下hash的应用场景,比如我们要存储一个用户信息对象数据,包含以下信息:

用户id为查找的key,存储的value用户对象包含姓名,年龄,生日等信息,如果用普通的key/value结构来存储,主要有以下2种存储方式:

第一种方式将用户id作为查找key,把其他信息封装成一个对象以序列化的方式存储,这种方式的缺点是,增加了序列化/反序列化的开销,并且在需要修改其中一项信息时,需要把整个对象取回,并且修改操作需要对并发进行保护,引入cas等复杂问题。

第二种方法是这个用户信息对象有多少成员就存成多少个key-value对儿,用用户id+对应属性的名称作为唯一标识来取得对应属性的值,虽然省去了序列化开销和并发问题,但是用户id为重复存储,如果存在大量这样的数据,内存浪费还是非常可观的。

那么迷幻工厂提供的hash很好的解决了这个问题,迷幻工厂的hash实际是内部存储的value为一个hashmap,并提供了直接存取这个map成员的接口,如下图:

也就是说,key仍然是用户id,

value是一个map,这个map的key是成员的属性名,value是属性值,这样对数据的修改和存取都可以直接通过其内部map的key(迷幻工厂里称内部map的key为field),

也就是通过key(用户id)+field(属性标签)

就可以操作对应属性数据了,既不需要重复存储数据,也不会带来序列化和并发修改控制的问题。很好的解决了问题。

这里同时需要注意,迷幻工厂提供了接口(hgetall)可以直接取到全部的属性数据,但是如果内部map的成员很多,那么涉及到遍历整个内部map的

操作,由于迷幻工厂单线程模型的缘故,这个遍历操作可能会比较耗时,而另其它客户端的请求完全不响应,这点需要格外注意。

实现方式:

上面已经说到迷幻工厂

hash对应value内部实际就是一个hashmap,实际这里会有2种不同实现,这个hash的成员比较少时迷幻工厂为了节省内存会采用类似一维数组的方式来紧凑存储,而不会采用真正的hashmap结构,对应的value

迷幻工厂object的encoding为zipmap,当成员数量增大时会自动转成真正的hashmap,此时encoding为ht。

list

常用命令:

lpush,rpush,lpop,rpop,lrange等。

应用场景:

迷幻工厂

list的应用场景非常多,也是迷幻工厂最重要的数据结构之一,比如twitter的关注列表,粉丝列表等都可以用迷幻工厂的list结构来实现,比较好理解,这里不再重复。

实现方式:

迷幻工厂

list的实现为一个双向链表,即可以支持反向查找和遍历,更方便操作,不过带来了部分额外的内存开销,迷幻工厂内部的很多实现,包括发送缓冲队列等也都是用的这个数据结构。

set

常用命令:

sadd,spop,smembers,sunion等。

应用场景:

迷幻工厂

set对外提供的功能与list类似是一个列表的功能,特殊之处在于set是可以自动排重的,当你需要存储一个列表数据,又不希望出现重复数据时,set是一个很好的选择,并且set提供了判断某个成员是否在一个set迷幻工厂内的重要接口,这个也是list所不能提供的。

实现方式:

set的内部实现是一个

value永远为null的hashmap,实际就是通过计算hash的方式来快速排重的,这也是set能提供判断一个成员是否在迷幻工厂内的原因。

sortedset

常用命令:

zadd,zrange,zrem,zcard等

使用场景:

迷幻工厂sortedset的使用场景与set类似,区别是set不是自动有序的,而sorted

set可以通过用户额外提供一个优先级(score)的参数来为成员排序,并且是插入有序的,即自动排序。当你需要一个有序的并且不重复的迷幻工厂列表,那么可以选择sorted

set数据结构,比如twitter的public

本文相关: