这一节主要介绍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. gson序列化后整形变浮点问题解决方案

    字段值是json格式的字符串.我需要将这个字段反序列化为List<Map>形式,但是在反序列化后,id变为了1.0. 百度了很多然并卵,最后改用了阿里的fastjson,没问题.(jack ...

  2. TWaver推智能手表挑战华为苹果

    2015年的春节刚过,苹果.华为.三星就紧锣密鼓的发布了各自新产品.华为.苹果的智能手表最吸引眼球.TWaver也不甘示弱,立刻连夜推出了更像传统奢侈豪华手表的TWaver Watch,予以反击.看来 ...

  3. Spring 中无处不在的 Properties

    转自:https://javadoop.com/post/spring-properties?hmsr=toutiao.io&utm_medium=toutiao.io&utm_sou ...

  4. vuecli开发项目,文件打包后,appjs/vendorjs文件过大

    项目上线后,浏览器第一次加载会特别特别慢,network中看到vendorjs文件1.9M,不慢才怪. echarts按需引入后,也有1.1M左右,由于对vue脚手架理解不深,自己扒了大量的文档,又测 ...

  5. <MySQL>入门二 增删改 DML

    -- DML语言 /* 数据操作的语言 插入:insert 修改:update 删除:delete */ 1.插入 -- 插入语句 /* 语法:insert into 表名(列名...) values ...

  6. Oracle学习总结(4)——MySql、SqlServer、Oracle数据库行转列大全

    MySql行转列 以id分组,把name字段的值打印在一行,逗号分隔(默认) select CustomerDrugCode,group_concat(AuditItemName) from noau ...

  7. 常州模拟赛d7t2 数组

    题目背景 HJZ 有很多玩具.他最喜欢玩的玩具是一个可以变化的数组. 题目描述 HJZ 的数组初始时有 n 个元素.他可以把一个位置上的数加上或减去一个固定的 数 x. 一天 LJZ 和 HZY 来 ...

  8. 一文教你用 Neo4j 快速构建明星关系图谱

    更多有趣项目及代码见于:DesertsX/gulius-projects 前言 本文将带你用 neo4j 快速实现一个明星关系图谱,因为拖延的缘故,正好赶上又一年的4月1日,于是将文中的几个例子顺势改 ...

  9. windows下如何正确使用Jconsole远程连接linux主机上的JVM

    https://www.aliyun.com/jiaocheng/589230.html

  10. MVC之查询demo

    上篇已经说过怎样建立MVC项目.这次主要讲述样例的实现. 其基本的功能就是从数据库中查询一些基本信息. 前边我们已经将实体引入到了项目中,这时Model目录中已经出现了我们建立的newsSystem. ...