这一节主要介绍Redis支持的数据结构及常用命令。

数据类型

Redis支持多种数据类型的存储,包括字符,列表,集合,有续集合,哈希表,bit数组,超级日志等。下面分别介绍:

strings:存储普通字符。

Lists:列表,通常是有序的,根据插入的顺序排列的链表。 利用List的有序性,可以模拟消息队列。

Sets:无须集合,且不能重复。Sets是查找速度最快的数据结构。

Sorted sets:有序集合,存储了值和评分,通常根据评分来排序。其查找速度也非常快。

Hashes,哈希表,存储了一系列键值对,键和值都是strings类型的。哈希表适合用于存储数据对象。

Bit arrays,二进制数组,暂用比最小的存储空间。

HyperLogLogs:,比较少用,有兴趣的读者可以参考这里http://redis.io/topics/data-types-intro#hyperloglogs

Redis Key

关于Redis Key需要注意以下几点:

1. Key是Binary-safe的,你可以将strings作为key,也可以将bit[]作为key。

2. Redis key最大支持支持512M(Memcache只支持1M),但是不建议设置太长的key,因为这样会增加内存存储,影响读写性能。key也不建议太短,这样可读性差,而且容易重复。在设计key对数据进行存储的时候,建议遵循一定的设计规范。

3. 对Key进行设计是,最好显示数据类型,以及类型之间的关系。如用于存储用户的key,可以设计成这样。

set User:1000 "user1"

用户权限列表,可以定义成如下:

sadd User:1000:Permissions "user-edit" "user-delete" "user-create"

常用命令

如果你未安装Redis,也可以在线使用try redis来执行Redis命令,请点击这里进入http://try.redis.io/

1. 和字符串相关的命令

字符串是redis最基本的数据类型,用于存储字符。字符串是Binary safe的,你可以将byte[]数组存储在字符串中。

set/get用于存储字符串。

> set mykey somevalue
OK
> get mykey
"somevalue"

INCR/INCRBY/DECR/DECRBY用于对字符串做加减运算,这些命令会将strings类型的数据转换成整形,然后再进行加减运算。

Redis对数字的运算是原子性的,是很好的计数器。

> set counter 100
OK
> incr counter
(integer) 101
> incr counter
(integer) 102
> incrby counter 50
(integer) 152

mget/mset给多个key赋值,方便赋多个值,提高程序性能。

> mset a 10 b 20 c 30
OK
> mget a b c
1) "10"
2) "20"
3) "30"

2. 通用命令

通用命令对所有数据类型都有效。

DEL/EXISTS,删除key、判断key是否存在

> set mykey hello
OK
> exists mykey
(integer) 1
> del mykey
(integer) 1
> exists mykey
(integer) 0

EXPIRES,设置key的过期时间。

> set key some-value
OK
> expire key 5
(integer) 1
> get key (immediately)
"some-value"
> get key (after some time)
(nil)

TTL,查询key过期时间

> set key 100 ex 10
OK
> ttl key
(integer) 9

LLEN,查询包含多元素数据类型的长度。对list, set, sorted set, hashes通用。

> del mylist
(integer) 0
> llen mylist
(integer) 0
> lpop mylist
(nil)

自动创建/移除规则

当添加元素到多元素数据类型时(指List,Set,SortedSet,Hashes等),如果key存在,则添加元素到key,如果不存在,则创建key。

当向key中移除元素是,如果key为空,则删除key。

> lput mylist 1
(integer) 1
> lpop mylist
(integer) 0

上边命令,先创建了mylist,mylist长度为1,弹出元素后,mylist被删除。

3. 和List有关的命令

LPUSH/RPUSH 从列表左侧/右侧添加元素,这两个命令都可以一次添加多个元素。

> rpush mylist A
(integer) 1
> rpush mylist B
(integer) 2
> lpush mylist first
(integer) 3
> lrange mylist 0 -1
1) "first"
2) "A"
3) "B"

LRANGE,从列表的左侧取元素,LANGE 接收3个参数,列表名称,开始索引和结束索引。0代表第一个索引,-1代表左后一个索引,-2代表倒数第二个索引。

> rpush mylist 1 2 3 4 5 "foo bar"
(integer) 9
> lrange mylist 0 -1
1) "first"
2) "A"
3) "B"
4) "1"
5) "2"
6) "3"
7) "4"
8) "5"
9) "foo bar"

LPOP/RPOP,从列表的左侧/右侧弹出元素。命令执行后,返回被弹出的元素,并且该元素从列表中移除。

> rpush mylist a b c
(integer) 3
> rpop mylist
"c"
> rpop mylist
"b"
> rpop mylist
"a"

BLPOP/BRPOP,以阻塞的方式从列表左侧/右侧弹出元素。

> brpop tasks 5
1) "tasks"
2) "do_something"

以上命令从tasks中弹出元素,若tasks中没有元素,5s后返回null。如果时间参数设为0,则永久等待,直到有元素被返回。

另外brpop/lblpop可以接收多个List参数,直到其中的一个List返回,若所有的List都为空,则进入阻塞。利用这一特性,我们可以模拟消息队列(阻塞队列)。关于阻塞队列的模拟,会在后边章节中讲到。brpop/lblpop的返回值包括list名称和值。

LTRIM,从列表的左侧截取元素,多余的元素将会被移除。这个命令很有用,在首页上显示top信息时(比如显示企业新闻前10条,显示最近发表的前10个用户的评论),可以使用LTRIM实现。

> rpush mylist 1 2 3 4 5
(integer) 5
> ltrim mylist 0 2
OK
> lrange mylist 0 -1
1) "1"
2) "2"
3) "3"

4. 和Hashes有关的命令

Hashes存储一系列键值对,Hashes适合存储对象,例如你可以将用户信息存储在Hashes中。

hmset/hmget 给Hashes key赋多个值/从Hashes中取多个值

> hmset user:1000 username antirez birthyear 1977 verified 1
OK
> hmget user:1000 username birthyear no-such-field
1) "antirez"
2) "1977"
3) (nil)

hget/hgetall,从Hashes中取一个值/所有值

> hget user:1000 birthyear
"1977"
> hgetall user:1000
1) "username"
2) "antirez"
3) "birthyear"
4) "1977"
5) "verified"
6) "1"

hincrby,增加field的值。

> hincrby user:1000 birthyear 10
(integer) 1987
> hincrby user:1000 birthyear 10
(integer) 1997

5. 和Set有关的命令

Set是一系列strings的集合,他们是无序的。

sadd/sismember/smembers,添加元素到Set/判断元素是否是Set的成员/获取Set所有成员。

> sadd myset 1 2 3
(integer) 3
> smembers myset
1. 3
2. 1
3. 2
> sismember myset 3
(integer) 1
> sismember myset 30
(integer) 0

sinter,取多个Set的交集

> sadd set1 1 2 3 4
(integer) 4
> sadd set2 2 4 5 7
(integer) 4 >sinter set1 set2
1) "2"
2) "4"

spop/srandmember/sunionstore/scard,从集合中随机取(不重复的)元素/从集合中随机取(可重复的)元素/将一个集合复制到另一个集合/取集合的基数(元素个数)

6. 和Sorted Set有关的命令

Sorted Set是一种介于set和hashes之间的数据结构,sorted set的元素不能重发,它存储了一个score和一个值,集合根据score排序,若score相等,则根据元素的字母顺序进行排序。

Sorted Set可以用来做两组对象之间的关联,比如要建立用户和部门之间的关联,可以将部门id作为score,用户id作为值存储在sorted set中。

zadd,添加元素到sorted set,可以一次添加多个元素

> zadd hackers 1940 "Hedy Lamarr" 1936 "Alan Turing" 1952 "Alex Hu"
(integer) 3

zrange/zrevrange,获取sorted set中的元素。/以倒序的方式获取sorted set中的元素。

> zrange hackers 0 -1
1) "Alan Turing"
2) "Hedy Lamarr"
3) "Alex Hu"

> zrevrange hackers 0 -1
1) "Alex Hu"
2) "Hedy Lamarr"
3) "alan Turing"
 

可以在这两个命令后加上withscores,显示score信息

> zrange hackers 0 -1
1) "Alan Turing"
2)1936
3) "Hedy Lamarr"
4) 1940
5) "Alex Hu"
6) 1952

zrangebyscore,根据score范围获取sorted set元素。下边命令获取生日小于1950的元素,-inf表示负无穷大。

> zrangebyscore hackers -inf 1950
1) "Alan Turing"
2) "Hedy Lamarr"
3) "Claude Shannon"
4) "Alan Kay"
5) "Anita Borg"

zremrangebyscore,根据score移除元素。一下命令移除出生日期为1940和1960的元素。

> zremrangebyscore hackers 1940 1960
(integer) 4

zrand/zrevrand,获取元素的位置。/已降序的方式获取元素的位置。

> zrank hackers "Anita Borg"
(integer) 4

从Redix 2.8开始,允许向sorted set中插入score相同,值不同的元素,这些元素因为score相同,所以根据值进行排序。

zrangebylex/zrevrangebylex/zrevrangebylex/zlexcount,这些命令分别是对字符排序的set进行操作的,故名思议,zrangebylex/zrevrangebylex是根据字符来获取sorted set中的元素。zrevrangebylex是根据字符来移除元素,zlexcount是获取元素的个数。

> zadd hackers 0 "Alan Kay" 0 "Sophie Wilson" 0 "Richard Stallman" 0
"Anita Borg" 0 "Yukihiro Matsumoto" 0 "Hedy Lamarr" 0 "Claude Shannon"
0 "Linus Torvalds" 0 "Alan Turing"
> zrangebylex hackers [B [P
1) "Claude Shannon"
2) "Hedy Lamarr"
3) "Linus Torvalds"
redis> ZADD myzset 0 a 0 b 0 c 0 d 0 e
(integer) 5
redis> ZADD myzset 0 f 0 g
(integer) 2

限于篇幅,还有一些Redis的命令这里未讲到,需要用时可以到这里http://redis.io/commands去查。

下一篇将介绍jedis框架,基于Java的Redis客户端。

Redis学习和应用记录(2)--常用数据类型及命令的更多相关文章

  1. redis学习-列表(list)常用命令

    redis学习-列表(list)常用命令   lpush:从列表左侧头部添加数据 rpush:从右侧尾部添加数据 lpop:从给左侧头部取出一个元素 rpop:从右侧尾部取出一个元素 lrange:取 ...

  2. Redis(四):常用数据类型和命令

    命令手册网址 http://doc.redisfans.com/ Redis数据类型 l String l Hash l List l Set l Sorted Set Redis中还有3种特殊的数据 ...

  3. MySQL学习之路3-MySQL中常用数据类型

    MySQL中常用数据类型 字符型 存储字符型数据.例如姓名,地址,电话号码等.使用引号括起来,一般使用单引号. 常用类型: char(255) 定长字符串,最大长度255个字符. varchar(25 ...

  4. 【数据库】Redis(2)--Redis的常用数据类型及命令

    1.Redis主要数据类型分类 Redis中存储数据常用的数据类型主要有五种:String.List.Set.Sorted Set.Hash,这五种数据结构在Redis中存储数据的命令掌握对于我们后期 ...

  5. Redis学习和应用记录(1)--介绍和安装

    Redis是一个开源的分布式缓存框架,它也常被理解为数据结构服务器,因为它包含丰富的数据类型,如strings, hashes, lists, sets, sorted sets, bitmaps a ...

  6. Redis的介绍和常用数据类型结构命令的总结

    我们先来看一下redis的一个定义,来自官方的: Redis is an open source, BSD licensed, advanced key-value store. It is ofte ...

  7. Redis学习笔记(三)常用命令整理

    Redis 常用命令 1.DEL key 删除key2.EXISTS key 检查key是否存在3.KEYS * 查看所有的key4.EXPIRE key seconds 设置key的过期时间5.TT ...

  8. Redis常用数据类型及命令

    Redis数据类型 Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合). 注意: 命令的关键词,如set ...

  9. Redis学习一 五种基本的数据类型

    首先一定要确保Redis是运行这的. 不知道为啥,我的电脑陪完服务以后,刚配完的时候好使,已重启就不行了,死活起不来. 好吧,这些暂时不是很重要. 运行 redis-server.exe 在开一个窗口 ...

随机推荐

  1. css3文字渐变无效果的解决方案

    现在css3越来月流行了,为了实现一些高大上的效果,我们会用一些渐变的特效,请看文字渐变的特效代码: .title { font-size: 60px; line-height: 80px; text ...

  2. Luogu P3797 妖梦斩木棒

    解题思路 用线段树做这个就不用说了吧,但是要维护的东西确实很神奇.在每一个节点上都维护一个$lbkt$,表示这个区间上最靠左的右括号的位置:一个$rbkt$,表示这个区间上最靠右的左括号的位置.还有一 ...

  3. python 使用time / datetime进行时间、时间戳、日期转换

    python 使用time 进行时间.时间戳.日期格式转换 #!/usr/bin/python3 # -*- coding: utf-8 -*- # @Time : 2017/11/7 15:53 # ...

  4. Python关于导入模块的一些感想:

    写项目的时候,碰到这种情况 程序业务为core,里面有两个目录,core1 和core2  core1中有三个模块,business  main   main1 程序入口为bin目录下的project ...

  5. 一篇入门Express

    目录 1.安装 2.Hello World 3.基础路由设置 4.高级路由设置 5.静态文件 6.中间件 7.生成器 1.安装 Express 是一个 基于 Node.js 的简洁灵活的 Web 应用 ...

  6. vue中路由

    关于每次点击链接都要刷新页面的问题众所周知,开发单页应用就是因为那丝般顺滑的体验效果,如果每次点击都会刷新页面… 出现这个的原因是因为使用了window.location来跳转,只需要使用使用rout ...

  7. PYGAME学习笔记_01

    01_使用PYGAME创建图形窗口 1.1_游戏的初始化和退出 pygame.init() 写入并初始化所有PYGAME模块,使用其他模块之前,必须先调用init方法 pygame.quit() 卸载 ...

  8. [bzoj3012][luogu3065][USACO12DEC][第一!First!] (trie+拓扑排序判环)

    题目描述 Bessie has been playing with strings again. She found that by changing the order of the alphabe ...

  9. Springboot 添加数据源报错

    报错信息如下: Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying be ...

  10. 管理Bean的生命周期

    [IOC容器中Bean的生命周期方法] 1.SpringIOC容器可以管理Bean的生命周期,Spring允许在Bean生命周期的特定点执行定制的任务. 2.Spring IOC容器对Bean的生命周 ...