Redis学习和应用记录(2)--常用数据类型及命令
2014-09-28 14:12
756 查看
这一节主要介绍Redis支持的数据结构及常用命令。
数据类型
Redis支持多种数据类型的存储,包括字符,列表,集合,有续集合,哈希表,bit数组,超级日志等。下面分别介绍:
strings:存储普通字符。
Lists:列表,通常是有序的,根据插入的顺序排列的链表。利用List的有序性,可以模拟消息队列。
Sets:无须集合,且不能重复。Sets是查找速度最快的数据结构。
Sortedsets:有序集合,存储了值和评分,通常根据评分来排序。其查找速度也非常快。
Hashes,哈希表,存储了一系列键值对,键和值都是strings类型的。哈希表适合用于存储数据对象。
Bitarrays,二进制数组,暂用比最小的存储空间。
HyperLogLogs:,比较少用,有兴趣的读者可以参考这里http://redis.io/topics/data-types-intro#hyperloglogs。
RedisKey
关于RedisKey需要注意以下几点:
1.Key是Binary-safe的,你可以将strings作为key,也可以将bit[]作为key。
2.Rediskey最大支持支持512M(Memcache只支持1M),但是不建议设置太长的key,因为这样会增加内存存储,影响读写性能。key也不建议太短,这样可读性差,而且容易重复。在设计key对数据进行存储的时候,建议遵循一定的设计规范。
3.对Key进行设计是,最好显示数据类型,以及类型之间的关系。如用于存储用户的key,可以设计成这样。
setUser:1000"user1"
用户权限列表,可以定义成如下:
saddUser:1000:Permissions"user-edit""user-delete""user-create"
常用命令
如果你未安装Redis,也可以在线使用tryredis来执行Redis命令,请点击这里进入http://try.redis.io/
1.和字符串相关的命令
字符串是redis最基本的数据类型,用于存储字符。字符串是Binarysafe的,你可以将byte[]数组存储在字符串中。
set/get用于存储字符串。
[/code]
INCR/INCRBY/DECR/DECRBY用于对字符串做加减运算,这些命令会将strings类型的数据转换成整形,然后再进行加减运算。
Redis对数字的运算是原子性的,是很好的计数器。
mget/mset给多个key赋值,方便赋多个值,提高程序性能。
2.通用命令
通用命令对所有数据类型都有效。
DEL/EXISTS,删除key、判断key是否存在
EXPIRES,设置key的过期时间。
TTL,查询key过期时间
LLEN,查询包含多元素数据类型的长度。对list,set,sortedset,hashes通用。
自动创建/移除规则
当添加元素到多元素数据类型时(指List,Set,SortedSet,Hashes等),如果key存在,则添加元素到key,如果不存在,则创建key。
当向key中移除元素是,如果key为空,则删除key。
上边命令,先创建了mylist,mylist长度为1,弹出元素后,mylist被删除。
3.和List有关的命令
LPUSH/RPUSH从列表左侧/右侧添加元素,这两个命令都可以一次添加多个元素。
LRANGE,从列表的左侧取元素,LANGE接收3个参数,列表名称,开始索引和结束索引。0代表第一个索引,-1代表左后一个索引,-2代表倒数第二个索引。
LPOP/RPOP,从列表的左侧/右侧弹出元素。命令执行后,返回被弹出的元素,并且该元素从列表中移除。
BLPOP/BRPOP,以阻塞的方式从列表左侧/右侧弹出元素。
以上命令从tasks中弹出元素,若tasks中没有元素,5s后返回null。如果时间参数设为0,则永久等待,直到有元素被返回。
另外brpop/lblpop可以接收多个List参数,直到其中的一个List返回,若所有的List都为空,则进入阻塞。利用这一特性,我们可以模拟消息队列(阻塞队列)。关于阻塞队列的模拟,会在后边章节中讲到。brpop/lblpop的返回值包括list名称和值。
LTRIM,从列表的左侧截取元素,多余的元素将会被移除。这个命令很有用,在首页上显示top信息时(比如显示企业新闻前10条,显示最近发表的前10个用户的评论),可以使用LTRIM实现。
4.和Hashes有关的命令
Hashes存储一系列键值对,Hashes适合存储对象,例如你可以将用户信息存储在Hashes中。
hmset/hmget给Hasheskey赋多个值/从Hashes中取多个值
hget/hgetall,从Hashes中取一个值/所有值
hincrby,增加field的值。
5.和Set有关的命令
Set是一系列strings的集合,他们是无序的。
sadd/sismember/smembers,添加元素到Set/判断元素是否是Set的成员/获取Set所有成员。
[/code]
sinter,取多个Set的交集
spop/srandmember/sunionstore/scard,从集合中随机取(不重复的)元素/从集合中随机取(可重复的)元素/将一个集合复制到另一个集合/取集合的基数(元素个数)
6.和SortedSet有关的命令
SortedSet是一种介于set和hashes之间的数据结构,sortedset的元素不能重发,它存储了一个score和一个值,集合根据score排序,若score相等,则根据元素的字母顺序进行排序。
SortedSet可以用来做两组对象之间的关联,比如要建立用户和部门之间的关联,可以将部门id作为score,用户id作为值存储在sortedset中。
zadd,添加元素到sortedset,可以一次添加多个元素
zrange/zrevrange,获取sortedset中的元素。/以倒序的方式获取sortedset中的元素。
可以在这两个命令后加上withscores,显示score信息
zrangebyscore,根据score范围获取sortedset元素。下边命令获取生日小于1950的元素,-inf表示负无穷大。
zremrangebyscore,根据score移除元素。一下命令移除出生日期为1940和1960的元素。
zrand/zrevrand,获取元素的位置。/已降序的方式获取元素的位置。
从Redix2.8开始,允许向sortedset中插入score相同,值不同的元素,这些元素因为score相同,所以根据值进行排序。
zrangebylex/zrevrangebylex/zrevrangebylex/zlexcount,这些命令分别是对字符排序的set进行操作的,故名思议,zrangebylex/zrevrangebylex是根据字符来获取sortedset中的元素。zrevrangebylex是根据字符来移除元素,zlexcount是获取元素的个数。
[/code]
redis>ZADDmyzset0a0b0c0d0e[/code]
限于篇幅,还有一些Redis的命令这里未讲到,需要用时可以到这里http://redis.io/commands去查。
下一篇将介绍jedis框架,基于Java的Redis客户端。
数据类型
Redis支持多种数据类型的存储,包括字符,列表,集合,有续集合,哈希表,bit数组,超级日志等。下面分别介绍:
strings:存储普通字符。
Lists:列表,通常是有序的,根据插入的顺序排列的链表。利用List的有序性,可以模拟消息队列。
Sets:无须集合,且不能重复。Sets是查找速度最快的数据结构。
Sortedsets:有序集合,存储了值和评分,通常根据评分来排序。其查找速度也非常快。
Hashes,哈希表,存储了一系列键值对,键和值都是strings类型的。哈希表适合用于存储数据对象。
Bitarrays,二进制数组,暂用比最小的存储空间。
HyperLogLogs:,比较少用,有兴趣的读者可以参考这里
RedisKey
关于RedisKey需要注意以下几点:
1.Key是Binary-safe的,你可以将strings作为key,也可以将bit[]作为key。
2.Rediskey最大支持支持512M(Memcache只支持1M),但是不建议设置太长的key,因为这样会增加内存存储,影响读写性能。key也不建议太短,这样可读性差,而且容易重复。在设计key对数据进行存储的时候,建议遵循一定的设计规范。
3.对Key进行设计是,最好显示数据类型,以及类型之间的关系。如用于存储用户的key,可以设计成这样。
setUser:1000"user1"
用户权限列表,可以定义成如下:
saddUser:1000:Permissions"user-edit""user-delete""user-create"
常用命令
如果你未安装Redis,也可以在线使用tryredis来执行Redis命令,请点击这里进入
1.和字符串相关的命令
字符串是redis最基本的数据类型,用于存储字符。字符串是Binarysafe的,你可以将byte[]数组存储在字符串中。
set/get用于存储字符串。
>setmykeysomevalue OK >getmykey "somevalue"
[/code]
INCR/INCRBY/DECR/DECRBY用于对字符串做加减运算,这些命令会将strings类型的数据转换成整形,然后再进行加减运算。
Redis对数字的运算是原子性的,是很好的计数器。
>setcounter100 OK >incrcounter (integer)101 >incrcounter (integer)102 >incrbycounter50 (integer)152
mget/mset给多个key赋值,方便赋多个值,提高程序性能。
>mseta10b20c30 OK >mgetabc 1)"10" 2)"20" 3)"30"
2.通用命令
通用命令对所有数据类型都有效。
DEL/EXISTS,删除key、判断key是否存在
>setmykeyhello OK >existsmykey (integer)1 >delmykey (integer)1 >existsmykey (integer)0
EXPIRES,设置key的过期时间。
>setkeysome-value OK >expirekey5 (integer)1 >getkey(immediately) "some-value" >getkey(aftersometime) (nil)
TTL,查询key过期时间
>setkey100ex10 OK >ttlkey (integer)9
LLEN,查询包含多元素数据类型的长度。对list,set,sortedset,hashes通用。
>delmylist (integer)0 >llenmylist (integer)0 >lpopmylist (nil)
自动创建/移除规则
当添加元素到多元素数据类型时(指List,Set,SortedSet,Hashes等),如果key存在,则添加元素到key,如果不存在,则创建key。
当向key中移除元素是,如果key为空,则删除key。
>lputmylist1 (integer)1 >lpopmylist (integer)0
上边命令,先创建了mylist,mylist长度为1,弹出元素后,mylist被删除。
3.和List有关的命令
LPUSH/RPUSH从列表左侧/右侧添加元素,这两个命令都可以一次添加多个元素。
>rpushmylistA (integer)1 >rpushmylistB (integer)2 >lpushmylistfirst (integer)3 >lrangemylist0-1 1)"first" 2)"A" 3)"B"
LRANGE,从列表的左侧取元素,LANGE接收3个参数,列表名称,开始索引和结束索引。0代表第一个索引,-1代表左后一个索引,-2代表倒数第二个索引。
>rpushmylist12345"foobar" (integer)9 >lrangemylist0-1 1)"first" 2)"A" 3)"B" 4)"1" 5)"2" 6)"3" 7)"4" 8)"5" 9)"foobar"
LPOP/RPOP,从列表的左侧/右侧弹出元素。命令执行后,返回被弹出的元素,并且该元素从列表中移除。
>rpushmylistabc (integer)3 >rpopmylist "c" >rpopmylist "b" >rpopmylist "a"
BLPOP/BRPOP,以阻塞的方式从列表左侧/右侧弹出元素。
>brpoptasks5 1)"tasks" 2)"do_something"
以上命令从tasks中弹出元素,若tasks中没有元素,5s后返回null。如果时间参数设为0,则永久等待,直到有元素被返回。
另外brpop/lblpop可以接收多个List参数,直到其中的一个List返回,若所有的List都为空,则进入阻塞。利用这一特性,我们可以模拟消息队列(阻塞队列)。关于阻塞队列的模拟,会在后边章节中讲到。brpop/lblpop的返回值包括list名称和值。
LTRIM,从列表的左侧截取元素,多余的元素将会被移除。这个命令很有用,在首页上显示top信息时(比如显示企业新闻前10条,显示最近发表的前10个用户的评论),可以使用LTRIM实现。
>rpushmylist12345 (integer)5 >ltrimmylist02 OK >lrangemylist0-1 1)"1" 2)"2" 3)"3"
4.和Hashes有关的命令
Hashes存储一系列键值对,Hashes适合存储对象,例如你可以将用户信息存储在Hashes中。
hmset/hmget给Hasheskey赋多个值/从Hashes中取多个值
>hmsetuser:1000usernameantirezbirthyear1977verified1 OK
>hmgetuser:1000usernamebirthyearno-such-field 1)"antirez" 2)"1977" 3)(nil)
hget/hgetall,从Hashes中取一个值/所有值
>hgetuser:1000birthyear "1977" >hgetalluser:1000 1)"username" 2)"antirez" 3)"birthyear" 4)"1977" 5)"verified" 6)"1"
hincrby,增加field的值。
>hincrbyuser:1000birthyear10 (integer)1987 >hincrbyuser:1000birthyear10 (integer)1997
5.和Set有关的命令
Set是一系列strings的集合,他们是无序的。
sadd/sismember/smembers,添加元素到Set/判断元素是否是Set的成员/获取Set所有成员。
>saddmyset123 (integer)3 >smembersmyset 1.3 2.1 3.2
[/code]
>sismembermyset3 (integer)1 >sismembermyset30 (integer)0
sinter,取多个Set的交集
>saddset11234
(integer)4 >saddset22457 (integer)4 >sinterset1set2 1)"2" 2)"4"
spop/srandmember/sunionstore/scard,从集合中随机取(不重复的)元素/从集合中随机取(可重复的)元素/将一个集合复制到另一个集合/取集合的基数(元素个数)
6.和SortedSet有关的命令
SortedSet是一种介于set和hashes之间的数据结构,sortedset的元素不能重发,它存储了一个score和一个值,集合根据score排序,若score相等,则根据元素的字母顺序进行排序。
SortedSet可以用来做两组对象之间的关联,比如要建立用户和部门之间的关联,可以将部门id作为score,用户id作为值存储在sortedset中。
zadd,添加元素到sortedset,可以一次添加多个元素
>zaddhackers1940"HedyLamarr"1936"AlanTuring"1952"AlexHu" (integer)3
zrange/zrevrange,获取sortedset中的元素。/以倒序的方式获取sortedset中的元素。
>zrangehackers0-1 1)"AlanTuring" 2)"HedyLamarr" 3)"AlexHu"
>zrevrangehackers0-1 1)"AlexHu" 2)"HedyLamarr" 3)"alanTuring"
可以在这两个命令后加上withscores,显示score信息
>zrangehackers0-1
1)"AlanTuring"
2)1936
3)"HedyLamarr"
4)1940
5)"AlexHu"
6)1952
zrangebyscore,根据score范围获取sortedset元素。下边命令获取生日小于1950的元素,-inf表示负无穷大。
>zrangebyscorehackers-inf1950
1)"AlanTuring"
2)"HedyLamarr"
3)"ClaudeShannon"
4)"AlanKay"
5)"AnitaBorg"
zremrangebyscore,根据score移除元素。一下命令移除出生日期为1940和1960的元素。
>zremrangebyscorehackers19401960
(integer)4
zrand/zrevrand,获取元素的位置。/已降序的方式获取元素的位置。
>zrankhackers"AnitaBorg"
(integer)4
从Redix2.8开始,允许向sortedset中插入score相同,值不同的元素,这些元素因为score相同,所以根据值进行排序。
zrangebylex/zrevrangebylex/zrevrangebylex/zlexcount,这些命令分别是对字符排序的set进行操作的,故名思议,zrangebylex/zrevrangebylex是根据字符来获取sortedset中的元素。zrevrangebylex是根据字符来移除元素,zlexcount是获取元素的个数。
>zaddhackers0"AlanKay"0"SophieWilson"0"RichardStallman"0
"AnitaBorg"0"YukihiroMatsumoto"0"HedyLamarr"0"ClaudeShannon"
0"LinusTorvalds"0"AlanTuring"
[/code]
>zrangebylexhackers[B[P
1)"ClaudeShannon"
2)"HedyLamarr"
3)"LinusTorvalds"
redis>ZADDmyzset0a0b0c0d0e[/code]
(integer)5
redis>ZADDmyzset0f0g
(integer)2
限于篇幅,还有一些Redis的命令这里未讲到,需要用时可以到这里
下一篇将介绍jedis框架,基于Java的Redis客户端。
相关文章推荐
- Redis 学习笔记--数据类型常用命令
- edis学习记录02-redis基础数据类型命令
- Redis的介绍和常用数据类型结构命令的总结
- Redis Set类型数据常用命令参考
- Redis学习笔记2--Redis数据类型及相关命令
- redis 学习手册之哈希表数据类型hashes操作命令
- redis数据类型List的常用命令
- Redis常用数据类型介绍、使用场景及其操作命令
- redis数据类型Set的常用命令
- Redis常用数据类型介绍、使用场景及其操作命令
- Redis中7种集合类型应用场景&redis常用命令
- [置顶] Redis String类型数据常用的16条命令总结
- Redis简介、与memcached比较、存储方式、应用场景、生产经验教训、安全设置、key的建议、安装和常用数据类型介绍、ServiceStack.Redis使用(1)
- redis 学习手册之无序集合数据类型sets操作命令
- redis基本数据类型和常用命令操作
- redis学习-5种数据类型和相关命令
- Redis - 数据类型常用命令
- Redis Hash类型数据常用命令总结
- Redis数据类型和常用命令
- Redis常用数据类型介绍、使用场景及其操作命令