一、Redis 五种类型

1、String(字符串类型)

2、Hash(哈希类型)

3、List(列表类型)

4、Set(集合类型)

5、Zset(有序集合类型)

二、操作

1、String类型是Redis中最简单的数据结构。

它既可以存储文字(例如"hello world"),又可以存储数字(例如整数10086和浮点数3.14),还可以存储二进制数据(例如10010100)。

  1. 设值:SET Key Value [EX seconds]

将Key键设置成指定的Value值。

如果Key键已经存在,并且保存旧值的话,旧的值会被覆盖,不论旧的类型是否为String都会被忽略掉。如果Key键不存在,那么会在数据库中添加一个Key键,保存的Value值就是刚刚设置的新值。

[EXseconds]选项表示Key键过期的时间,单位为秒。如果不加设置,表示Key键永不过期。

  1. 批量设值:MSET Key Value[Key Value …]

一次性设置多个Key-Value(键-值对)。

相当于同时调用多次SET命令。操作是原子的。所有的Key键都一次性设置的。

同时运行两个MSET来设置相同的Key键,那么操作的结果也只会是两次MSET中后一次的结果,而不会是混杂的结果。

  1. 批量添加:MSETNX Key Value [Key Value…]

一次性添加多个Key-Value(键-值对)。

如果任何一个Key键已经存在,那么这个操作都不会执行。

使用MSETNX时,要么全部Key键被添加,要么全部不被添加。这个命令在MSET命令后面增加了一个后缀NX(if Not eXist),表示只有Key键不存在的时候,才会设置Key键的Value值。

  1. 获取:GET Key

使用GET命令,可以取得单个Key键所绑定的String值。

  1. 批量获取:MGET Key[Key…]

前缀M,表示多个(Multi)。

使用MGET命令一次性获取多个Value值,和GET命令取得单个比较优点主要在于减少网络传输的次数,提升了性能。

  1. 获取长度:STRLEN Key

Key键对应的String的长度,Key键对应的不是String,则报错。

Key键不存在,则返回0。

  1. 为Key键对应的整数Value值增加1:INCR Key
  2. 为Key键对应的整数Value值减少1:DECR Key
  3. 为Key键对应的整数Value值增加increment:INCRBY Keyincrement
  4. 为Key键对应的浮点数Value值增加increment:INCRBYFLOAT Key increment

Redis并没有为浮点数Value值减少decrement的操作DECRBYFLOAT。

要为浮点数Value值减少decrement,只需要把INCRBYFLOAT命令的increment设成负值即可。

设置为1.0 + 10.01 - 5.0
> set root 1.0
> incrbyfloat root 10.01
> incrbyfloat root -5。0

2、List列表

a) 基于双向链表实现的,可以支持正向、反向查找和遍历。List列表是简单的字符串列表,字符串按照添加的顺序排序。

b) 可以添加一个元素到List列表的头部(左边)或者尾部(右边)。一个List列表最多可以包含232-1个元素(最多可超过40亿个元素)。

c) 典型应用场景:网络社区中最新的发帖列表、简单的消息队列、最新新闻的分页列表、博客的评论列表、排队系统等等。

d) 例子:在“双11”秒杀、抢购这样的大型活动中,短时间内有大量的用户请求发向服务器,而后台的程序不可能立刻响应每一个用户的请求,有什么好的办法来解决这个问题呢?我们需要一个排队系统。根据用户的请求时间,将用户的请求放入List队列中,后台程序依次从队列中获取任务,处理并将结果返回到结果队列。换句话说,通过List队列,可以将并行的请求转换成串行的任务队列,之后依次处理。总体来说,List队列的使用场景,是非常多的。

  1. 右推入(后推入):RPUSH Key Value [Value …]

a) 将一个或多个的Value值依次推入到列表的尾部(右端)。如果Key键不存在,那么RPUSH之前会先自动创建一个空的List列表。如果Key键的Value值不是一个List类型,则会返回一个错误。

b) 如果同时RPUSH多个Value值,则多个Value值会依次从尾部进入List列表。RPUSH命令的返回值为操作完成后List包含的元素量

c) RPUSH时间复杂度为O(N),只推入一个值,那么命令的复杂度为O(1)。

2)左推入(前推入):LPUSH Key Value [Value …]

从List列表的==头部(左侧)==推入的

  1. 左弹出:LPOP Key

a) PUSH操作是增加元素;而POP操作,则是获取元素并删除。

b) LPOP命令是从List队列的左边(前端),获取并移除一个元素,复杂度O(1)。如果List列表为空,则返回nil。

  1. 右弹出:RPOP key

从队列的==右边(后端)==获取并移除一个元素

  1. 获取列表的长度:LLEN Key
  2. 获取列表指定位置上的元素:LINDEX Key index

7)获取指定索引范围之内的所有元素:LRANGE Key startstop

8)设置指定索引上的元素:LSET Key index Value

> del root
> rpush root a b c d e f
> llen
> lrange root 0 4
> lindex root 3
> lindex root -1

List列表的下标是从0开始的,index为负的时候是从后向前数。-1表示最后一个元素。当下标超出边界时,会返回nil

3、Hash哈希表

a) 是一个String类型的Field字段和Value值之间的映射表,类似于Java中的HashMap。

b) 一个哈希表由多个字段-值对(Field-Value Pair)组成,Value值可以是文字、整数、浮点数或者二进制数据。

c) 在同一个Hash哈希表中,每个Field字段的名称必须是唯一的(Java中HashMap的Key键的规范要求)

  1. 设置字段-值:HSET Key Field Value

给Field字段设置Value值。如果Field字段之前没有设置值,那么命令返回1;如果Field字段已经有关联值,那么命令用新值覆盖旧值,并返回0。

  1. 获取字段-值:HGET Key Field

返回Key Field字段所关联的Value值。如果Field字段没有关联Value值,那么返回nil

  1. 检查字段是否存在:HEXISTS Key Field

查看指定Field字段是否存在:存在则返回1,不存在则返回0。

  1. 删除给指定的字段:HDEL Key Field [Field …]

删除一个或多个指定Field字段,以及那些Field字段所关联的值。不存在的Field字段将被忽略。命令返回被成功删除的Field-Value对的数量。

  1. 查看指定的Field字段是否存在:HEXISTS Key Field
  2. 获取所有的Field字段:HKEYS Key
  3. 获取所有的Value值:HVALS Key
> del root
> hset config ip 127.0.0.1
> hset config port 8080
> hset config maxalive 5080
> hkeys config
> hvals config
> hexists config timeout
  1. 哈希表优:方便管理、能够避免键名冲突、并且还能够节约内存

a) 将数据集中存放。通过Hash哈希表,可以将一些相关的信息存储在同一个缓存Key键中,不仅方便了数据管理,还可以尽量避免误操作的发生。

b) 避免键名冲突使用哈希键来存储“键-值对”数据。

c) 减少Key键的内存占用。保存相同数量的“键-值对”信息,使用哈希键比使用字符串键更节约内存。

d) 创建一个Key键都带有很多的附加管理信息(例如这个Key键的类型、最后一次被访问的时间等),缓存的Key键越多,耗费的内存就越多,花在管理数据库Key键上的CPU也会越多。

4、 Set集合

a) 列表:特殊之处在于它是可以自动去掉重复元素的。

b) Set集合类型的使用场景是:当需要存储一个列表,而又不希望有重复的元素(例如ID的集合)时,使用Set是一个很好的选择。并且Set类型拥有一个命令,它可用于判断某个元素是否存在,而List类型并没有这种功能的命令。

c) 通过Set集合类型的命令可以快速地向集合添加元素,或者从集合里面删除元素,也可以对多个Set集合进行集合运算,例如并集、交集、差集。

  1. 添加元素:SADD Key member1 [member2 ……]

添加一个或多个成员

  1. 移除元素:SREM Key member1[member2……]

移除一个或多个成员

  1. 判断某个元素:SISMEMBER Key member

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

> del root
> sadd root user1
> sadd root user2 user3 user4 user5
> srem root uer4
> sismember root user1
  1. 获取集合的成员数:SCARD Key
  2. 获取集合中的所有成员:SMEMBERS Key
> scard root
> smembers root

5、Zset有序集合

a) Zset和Set使用场景类似,区别是有序集合会根据提供的score参数来进行自动排序。当需要一个不重复的且有序的集合列表,那么就可以选择Zset有序集合类型,常用案例:排行榜。

b) Zset有序集合和Set集合不同的是,有序集合的每个元素,都关联着一个分值(Score),这是一个浮点数格式的关联值。Zset有序集合会按照分值(Score),按从小到大的顺序来排列有序集合中的各个元素。

  1. 添加成员:ZADD Key Score1 member1 [ScoreNmemberN…]

添加一个或多个成员。如果memberN已经存在,则更新已存在成员的分数。

  1. 移除元素:ZREM Key member1[memberN……]

移除一个或多个成员

  1. 取得分数:ZSCORE Key member

取得member成员的分数值

  1. 取得成员排序:ZRANK Key member

取得member成员的分数值的排名

  1. 成员加分:ZINCRBY Key Score member

对指定成员的分数加上增量Score

  1. 区间获取:ZRANGEBYSCORE Key min max[WITHSCORES] [LIMIT]

获取指定分数区间范围内的成员。

WITHSCORES表示带上分数值返回;LIMIT选项,类似与mysql查询的limit选项,有offset、count两个参数值,表示返回的偏移量和成员数量。

在默认情况下,min和max表示的范围,是闭区间范围,而不是开区间范围,即min ≤ score≤ max内的成员将被返回。

可以使用-inf和+inf分别表示有序集合中分数的最小值和最大值。

  1. 获取成员数:ZCARD Key

8)区间计数:ZCOUNT Key min max

计算指定区间分数的成员数

> del root
> zadd salary 1000 user1
> zadd salary 2000 user2
> zadd salary 3000 user3
> zadd salary 4000 user4
> type salary
> zrank salary user4
> zrank salary user2
> zrangebyscore salary 3000 +inf