redis基本类型和使用方法详解
redis存储数据的基本类型有:string(字符串类型)、hash(散列类型)、list(列表类型)、set(集合类型)、zset(有序集合类型)。
依次做一些练习。redis命令不区分大小写。
key相关操作
127.0.0.1:6379>setkeyhello##设置 OK 127.0.0.1:6379>setkey1world OK 127.0.0.1:6379>keyske*##keys查询键名 1)"key1" 2)"key" 127.0.0.1:6379>delkey1##删除键值对 (integer)1 127.0.0.1:6379>existskey##查询键名是否存在 (integer)1##存在返回1 127.0.0.1:6379>existskey1 (integer)0##不存在返回0 127.0.0.1:6379>typekey##查询键值的类型 string
字符串类型
127.0.0.1:6379>existsnum (integer)0 127.0.0.1:6379>incrnum##incr一个不存在的值,先创建新值,赋值为0,再自增1.院子操作。对应的是decr (integer)1 127.0.0.1:6379>setkeyhello OK 127.0.0.1:6379>incrkey##无法对string自增 (error)ERRvalueisnotanintegeroroutofrange 127.0.0.1:6379>incrbynum3##increby增加指定的数值,对应的是decrby (integer)4 127.0.0.1:6379>incrbyfloatnum0.7##增加浮点数 "4.7" 127.0.0.1:6379>appendkey"world!"##append追加字符 (integer)12 127.0.0.1:6379>getkey "helloworld!" 127.0.0.1:6379>strlenkey##strlen字符串长度 (integer)12 127.0.0.1:6379>mgetkeynum##mget批量获取键值 1)"helloworld!" 2)"4.7" 127.0.0.1:6379>msetkeyhinum5.5##mset批量设置 OK 127.0.0.1:6379>mgetkeynum 1)"hi" 2)"5.5" 127.0.0.1:6379>setfoobar OK 127.0.0.1:6379>getbitfoo1##getbit获取某一位二进制数值 (integer)1 127.0.0.1:6379>setbitfoo220##设置修改位值 (integer)1 127.0.0.1:6379>getfoo##修改成功 "bap" 127.0.0.1:6379>setfoobar OK 127.0.0.1:6379>setfoo1aar OK 127.0.0.1:6379>bitoporresultfoofoo1##bitop位操作 (integer)3 127.0.0.1:6379>getresult "car"
GETBITkeyoffset
SETBITkeyoffsetvalue
BITCOUNTkey[start][end]获取键值中值为1的二进制位个数,start和end表示字节位置
BITOPoperationdestkeykey[key...]对多个键值进行位运算,并将结果存储在destkey对应的键值中。支持的操作:AND、OR、XOR、NOT。
GETSETkeynewValue原子操作,设置新值,返回原来的值。如果原值不存在,返回nil。
SETEXkeysecondsvalue设置键值对的失效时间是seconds秒。
SETNXkeyvalueputifabsent,ordonothing。
SETRANGEkeyoffsetvalue从index等于offset位置起,替换length(value)个字符,替换为value。如果offset超出范围,则中间补充0x00。
GETRANGEkeystartend获取指定返回的字符串,闭区间。end超过长度,则取到字符串末尾。
MGETkey[key...]
MSETkeyvalue[keyvalue...]
MSETNXkeyvalue[keyvalue...]原子操作。如果在这一批Keys中有任意一个Key已经存在了,那么该操作将全部回滚,即所有的修改都不会生效。1表示全部设置成功;0表示都没有设置。
127.0.0.1:6379>getsetfoohi##设置新值,返回旧值nil (nil) 127.0.0.1:6379>getfoo "hi" 127.0.0.1:6379>setexfoo2hello##设置键值对,2秒失效 OK 127.0.0.1:6379>getfoo##没失效时,返回值 "hello" 127.0.0.1:6379>getfoo##失效之后,返回nil (nil) 127.0.0.1:6379>setfoohello OK 127.0.0.1:6379>setrangefoo1appy##替换index=1之后的字符串 (integer)5 127.0.0.1:6379>getfoo "happy" 127.0.0.1:6379>setrangefoo1ee (integer)5##返回修改后的长度 127.0.0.1:6379>getfoo##替换两个字符 "heepy" 127.0.0.1:6379>setrangefoo8day (integer)11 127.0.0.1:6379>getfoo "heepy\x00\x00\x00day" 127.0.0.1:6379>getbar (nil) 127.0.0.1:6379>setrangebar2ee##bar的值为nil,补充两个0x00 (integer)4 127.0.0.1:6379>getbar "\x00\x00ee" 127.0.0.1:6379>setkey1hello OK 127.0.0.1:6379>msetnxkey1hikey2hi##key2不存在,不修改 (integer)0 127.0.0.1:6379>mgetkey1key2##key2依然为nil 1)"hello" 2)(nil)
hash
HSETkeyfieldvalue
HGETkeyfield
HMSETkeyfieldvalue[fieldvalue...]
HMGETkeyfield[field...]
HGETALLkey
HEXISTSkeyfield
HSETNXkeyfieldvalue字段不存在时赋值。与HSET类型,区别在于,如果字段存在,HSETNX不执行任何操作。
HINCRBYkeyfiledincrement如果key、field不存在,自动创建,键值为0,再增值。
HDELkeyfield[field...]这是删除的是key:field,不能直接删除key。如果要删除key,使用DEL命令。
HEYSkey只获取字段名
HVALSkey只获取字段值
HLENkey获得字段数量
127.0.0.1:6379>HMSETg1class1xiaoming001xiaohong002tom003hanmeimei004 OK 127.0.0.1:6379>HGETALLg1class1 1)"xiaoming" 2)"001" 3)"xiaohong" 4)"002" 5)"tom" 6)"003" 7)"hanmeimei" 8)"004" 127.0.0.1:6379>HKEYSg1class1 1)"xiaoming" 2)"xiaohong" 3)"tom" 4)"hanmeimei" 127.0.0.1:6379>HLENg1class1 (integer)4 127.0.0.1:6379>HGETg1class1xiaohong "002" 127.0.0.1:6379>HSETg1class1lilei005##het新值时,返回1 (integer)1 127.0.0.1:6379>hsetg1class1xiaohong007##hset更新值时,返回0 (integer)0 127.0.0.1:6379>hsetnxg1class1tom008##已存在的值,不操作 (integer)0 127.0.0.1:6379>hgetg1class1tom##已存在的值,更新不生效,还是003 "003" 127.0.0.1:6379>hdelg1class1##不能直接删除key (error)ERRwrongnumberofargumentsfor'hdel'command 127.0.0.1:6379>DELg1class1##使用DEL删除key (integer)1 127.0.0.1:6379>hgetallg1class1##查询为空 (emptylistorset)
用途
- 用来存储分级数据。外部key作为prefix,是第一级key,hash中的key作为第二级key使用。
- 存储含有多个属性的对象,如一篇博客的各种属性:标题,标签,分类等。修改某个属性,不用操作整个博客内容。
list
redis列表类型内部是使用双向列表实现的,所以可以向/从两端添加/删除元素。
LPUSHkeyvalue[value...]从左侧添加元素,如果key不存在,初始化一个空列表,再添加。返回插入后,链表的个数。
LPUSHXkeyvalue仅当指定的Key存在时,才在列表的左边插入Value,否则将不会有任何操作发生。返回插入后,链表的个数。
RPUSHkeyvalue[value...]从右侧添加元素
RPUSHXkeyvalue仅当指定的Key存在时,才在列表的右边插入Value,否则将不会有任何操作发生。返回插入后,链表的个数。
LPOPkey从两端弹出元素
RPOPkey
LLENkey获取列表中元素个数
LRANGEkeystartend获取列表片段,左边在前,右边在后。起始索引为0,最右边元素索引可以为-1,右边第二个索引可以为-2,以此类推。。。索引从左到右,如果start比end靠右,则返回空列表。end值可以大于长度范围。
LREMkeycountvalue从左边(count>0)开始,删除前count个值为value的元素;从右边(count<0)开始,删除前|count|个值为value的元素;删除所有值为value的元素(count=0)。返回实际删除元素的个数。
LINDEXkeyindex获取指定索引的元素值
LSETkeyindexvalue设置指定索引的元素值
LTRIMkeystartend删除指定索引范围之外的所有元素。start和end的规则与lrange的相同。
LINSERTkeyBEFORE|AFTERpivotvalue从左到右查找pivot,将value插在其前面(BEFORE)或者后面(AFTER)。返回插入后,元素总个数。
RPOPLPUSHsourcedestination删除source最右边的元素,插入到destination最左边。返回操作的元素。
127.0.0.1:6379>lpushnum12##先push1,再push2 (integer)2 127.0.0.1:6379>rpushnum34##先push3,再push4 (integer)4 127.0.0.1:6379>lrangenum0-1##从0开始,显示4个元素 1)"2" 2)"1" 3)"3" 4)"4" 127.0.0.1:6379>llennum (integer)4 127.0.0.1:6379>lrangenum-1-2##start比end靠右,返回空列表 (emptylistorset) 127.0.0.1:6379>lrangenum-2-1##从右边第二到右边第一 1)"3" 2)"4" 127.0.0.1:6379>lpushnum343 (integer)7 127.0.0.1:6379>lrangenum0-1 1)"3" 2)"4" 3)"3" 4)"2" 5)"1" 6)"3" 7)"4" 127.0.0.1:6379>lremnum23 (integer)2##一共删除了两个 127.0.0.1:6379>lrangenum0-1 1)"4" 2)"2" 3)"1" 4)"3" 5)"4" 127.0.0.1:6379> 127.0.0.1:6379>lremnum04##删除所有值为4元素 (integer)2##一共删除了两个 127.0.0.1:6379>lrangenum0-1 1)"2" 2)"1" 3)"3" 127.0.0.1:6379>lremnum23 (integer)1##只删除了一个元素 127.0.0.1:6379>lrangenum0-1 1)"2" 2)"1" 127.0.0.1:6379>lpushnum13 (integer)4 127.0.0.1:6379>linsertnumBEFORE14##将4插入左边第一个1的前面 (integer)5##插入后,一共有5个元素 127.0.0.1:6379>lrangenum0-1 1)"3" 2)"4" 3)"1" 4)"2" 5)"1" 127.0.0.1:6379>rpoplpushnumnum1##转移一个元素 "1" 127.0.0.1:6379>lrangenum10-1 1)"1" 127.0.0.1:6379>rpoplpushnumnum1 "2" 127.0.0.1:6379>lrangenum10-1 1)"2" 2)"1" 127.0.0.1:6379>lrangenum0-1##num中转移走了2个元素 1)"3" 2)"4" 3)"1" 127.0.0.1:6379>lpushxnum5##键名num存在,push成功 (integer)4 127.0.0.1:6379>lrangenum20-1 (emptylistorset) 127.0.0.1:6379>lpushxnum21##键名num2不存在,push失败 (integer)0 127.0.0.1:6379>lrangenum20-1 (emptylistorset)
用途
- 列表页
set
redis的set使用值为空的散列表(hashtable)实现。
SADDkeymember[member...]加入set中不存在的元素;返回成功加入的值的个数
SREMkeymember[member...]删除set中存在的元素;返回成功删除的个数
SPOPkey随机选取一个元素,弹出并返回。如果key不存在,返回nil。
SMEMBERSkey获取所有元素
SISMEMBERkeymember判断元素是否在集合中,存在返回1;key或者member不存在,返回0。
SCARDkey获取元素个数
SDIFFkey1[key2...]集合求差集,key1中存在,key2中不存在的
SINTERkey[key...]集合求交集
SUNIONkey[key...]集合求并集
SDIFFSTOREdestinationkey1[key2...]集合求差集,并存入destination中。
SINTERSTOREdestinationkey[key...]集合求交集,并存入destination中。
SUNIONSTOREdestinationkey[key...]集合求并集,并存入destination中。
SRANDMEMBERkey[count]随机选取count个元素,不带参数count时,选取一个。count=0,返回空列表;count>0,选择min(count,scard)个数据,且不重复,最多返回所有元素;count<0选择|count|个元素,有可能重复。
SMOVEsourcedestinationmember原子性的将参数中的成员从source键移入到destination键所关联的Set中。因此在某一时刻,该成员或者出现在source中,或者出现在destination中。如果该成员在source中并不存在,该命令将不会再执行任何操作并返回0,否则,该成员将从source移入到destination。如果此时该成员已经在destination中存在,那么该命令仅是将该成员从source中移出。如果和Key关联的Value不是Set,将返回相关的错误信息。返回1表示正常移动,0表示source中并不包含参数成员。
127.0.0.1:6379>saddset1ab##添加两个不存在的元素 (integer)2 127.0.0.1:6379>saddset1ac##添加成功一个元素c (integer)1 127.0.0.1:6379>smembersset1##获取所有元素 1)"c" 2)"b" 3)"a" 127.0.0.1:6379>sremset1db##删除成功一个元素 (integer)1 127.0.0.1:6379>smembersset1 1)"c" 2)"a" 127.0.0.1:6379>sismemberset1a (integer)1 127.0.0.1:6379>saddset1b (integer)1 127.0.0.1:6379>saddset2ade (integer)3 127.0.0.1:6379>saddset3chj (integer)3 127.0.0.1:6379>sdiffset1set2set3##求差集,在set1中,同时不在set2,set3中的元素 1)"b" 127.0.0.1:6379>scardset1 (integer)3 127.0.0.1:6379>sdiffstoreset4set1set2set3 (integer)1 127.0.0.1:6379>smembersset4 1)"b" 127.0.0.1:6379>srandmemberset10 (emptylistorset) 127.0.0.1:6379>srandmemberset11 1)"c" 127.0.0.1:6379>srandmemberset12 1)"a" 2)"b" 127.0.0.1:6379>srandmemberset15##返回min(5,3)个元素,且不重复 1)"c" 2)"a" 3)"b" 127.0.0.1:6379>srandmemberset1-5##返回5个元素,可能重复 1)"a" 2)"b" 3)"c" 4)"c" 5)"c" 127.0.0.1:6379>spopset1 "c" 127.0.0.1:6379>smembersset1 1)"b" 2)"a" 127.0.0.1:6379>smembersset2 1)"d" 2)"a" 3)"e" 127.0.0.1:6379>smoveset2set1c##source中不含移动的元素,不操作 (integer)0 127.0.0.1:6379>smoveset2set1e##移动一个元素到另一个集合 (integer)1 127.0.0.1:6379>smembersset2 1)"d" 2)"a" 127.0.0.1:6379>smembersset1 1)"b" 2)"a" 3)"e"
用途
- 唯一性数据集合,如某用户访问了哪些店铺等。
- 集合相关场景。每个店铺的访问用户是一个set,查找同时访问多个店铺的用户群,查找访问一类店铺的用户群等。
sortedset
有序集合为每一个元素关联一个分数,并按照分数进行排序。虽然集合中的每个元素都是不相同的,但是它们的分数却可以相同。
ZADDkeyscoremember[scoremember...]添加新元素,如果元素已经存在,则更新分数。score支持整型和双精度浮点型。返回新添加的元素的个数(更新分数的不算)。inf和-inf分别表示正无穷和负无穷。
ZINCRBYkeyincrementmember增加一个元素的分数,increment可以是负数。
ZSCOREkeymember查询元素的分数
ZCARDkey获取集合中元素的个数
ZCOUNTkeyminmax指定分数范围内元素的个数,支持开闭区间。
ZRANGEkeystartend[WITHSCORES]按照分数从小到大排序,获取排名在某个范围的元素列表,分数可选。闭区间,end可为负数,与lrange参数要求一致。
ZREVRANGEkeystartend[WITHSCORES]按照分数从大到小排序。
ZRANGEBYSCOREkeyminmax[WITHSCORES][LIMIToffsetcount]按分数从小到大顺序,返回分数在闭区间[min,max]的元素。可以指定开区间,在min前面加上"(",则表示(min,max]。支持inf和-inf。offset和count指,在获得的元素列表的基础上,向后偏移offset个元素,并且只获取前count个元素。
ZREVRANGEBYSCOREkeymaxmin[WITHSCORES][LIMIToffsetcount]按分数从大到小顺序,返回分数在闭区间[min,max]的元素。注意max和min的参数位置。
ZREMkeymember[member...]删除一个或者多个元素
ZREMRANGEBYRANKkeystartend按照范围排名删除元素,闭区间。索引从0开始。
ZREMRANGEBYSCOREkeyminmax按照分数排名,删除分数在[min,max]的元素,支持开区间。
ZRANKkeymember按分数从小到大排序,获取元素member的排名,分数最小的排名是0
ZREVRANKkeymember按分数从大到小排序,获取元素member的排名,分数最大的排名是0
ZINTERSTOREdestinationnumkeyskey[key...][WEIGHTSweight[weight...]][AGGREGATESUM|MIN|MAX]计算numkeys个有序集合的交集,存储在有序集合destination里面,返回destination的元素个数。
WEIGHTS参数设置每个集合的权重,每个集合在参与计算时,元素的分数会被乘上该集合的权重。
AGGREGATE表示destination中元素分数的计算方式:
AGGREGATE为SUM(默认值)时,则destination中元素的分数,是每个参与计算的集合中该元素分数的和。
AGGREGATE为MAX时,则destination中元素的分数,是每个参与计算的集合中该元素分数的最大值。
AGGREGATE为MIN时,则destination中元素的分数,是每个参与计算的集合中该元素分数的最小值。
ZUNIONSTOREdestinationnumkeyskey[key...][WEIGHTSweight[weight...]][AGGREGATESUM|MIN|MAX]与上面类似。
127.0.0.1:6379>zaddzset110sh40bj##添加2个元素 (integer)2 127.0.0.1:6379>zaddzset120sh50hz80cd##更新1个,添加2个 (integer)2 127.0.0.1:6379>zscorezset1sh##获取sh的分数,已更新为20 "20" 127.0.0.1:6379>zrangezset11-1##从第二个元素开始的所有元素 1)"bj" 2)"hz" 3)"cd" 127.0.0.1:6379>zrangezset10-1withscores##获取全部元素 1)"sh" 2)"20" 3)"bj" 4)"40" 5)"hz" 6)"50" 7)"cd" 8)"80" 127.0.0.1:6379>zaddzset1infzy##添加正无穷 (integer)1 127.0.0.1:6379>zrangebyscorezset1(50infwithscores##分数大于50的元素 1)"cd" 2)"80" 3)"zy" 4)"inf" 127.0.0.1:6379>zrangebyscorezset150infwithscoreslimit12 ##分数大于等于50的元素,从第二个开始,取2个 1)"cd" 2)"80" 3)"zy" 4)"inf" 127.0.0.1:6379>zincrbyzset15hz##给元素hz加5分 "55" 127.0.0.1:6379>zrangebyscorezset1(50inf##添加成功 1)"hz" 2)"cd" 3)"zy" 127.0.0.1:6379>zrangezset10-1WITHSCORES##查询所有元素 1)"sh" 2)"20" 3)"bj" 4)"40" 5)"hz" 6)"55" 7)"cd" 8)"80" 9)"zy" 10)"inf" 127.0.0.1:6379>zcountzset10inf##获取元素个数 (integer)5 127.0.0.1:6379>zcountzset1(55inf##大于55元素个数 (integer)2 127.0.0.1:6379>zremzset1zy##删除zy (integer)1 127.0.0.1:6379>zrangezset10-1##剩下四个 1)"sh" 2)"bj" 3)"hz" 4)"cd" 127.0.0.1:6379>zremrangebyrankzset112##按照排名,删除第2名到第3名 (integer)2 127.0.0.1:6379>zrangezset10-1##只剩下2个 1)"sh" 2)"cd" 127.0.0.1:6379>zaddzs11a2b (integer)2 127.0.0.1:6379>zaddzs210a20b (integer)2 ##zs1和zs2取交集,zs1的权重为1,zs2的权重为0.5,所以a的结果分数是1+10*0.5=6 127.0.0.1:6379>zinterstorezs32zs1zs2WEIGHTS10.5AGGREGATEsum (integer)2 127.0.0.1:6379>zrangezs30-1withscores 1)"a" 2)"6" 3)"b" 4)"12"
用途
- 排序的场景。如按照博客访问量排序文章列表。key是用户id,set中的数据是文章id,每个文章id关联一个score(访问量)。
与列表的比较
- 都可以获取某一范围的元素
- 列表类型通过链表实现,获取两端数据速度快,元素增多后,访问中间数据速度较慢。所以适合“新鲜事”和“日志”一类的场景。
- 有序集合是通过散列表和跳跃表实现的,所以读取位于中间部分的数据的速度也很快。时间复杂度O(log(N))。
- 列表不能简单的调整某个元素的位置,有序集合可以。(修改元素的分数)
更多关于redis基本类型和使用方法请点击下面的相关链接
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。