您的位置:首页 > 数据库 > Redis

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用于存储字符串。

>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的命令这里未讲到,需要用时可以到这里http://redis.io/commands去查。

下一篇将介绍jedis框架,基于Java的Redis客户端。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: