目录

字符串(String)

        类型介绍

        应用场景

        操作指令

散列(hashes)

        类型介绍

        应用场景

        操作指令

列表(list)

        类型介绍

        应用场景

        操作指令

集合(sets)

        类型介绍

        应用场景

        操作指令

有序集合(sorted set)

        类型介绍

        应用场景

        操作指令


字符串(String)

        类型介绍

  • 字符串是Redis最简单的储存类型,可以存储字符串、整数、浮点数
  • 可以对整个字符串或者字符串中的一部分进行操作
  • 可以对整数或者浮点数进行自增或者自减操作
  • Redis的字符串是一个由字节组成的序列,跟Java里的ArrayList有点类似,采用预分配冗余空间的方式来减少内存的频繁分配,内部为当前字符串实际分配的空间,一般要高于实际字符串长度。
  • 当字符串长度小于1M时,扩容都是加倍现有的空间;如果超过1M,扩容时一次只会多扩1M的空间。(字符串最大长度为512M)

        应用场景

  • 主要运用于数据缓存,存储热点数据,提高查询性能。例如,存储登录用户信息、商品详情信息
  • 计数器。例如,页面的播放量,一个IP被访问了多少次。(Redis是单线程架构,可以保证数据的正确性)

        操作指令

redis字符串操作指令

序号

命令

描述

1

SET key value

设置指定 key 的值

2

GET key

获取指定 key 的值。

3

GETRANGE key start end

返回 key 中字符串值的子字符

4

GETSET key value

将给定 key 的值设为 value ,并返回 key 的旧值(old value)。

5

GETBIT key offset

对 key 所储存的字符串值,获取指定偏移量上的位(bit)。

6

MGET key1 [key2..]

获取所有(一个或多个)给定 key 的值。

7

SETBIT key offset value

对 key 所储存的字符串值,设置或清除指定偏移量上的位(bit)。

8

SETEX key seconds value

将值 value 关联到 key ,并将 key 的过期时间设为 seconds (以秒为单位)。

9

SETNX key value

只有在 key 不存在时设置 key 的值。

10

SETRANGE key offset value

用 value 参数覆写给定 key 所储存的字符串值,从偏移量 offset 开始。

11

STRLEN key

返回 key 所储存的字符串值的长度。

12

MSET key value [key value ...]

同时设置一个或多个 key-value 对。

13

MSETNX key value [key value ...]

同时设置一个或多个 key-value 对,当且仅当所有给定 key 都不存在。

14

PSETEX key milliseconds value

这个命令和 SETEX 命令相似,但它以毫秒为单位设置 key 的生存时间,而不是像 SETEX 命令那样,以秒为单位。

15

INCR key

将 key 中储存的数字值增一。

16

INCRBY key increment

将 key 所储存的值加上给定的增量值(increment) 。

17

INCRBYFLOAT key increment

将 key 所储存的值加上给定的浮点增量值(increment) 。

18

DECR key

将 key 中储存的数字值减一。

19

DECRBY key decrement

key 所储存的值减去给定的减量值(decrement) 。

20

APPEND key value

如果 key 已经存在并且是一个字符串, APPEND 命令将指定的 value 追加到该 key 原来值(value)的末尾。

散列(hashes)

        类型介绍

  • 散列相当于Java中的HashMap,内部时无序字典。实现原理与HashMap一致。一个哈希表有多个节点,每个节点保存一个键值对。
  • 与Java中的HashMap不同的时,rehash的方式不一样,因为Java的HashMap在字典很大时,rehash是个耗时的操作,需要一次性rehash。Redis为了提高性能,不能堵塞服务,采用了渐进式rehash策略。
  • 渐进式rehash会在rehash的同时,保留新旧两个hash结构,查询时会同时查询两个hash结构,然后在后续的定时任务中以及hash操作指令中,循序渐进地将旧hash的内容一点点迁移到新的hash结构中。当迁移完成后,就会使用新的hash结构取而代之。
  • 当hash移除掉最后一个元素后,该数据结构自动被删除,内存被回收。

        应用场景

  • 可以用于对象存储。例如,存储用户信息。
  • 字符串也可以存储对象信息,但是需要将对象进行序列化(比如json序列化)之后才能报讯,而Hash则可以将用户对象的每个字段单独存储,这样就能节省序列化和反序列化的时间

        操作指令

redis哈希操作指令

序号

命令及描述

描述

1

HDEL key field1 [field2]

删除一个或多个哈希表字段

2

HEXISTS key field

查看哈希表 key 中,指定的字段是否存在。

3

HGET key field

获取存储在哈希表中指定字段的值。

4

HGETALL key

获取在哈希表中指定 key 的所有字段和值

5

HINCRBY key field increment

为哈希表 key 中的指定字段的整数值加上增量 increment 。

6

HINCRBYFLOAT key field increment

为哈希表 key 中的指定字段的浮点数值加上增量 increment 。

7

HKEYS key

获取所有哈希表中的字段

8

HLEN key

获取哈希表中字段的数量

9

HMGET key field1 [field2]

获取所有给定字段的值

10

HMSET key field1 value1 [field2 value2 ]

同时将多个 field-value (域-值)对设置到哈希表 key 中。

11

HSET key field value

将哈希表 key 中的字段 field 的值设为 value 。

12

HSETNX key field value

只有在字段 field 不存在时,设置哈希表字段的值。

13

HVALS key

获取哈希表中所有值。

14

HSCAN key cursor [MATCH pattern] [COUNT count]

迭代哈希表中的键值对。

列表(list)

        类型介绍

  • list相当于Java中的LinkedList,实现原理是一个双向链表(其实底层是一个快速列表),即可以支持反向查找和便利,方便操作。插入和删除操作更快,时间复杂度为O(1),但是索引定位比较慢,时间复杂度为O(n)。

        应用场景

  • 消息队列。(已经存在成熟的Kafka、RabbitMQ等消息队列技术,所以不推荐使用)
    list类型的lpop和rpush(或者lpush和rpop)能实现队列的功能,所以可以使用Redis的list类型实现简单的点对点消息队列。
  • 排行榜。
    list类型的lrange命令可以分页查看队列中的数据。可将每隔一段时间计算一次的排行榜存储在list类型中。只有定时计算的排行榜才适合存储在list中
  • 最新列表
    list类型的lpush命令和lrange命令能实现最新列表的功能,每次通过lpush命令往列表里插入新的元素,然后通过lrange命令读取最新的元素列表,如朋友圈的点赞列表、评论列表。
  • 实时列表推荐使用sorted set

        操作指令

redis列表操作指令

序号

命令及描述

描述

1

BLPOP key1 [key2 ] timeout

移出并获取列表的第一个元素, 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。

2

BRPOP key1 [key2 ] timeout

移出并获取列表的最后一个元素, 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。

3

BRPOPLPUSH source destination timeout

从列表中弹出一个值,将弹出的元素插入到另外一个列表中并返回它; 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。

4

LINDEX key index

通过索引获取列表中的元素

5

LINSERT key BEFORE|AFTER pivot value

在列表的元素前或者后插入元素

6

LLEN key

获取列表长度

7

LPOP key

移出并获取列表的第一个元素

8

LPUSH key value1 [value2]

将一个或多个值插入到列表头部

9

LPUSHX key value

将一个值插入到已存在的列表头部

10

LRANGE key start stop

获取列表指定范围内的元素

11

LREM key count value

移除列表元素

12

LSET key index value

通过索引设置列表元素的值

13

LTRIM key start stop

对一个列表进行修剪(trim),就是说,让列表只保留指定区间内的元素,不在指定区间之内的元素都将被删除。

14

RPOP key

移除列表的最后一个元素,返回值为移除的元素。

15

RPOPLPUSH source destination

移除列表的最后一个元素,并将该元素添加到另一个列表并返回

16

RPUSH key value1 [value2]

在列表中添加一个或多个值

17

RPUSHX key value

为已存在的列表添加值

集合(sets)

        类型介绍

  • 集合类似于Java中的HashSet,内部实现是一个value永远为null的HashMap,实际就是通过计算hash的方式来快速排重的,这也是set能提供一个成员是否在集合内的原因。

        应用场景

  • 好友/关注/粉丝/感兴趣的人集合 set类型唯一的特点使得其适合用于存储好友/关注/粉丝/感兴趣的人集合,集合中的元素数量可能很多,每次全部取出来成本不小,set类型提供了一些很实用的命令用于直接操作这些集合,如
        a. sinter命令可以获得A和B两个用户的共同好友
            b. sismember命令可以判断A是否是B的好友
            c. scard命令可以获取好友数量
            c. 关注时,smove命令可以将B从A的粉丝集合转移到A的好友集合
  • 随机展示
    set类型适合存放所有需要展示的内容,而srandmember命令则可以从中随机获取几个。
  • 黑名单/白名单
    经常有业务出于安全性方面的考虑,需要设置用户黑名单、ip黑名单、设备黑名单等,set类型适合存储这些黑名单数据,sismember命令可用于判断用户、ip、设备是否处于黑名单之中。

        操作指令

redis集合操作指令

序号

命令及描述

描述

1

SADD key member1 [member2]

向集合添加一个或多个成员

2

SCARD key

获取集合的成员数

3

SDIFF key1 [key2]

返回第一个集合与其他集合之间的差异。

4

SDIFFSTORE destination key1 [key2]

返回给定所有集合的差集并存储在 destination 中

5

SINTER key1 [key2]

返回给定所有集合的交集

6

SINTERSTORE destination key1 [key2]

返回给定所有集合的交集并存储在 destination 中

7

SISMEMBER key member

判断 member 元素是否是集合 key 的成员

8

SMEMBERS key

返回集合中的所有成员

9

SMOVE source destination member

将 member 元素从 source 集合移动到 destination 集合

10

SPOP key

移除并返回集合中的一个随机元素

11

SRANDMEMBER key [count]

返回集合中一个或多个随机数

12

SREM key member1 [member2]

移除集合中一个或多个成员

13

SUNION key1 [key2]

返回所有给定集合的并集

14

SUNIONSTORE destination key1 [key2]

所有给定集合的并集存储在 destination 集合中

15

SSCAN key cursor [MATCH pattern] [COUNT count]

迭代集合中的元素

有序集合(sorted set)

        类型介绍

  • 有序集合是Redis类似于SortedSet和HashMap的结合体,一方面它是一个set,保证了内部value的唯一性,另一方面它可以给每个value赋予一个score,代表整个value的排序权重。
  • 内部使用HashMap和跳跃表(SkipList)来保证数据的存储和有序。HashMap里存放的是成员到score的映射,而跳跃表里存放的是所有的成员,排序依据是HashMap里村的score,使用跳跃表的结构可以获得比较搞的查找效率,并且在实现上比较简单。
  • scorted sets中最后一个value被移除后,数据结构自动删除,内存被回收。

        应用场景

  • 排行榜:有序集合经典使用场景。
    例如视频网站需要对用户上传的视频做排行榜,榜单维护可能是多方面:按照时间、按照播放量、按照获得的赞数等。
  • 用Sorted Sets来做带权重的队列
    比如普通消息的score为1,重要消息的score为2,然后工作线程可以选择按score的倒序来获取工作任务。让重要的任务优先执行。

        操作指令

redis有序集合操作指令

序号

命令及描述

描述

1

ZADD key score1 member1 [score2 member2]

向有序集合添加一个或多个成员,或者更新已存在成员的分数

2

ZCARD key

获取有序集合的成员数

3

ZCOUNT key min max

计算在有序集合中指定区间分数的成员数

4

ZINCRBY key increment member

有序集合中对指定成员的分数加上增量 increment

5

ZINTERSTORE destination numkeys key [key ...]

计算给定的一个或多个有序集的交集并将结果集存储在新的有序集合 destination 中

6

ZLEXCOUNT key min max

在有序集合中计算指定字典区间内成员数量

7

ZRANGE key start stop [WITHSCORES]

通过索引区间返回有序集合指定区间内的成员

8

ZRANGEBYLEX key min max [LIMIT offset count]

通过字典区间返回有序集合的成员

9

ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT]

通过分数返回有序集合指定区间内的成员

10

ZRANK key member

返回有序集合中指定成员的索引

11

ZREM key member [member ...]

移除有序集合中的一个或多个成员

12

ZREMRANGEBYLEX key min max

移除有序集合中给定的字典区间的所有成员

13

ZREMRANGEBYRANK key start stop

移除有序集合中给定的排名区间的所有成员

14

ZREMRANGEBYSCORE key min max

移除有序集合中给定的分数区间的所有成员

15

ZREVRANGE key start stop [WITHSCORES]

返回有序集中指定区间内的成员,通过索引,分数从高到低

16

ZREVRANGEBYSCORE key max min [WITHSCORES]

返回有序集中指定分数区间内的成员,分数从高到低排序

17

ZREVRANK key member

返回有序集合中指定成员的排名,有序集成员按分数值递减(从大到小)排序

18

ZSCORE key member

返回有序集中,成员的分数值

19

ZUNIONSTORE destination numkeys key [key ...]

计算给定的一个或多个有序集的并集,并存储在新的 key 中

20

ZSCAN key cursor [MATCH pattern] [COUNT count]

迭代有序集合中的元素(包括元素成员和元素分值)