redis的五种数据类型基本用法总结

944 阅读8分钟

简言之:

redis 是一个开源的,高性能的,基于键值对的缓存存储系统。通过提供多种键值数据类型来适应不同的场景下的缓存存储需求。同时redis的诸多高级功能使其可以胜任消息队列,任务队列等不同的角色。

数据类型和基本命令

字符串类型(String)

是redis最基本的类型,能存任何形式的字符串,包括二进制数据。一个string类型的key允许存储的最大容量是512MB,但劝你别这么干(存很大的数据),毕竟redis会把数据都加载到内存。

在这个键foo存一个bar值,或者更新foo里面的存的值为bar:

SET foo bar

获取这个foo里面的值, 你将得到字符串bar:

GET foo

当键值里面存的是数字,可以使用命令递增数字:

INCR foo

它返回的是递增以后的值。如果里面存的不是数字,会报错。

String类型应用场景示例:

  1. 访问量统计
  2. 生成自增id
  3. 存储其他你想存的字符串

其他命令:

增加指定的整数(返回增加后的值)

INCRBY key increment

减少指定的整数 && 减1(返回减少后的值)

DECRBY key decrement
DECR key

DECRBY key 5 和 INCRBY key -5的效果是一样的。

增加指定的浮点数(返回增加后的值)

INCRBYFLOAT key increment\

在键值尾部追加字符串(返回追加后的总长度)

APPEND key value

获取键值字符串长度

STRLEN key

同时设置 || 获得多个键值

MSET key1 value1 key2 value2
MGET key1 key2

散列类型(Hash)

如果我们存的数据有多个部分组成,比如标题,作者,正文。这时候用散列比较合适了。散列类型的键值是一种字典结构,其存储了字段和字段值的映射。一个散列类型键最多可以包含2^32-1个字段。技术上并不要求每个key存的字段都是一致的,如:key0里面存的字段是title,author; key1里面存的字段是content,title。

赋值&&取值

HSET key field1 value1
HGET key field1

同时设置 && 获取多个字段的值 && 获取所有字段和它们的值

HMSET key field1 value1 field2 value2
HMGET key field1 field2
HGETALL key

字段是否存在(不存在返回0,否则1):

HEXISTS key field

字段不存在时赋值(返回值与HEXISTS相反):

HSETNX key field value

增加数字(返回增加后的值):

HINCRBY key field increment

删除字段(返回被删的字段个数):

HDEL key field1 field2 ...

Hash应用场景示例

  1. 存储文章数据,或者别的多组成数据

其他命令:

只获取字段名 || 字段值

HKEYS key
HVALS key

获得字段数量

HLEN key

列表类型(List)

列表类型可以存储有序的字符串列表,常见的操作是向列表两端添加元素,或者获取列表的某个片段。它是由双向链表实现的,所以向两端添加元素的时间复杂度是O(1),获取越近两端的元素速度越快。这种特性使它能快速完成下面场景:如社交网站的新鲜事,我们只关心最新的内容,即使里面的数据几千万个,我们要找最新的100条也是很快的。一个列表类型的键最多能容纳2^32-1个元素。命令:

  1. 向列表两端增加元素:(返回增加后列表的长度)

LPUSH key value1 value2
RPUSH key value1 value2

  1. 从两端弹出元素:(返回弹出的元素)

LPOP key
RPOP key

  1. 获取列表中的元素的个数:(当key不存在返回0)

LLEN key

  1. 获得列表中的片段:(start,stop的全闭区间)

LRANGE key start stop

LRANGE支持负索引,-1表示最右边的元素,以此类推。

  1. 删除列表中指定的值:(返回删除元素的个数)

LREM key count value

将会删除列表中前count个值为value的元素。

  • 当count>0,将会删除列表中从左边开始,前count个值为value的元素
  • 当count<0,将会删除列表中从右边开始,前abs(count)个值为value的元素
  • 当count==0,将会删除列表中所有的,值为value的元素

List使用场景示例

  1. 文章id列表
  2. 评论列表
  3. 各种列表...

其他命令

  1. 获取 || 设置指定索引的元素值

LINDEX key index
LSET key index value

  1. 只保留列表的指定片段

LTRIM key start stop

  1. 向列表中插入元素

LINSERT key BEFORE|AFTER value1 value2

在列表中从左到右查找值为value1的元素,然后根据第二个参数before还是after来确定value2插在前面还是后面。

  1. 将元素从一个列表转到另一个列表

RPOPLPUSH source destination

从名字就可以看出它的功能:先从source列表类型键的右边弹出一个元素,然后将其加入到destination列表类型键的左边,并返回这个元素的值,整个过程是原子的。

集合类型(Set)

行为很像高中数学课教过的集合。它每个元素是不同的,且没有顺序,一个集合类型的键最多可以存2^32-1个字符串。redis集合内部是使用值为空的散列表实现的,所以向集合中加入元素,删除元素,判断元素是否存在,这些操作的时间复杂度都是O(1)。最方便的是多个集合之间可以取交集,并集,差集。

命令:

  1. 增加 && 删除元素(返回增加了多少个,删除了多少个)

SADD key value1 value2 ...
SREM key value1 value2 ...

  1. 获得集合中的所有元素

SMEMBERS key

  1. 判断元素是否在集合中(存在返回1,否则0)

SISMEMBER key value

  1. 取多个集合的差集

SDIFF key0 key1 key2 ...

这个例子的意思是:先求key0有而key1没有的元素集合keyTmp,然后再求keyTmp有而key2没有的元素集合。

  1. 取集合间的交集

SINTER key0 key1 key2 ...

求在三个几个都存在的元素集合。

  1. 取集合间的并集

SUNION key0 key1 key2 ...

Set使用场景示例

  1. 存储文章标签: 比如,使用键名为post:id:tags的键存储该篇文章的标签。但并没有使用到集合的优势,这儿也可以使用简单的字符串来存储标签。
  2. 通过标签搜索文章: 比如,使用键名为tag:标签名:postIds的集合类型的键存储文章id。 当我们需要找标签同时满足‘MySQL’和‘Java’, 那我们就可以用交集命令,飞快选出文章的id了。

其他命令

  1. 获得集合中元素的个数

SCARD key

  1. 进行集合运算并将结果存储

SDIFFSTORE destination key0 key1 key2 ...

将key0 key1 key2的差集存到destination键中。

SINTERSTORE destination key0 key1 key2 ...

将key0 key1 key2的交集存到destination键中。

SUNIONSTORE destination key0 key1 key2 ...

将key0 key1 key2的并集存到destination键中。

  1. 随机获得集合中的元素

SRANDMEMBER key [count]

  • 当count>0, 随机从集合中获得count个不同元素
  • 当count<0, 随机从集合中获得abs(count)个可能有重复的元素
  1. 从集合中随机弹出一个元素

SPOP key

有序集合类型(ZSet)

与Set的区别就是‘有序’二字。 在集合的基础上,有序集合为每个元素都关联了一个分数,这使得我们不仅可以完成插入删除,判断元素是否存在等操作,还可以获得分数最高(或最低)的前N个元素,获得指定分数范围内的元素等。元素是不同的,但是它们分数可以相同。

命令:

  1. 增加元素(返回增加的元素个数)

ZADD key score1 value1 score2 value2 ...

如果元素已经存在则会替换元素的分数。分数是整数或者浮点数。

  1. 获得元素的分数

ZSCORE key value

  1. 获得排名在某个范围的元素列表(全闭区间)

ZRANGE key start stop [WITHSCORES]
ZREVRANGE key start stop [WITHSCORES]

ZRANGE 命令会按照元素从小到大的顺序返回索引从start到stop之间的元素,加上WITHSCORES会返回分数。ZREVRANGE则是从大到小的顺序。

  1. 获得指定分数范围的元素列表(全闭区间)

ZRANGEBYSCORE key min max [WITHSCORES] [limit offset count]
ZREVRANGEBYSCORE key min max [WITHSCORES] [limit offset count]

按照分数从小到大的顺序,返回分数在min到max之间的元素。如果希望分数范围不包含端点值,可以这样:

ZRANGEBYSCORE key 80 (100

limit,offset的用法与SQL相同。即,在获得的元素基础上向后偏移offset个元素,并且只获取前count个。比如:

ZRANGEBYSCORE key 80 100 limit 1 3

ZREVRANGEBYSCORE则是从大到小的顺序。

  1. 增加某个元素的分数(返回更改后的分数)

ZINCRBY key increment value

ZSet使用场景示例

  1. 各种排行榜

其他命令

  1. 获得集合中元素的个数

ZCARD key

  1. 获得指定分数范围内的元素个数(全闭区间)

ZCOUNT key min max

要用开区间就用'('

  1. 删除一个或者多个元素(返回删除成功的数量)

ZREM key value1 value2 ...

  1. 按照排名范围删除元素(全闭区间,返回删除成功的数量)

ZREMRANGEBYRANK key start stop

按照从小到大的顺序,删除排名在start stop之间的元素,索引从0开始。

  1. 按照分数范围删除元素(全闭区间,返回删除成功的数量)

ZREMRANGEBYSCORE key min max

要开区间,则用'(',比如

ZREMRANGEBYSCORE key 80 (100

  1. 获得元素的排名

ZRANK key value
ZREVRANK key value

ZRANK从小到大,ZREVRANK从大到小,排名从0开始。