本篇介绍Redis可以存储的5种数据结构以及常用的一些命令,部分内容摘抄自《Redis实战》,仅用作笔记。
Redis可以存储键与5种不同数据结构类型之间的映射,键是字符串,5种数据结构分别为STRING(字符串)、LIST(列表)、SET(集合)、HASH(散列)和ZSET(有序集合)。下表简单对比了这5种数据结构:
结构类型 | 结构存储的值 | 结构的读写能力 |
---|---|---|
STRING | 可以是字符串、整数或浮点数 | 对整个字符串或字符串的其中一部分执行操作;对整数和浮点数执行自增或自减操作 |
LIST | 一个链表,链表上的每个节点都包含了一个字符串 | 从链表的两端推入或弹出元素;根据偏移量对链表进行修剪(trim);读取单个或多个元素;根据值查找或移除元素 |
SET | 包含字符串的无序收集器,并且被包含的每个字符串都是独一无二的 | 添加、获取、移除单个元素;检查一个元素是否存在于集合中;计算交集、并集、差集;从集合里随机获取元素 |
HASH | 包含键值对的无序散列表 | 添加、获取、移除单个键值对;获取所有键值对 |
ZSET | 字符串成员与浮点数分值之间的有序映射,元素的排列顺序由分值的大小决定 | 添加、获取、删除单个元素;根据分值范围或者成员获取元素 |
字符串
Redis的字符串就是一个由字节组成的序列,它们和Java里的字符串并没有什么明显的不同。字符串可以存储包括字符串、整数和浮点数在内的3种类型的值,而存储了整数或者浮点数的字符串可以执行自增或自减操作,在有需要的时候,Redis还会将整数转换为浮点数。
Redis中操作字符串常用的命令如下:
命令 | 用例 | 描述 |
---|---|---|
SET | SET key value | 设置存储在给定键中的值 |
GET | GET key | 获取存储在给定键中的值 |
DEL | DEL key | 删除存储在给定键中的值,适用于所有类型 |
INCR | INCR key | 将键存储的值加1 |
DECR | DECR key | 将键存储的值减1 |
INCRBY | INCRBY key amount | 将键存储的值加上整数amount |
DECRBY | DECRBY key amount | 将键存储的值减去整数amount |
INCRBYFLOAT | INCRBYFLOAT key amount | 将键存储的值加上浮点数amount |
当我们将一个值存储到Redis字符串里时,如果这个值可以被解释为十进制整数或浮点数,那么Redis允许我们对这个字符串进行各种自增自减操作;如果对一个不存在的键或一个保存了空串的键执行自增或自减操作,那么Redis再执行操作时会将这个键的值当作是0来处理并且存储键值(键不存在时);如果尝试对一个值无法被解释为整数或者浮点数的字符串执行自增和自减操作时,Redis会返回一个错误。
列表
Redis中的列表结构可以有序地存储多个字符串,除了允许用户从序列的两端推入或弹出元素、获取列表元素以及执行常见的列表操作外,还可以用来存储任务信息、最近浏览过的文章或常用联系人信息等。
Redis操作列表的常用命令如下:
命令 | 用例 | 描述 |
---|---|---|
RPUSH | RPUSH list-key value... | 将给定一个或多个值推入指定列表的右端 |
LRANGE | LRANGE list-key index1 index2 | 获取列表在给定范围上的所有值,当index1为0,index2为-1时可以获取列表所有值 |
LINDEX | LINDEX list-key index | 获取列表在给定位置上的单个元素 |
LPOP | LPOP list-key | 从列表的左端弹出一个值,并返回被弹出的值 |
LPUSH | LPUSH list-key value... | 将给定一个或多个值推入指定列表的左端 |
RPOP | RPOP list-key | 从列表右端弹出一个值,并返回被弹出的值 |
LTRIM | LTRIM list-key start end | 对列表进行修剪,只保留从偏移量start到偏移量end范围内的元素,start和end的元素也会被保留 |
列表的一个主要优点在于它可以包含多个字符串值,这使得用户可以将数据集中在同一个地方。Redis的集合也提供了与列表类似的特性,但集合只能保存各不相同的元素。
集合
Redis的集合以无序的方式来存储多个各不相同的元素,用户可以快速地对集合执行添加元素操作、移除元素操作以及检查一个元素是否存在于集合里。也因为集合是无序的,因此我们不能像使用列表那样,将元素推入集合某一端,或者从某一端弹出元素。
Redis操作集合的常用命令如下:
命令 | 用例 | 描述 |
---|---|---|
SADD | SADD set-key value | 将给定元素添加到指定集合中 |
SMEMBERS | SMEMBERS set-key | 返回集合包含的所有元素 |
SISMEMBER | SISMEMBER set-key value | 检查给定元素是否存在于集合中 |
SREM | STRM set-key value | 如果给定的元素存在于这个集合中,那么移除这个元素 |
SCADD | SCADD set-key | 返回集合包含的元素数量 |
SRANDMEMBER | SRANDMEMBER set-key[count] | 从集合里随机返回一个或多个元素 |
SPOP | SPOP set-key | 随机移除集合中的一个元素,并返回被移除的元素 |
SMOVE | SMOVE source-key dest-key item | 如果集合source-key包含元素item,那么从集合source-key中移除元素item,并将元素item添加到集合dest-key中;如果item被成功移除,则返回1,否则返回0 |
SDIFF | SDIFF set-key set key set-key... | 返回存在于第一个集合,但不存在于其他集合中的元素,即差集运算 |
SDIFFSTORE | SDIFFSTORE dest-key set-key set-key... | 将存在于第一个集合但不存在于其他集合中的元素存储到dest-key键里 |
SINTER | SINTER set-key set-key... | 返回那些同时存在于所有集合中的元素,即交集运算 |
SINTERSTORE | SINTERSTORE dest-key set-key set-key... | 将同时存在于所有集合的元素存储到dest-key键里 |
SUNION | SUNION set-key set-key... | 返回至少存在于一个集合中的元素,即并集运算 |
SUNIONSTORE | SUNION dest-key set-key set-key... | 将至少存在于一个集合中的元素存储到dest-key键里 |
散列
Redis的散列可以存储多个键值对之间的映射。与字符串一样,散列存储的值既可以是字符串也可以是数字值,并且用户可以对散列存储的数字值执行自增操作或自减操作。散列可以让我们将多个值存储到一个Redis里面,非常适用于将一些相关的数据存储在一起。我们可以把这种数据聚集看作是关系数据库中的行。
Redis操作散列的常用命令如下:
命令 | 用例 | 描述 |
---|---|---|
HSET | HSET hash-key sub-key value | 在散列里关联起给定的键值对 |
HGET | HGET hash-key sub-key | 获取指定散列键的值 |
HGETALL | HGETALL hash-key | 获取散列包含的所有键值对 |
HDEL | HDEL hash-key sub-key | 如果给定键存在于散列里,那么移除这个键 |
HEXISTS | HEXISTS hash-key sub-key | 检查给定键是否存在于散列中 |
HKEYS | HKEYS hash-key | 获取散列包含的所有键 |
HVALS | HVALS hash-key | 获取散列包含的所有值 |
HINCRBY | HINCRBY hash-key sub-key amount | 将键sub-key存储的值加上整数amount |
HINCRBYFLOAT | HINCRBYFLOAT hash-key sub-key amount | 将键key存储的值加上浮点数amount |
在对散列进行处理的时候,如果键值对的值的体积非常庞大,那么我们可以先使用HKEYS获取散列的所有值,然后通过只获取必要的值来减少需要传输的数据量。
有序集合
有序集合和散列一样,都用于存储键值对。有序集合的键被称为成员(member),每个成员都是各不相同的;有序集合的值被称为分值(score),分值必须为浮点数。有序集合是Redis里唯一一个既可以根据成员访问元素,又可以根据分值以及分值的排列顺序访问元素的结构。
Redis操作有序集合的常用命令如下:
命令 | 用例 | 描述 |
---|---|---|
ZADD | ZADD zset-key score member... | 将带有给定分值的成员添加到有序集合中 |
ZRANGE | ZRANGE zset-key start end [WITHSCORES] | 返回有序集合中排名介于start和end之间的成员,如果给定了可选的WHTISCORS选项,那么命令将成员的分值也一并返回 |
ZREM | ZREM zset-key member... | 从有序集合中移除给定的成员,并返回被移除成员的数量 |
ZCARD | ZCARD zset-key | 返回有序集合包含的成员数量 |
ZINCRBY | ZINCEBY zset-key amount member | 将member成员的分值加上amount |
ZCOUNT | ZCOUNT zset-key min max | 返回分值介于min和max之间的成员数量 |
ZRANK | ZRANK zset-key member | 返回成员member在有序集合中的排名 |
ZSCORE | ZSCORE zset-key member | 返回成员member的分值 |
如果我们需要某些上面没提到的命令,可以在这个地方根据数据类型以及功能查找。