一、String 类型

1.1 介绍

String 类型,也就是字符串类型,是 Redis 中最简单的存储类型。其 value 是字符串,不过根据字符串的格式不同,又可以分为 3 类:

  • string:普通字符串
  • int:整数类型,可以做自增、自减操作
  • float:浮点类型,可以做自增、自减操作

不管是哪种格式,底层都是字节数组形式存储,只不过是编码方式不同。字符串类型的最大空间不能超过 512M。

key value
msg hello world
num 10
score 92.5

1.2 String 类型的常见命令

String 的常见命令有:

  • SET:添加或者修改已经存在的一个 String 类型的键值对
  • GET:根据 key 获取 String 类型的 value
  • MSET:批量添加多个 String 类型的键值对
  • MGET:根据多个 key 获取多个 String 类型的 value
  • INCR:让一个整型的 key 自增 1
  • INCRBY:让一个整型的 key 自增并指定步长,例如:incrby num 2 让 num 值自增 2
  • INCRBYFLOAT:让一个浮点类型的数字自增并指定步长
  • SETNX:添加一个 String 类型的键值对,前提是这个 key 不存在,否则不执行
  • SETEX:添加一个 String 类型的键值对,并且指定有效期

1.2.1 APPEND 命令

使用 APPEND 命令时,如果 key 已经存在,则会直接在 value 后追加值,如果 key 不存在,则会先创建一个 value 为空字符串的 key,然后再追加:

1.2.2 DECR 命令

DECR 命令可以实现对 value 的减 1 操作,如果 key 不存在,则 key 对应的初始值会被置为 0,如果 key 的value 不为数字,则会报错,如下:

1.2.3 DECRBY 命令

DECRBY 和 DECR 类似,不同的是 DECRBY 可以指定步长,如下:

1.2.4 GET 命令

GET 命令用来获取对应 key 的 value,如果 key 不存在则返回 nil,如下:

1.2.5 GETRANGE 命令

GETRANGE 用来返回 key 所对应的 value 的子串,子串由 start 和 end 决定,从左往右计算,如果下标是负数,其中 -1 表示最后一个字符,-2 表示倒数第二个…,如下:

1.2.6 GETSET

GETSET 命令可以用来获取 key 所对应的 value,并对 key 进行重置,如下:

1.2.7 INCR 命令

INCR 操作可以对指定的 key 的 value 执行加 1 操作,如果 指定的 key 不存在,那么在加 1 操作之前,会先将 key 的 value 设置为 0,如果 key 的 value 不是数字,则会报错,如下:

1.2.8 INCRBY 命令

INCRBY 和 INCR 功能类似,不同的是 INCRBY 可以指定增长的步长,如下:

1.2.9 INCRBYFLOAT 命令

INCRBYFLOAT 命令可以用来增长浮点数,如下:

1.2.10 MGET 与 MSET 命令

1.2.11 SETEX 命令

SETEX 用来给 key 设置 value,同时设置过期时间,等效于先给 key 设置 value,再给 key 设置过期时间,如下:

1.2.12 PSETEX 命令

PSETEX 的作用和 SETEX 类似,不同的是,这里设置过期时间的单位是毫秒,如下:

1.2.13 SETNX 命令

SETNX 是 SET if Not eXists 的简写,SET 命令在执行时,如果 key 已经存在,则新值会覆盖掉旧值,而对于 SETNX 命令,如果 key 已经存在,则不做任何操作,如果 key 不存在,则效果等同于 SET 命令。如下:

1.2.14 MSETNX 命令

MSETNX 兼具了 SETNX 和 MSET 的特性,但是 MSETNX 在执行时,如果有一个 key 存在,则所有的都不会执行,如下:

因为 k1 已经存在,所以 k2 也没执行成功。

1.2.15 SETRANGE 命令

SETRANGE 用来覆盖一个已经存在的 key 的 value,如下:

但是如果已经存在的 key 的 value 长度小于 offset,则不足的地方用 0 补齐,如下:

1.2.15 STRLEN 命令

STRLEN 用来计算 key 的 value 的长度,如下:

二、Hash 类型

2.1 Hash 类型介绍

Hash 类型,也叫散列,其 value 是一个无序字典,类似于 Java 中的 HashMap 结构。
在存储 Java 对象时,String 结构是将对象序列化为 JSON 字符串后存储,当需要修改对象某个字段时很不方便。

KEY VALUE
user:1 {name:“Jack”,age:21}
user:2 {name:“Rose”,age:18}

Hash 结构可以将对象中的每个字段独立存储,可以针对单个字段做 CRUD。

KEY VALUE
FIELD VALUE
user:1 name Jack
age 21
user:2 name Rose
age 18

2.2 Hash 类型的常见命令

Hash 的常见命令有:

  • HSET key field value:添加或者修改 hash 类型 key 的 field 的值
  • HGET key field:获取一个 hash 类型 key 的 field 的值
  • HMSET:批量添加多个 hash 类型 key 的 field 的值
  • HMGET:批量获取多个 hash 类型 key 的 field 的值
  • HGETALL:获取一个 hash 类型的 key 中的所有的 field 和 value
  • HKEYS:获取一个 hash 类型的 key 中的所有的 field
  • HVALS:获取一个 hash 类型的 key 中的所有的 value
  • HINCRBY:让一个 hash 类型的 key 的字段值自增并指定步长
  • HSETNX:添加一个 hash 类型的 key 的 field 值,前提是这个 field 不存在,否则不执行

2.2.1 HSET 命令

HSET 命令可以用来设置 key 指定的哈希集中指定字段的值,如下:

2.2.2 HGET 命令

HGET 命令可以用来返回 key 指定的哈希集中该字段所关联的值,如下:

2.2.3 HMSET 命令

HMSET 命令可以批量设置 key 指定的哈希集中指定字段的值,如下:

2.2.4 HMGET 命令

HMGET 命令可以批量返回 key 指定的哈希集中指定字段的值,如下:

2.2.5 HDEL 命令

HDEL 命令可以从 key 指定的哈希集中移除指定的域,在哈希集中不存在的域将被忽略,如下:

2.2.6 HSETNX 命令

HSETNX 命令只在 key 指定的哈希集中不存在指定的字段时,设置字段的值,如果字段已经存在,该操作无效果,如下:

2.2.7 HVALS 命令

HVALS 命令可以返回 key 指定的哈希集中所有字段的值,如下:

2.2.8 HKEYS 命令

HKEYS 命令可以返回 key 指定的哈希集中所有字段的名字,如下:

2.2.9 HGETALL 命令

HGETALL 命令可以返回 key 指定的哈希集中所有的字段和值。返回值中,每个字段名的下一个是它的值,所以返回值的长度是哈希集大小的两倍,如下:

2.2.10 HEXISTS 命令

HEXISTS 命令可以返回 hash 里面 field 是否存在,如下:

2.2.11 HINCRBY 命令

HINCRBY 可以增加 key 指定的哈希集中指定字段的数值。如果 key 不存在,会创建一个新的哈希集并与 key 关联。如果字段不存在,则字段的值在该操作执行前被设置为 0,HINCRBY 支持的值的范围限定在 64 为有符号整数,如下:

2.2.12 HINCRBYFLOAT 命令

HINCRBYFLOAT 和 HINCRBY 用法基本一致,只不过这里允许 float 类型的数据。

2.2.13 HLEN 命令

HLEN 返回 key 指定的哈希集包含的字段的数量,如下:

2.2.14 HSTRLEN 命令

HSTRLEN 可以返回 hash 指定 field 的 value 的字符串长度,如果 hash 或者 field 不存在,返回 0,如下:

三、List 类型

3.1 List 类型介绍

Redis 中的 List 类型与 Java 中的 LinkedList 类似,可以看做是一个双向链表结构,既可以支持正向检索,也可以支持反向检索。
特征也与 LinkedList 类似:

  • 有序
  • 元素可以重复
  • 插入和删除快
  • 查询速度一般

常用来存储一个有序数据,例如:朋友圈点赞列表,评论列表等。

3.2 List 类型的常见命令

List 的常见命令有:

  • LPUSH key element … :向列表左侧插入一个或多个元素
  • LPOP key:移除并返回列表左侧的第一个元素,没有则返回 nil
  • RPUSH key element … :向列表右侧插入一个或多个元素
  • RPOP key:移除并返回列表右侧的第一个元素
  • LRANGE key start end:返回一段角标范围内的所有元素
  • BLPOP 和 BRPOP:与 LPOP 和 RPOP 类似,只不过在没有元素时等待指定时间,而不是直接返回 nil

3.2.1 LPUSH 命令

将一个或多个值 value 插入到列表 key 的表头,如果有多个 value 值,那么各个 value 值按从左到右的顺序依次插入到表头,如下:

3.2.2 LRANGE 命令

返回列表 key 中指定区间内的元素,区间以偏移量 start 和 stop 指定,下标(index)参数 start 和 stop 都以 0 为底,即 0 表示列表中的第一个元素,1 表示列表的第二个元素,以此类推。我们也可以使用负数下标,以 -1 表示列表的最后一个元素,-2 表示列表的倒数第二个元素,以此类推。如下:

3.2.3 RPUSH 命令

RPUSH 和 LPUSH 的功能基本一致,不同的是 RPUSH 中的 value 值是按照从右到左的顺序依次插入,如下:

3.2.4 RPOP 命令

RPOP 命令可以移除并返回列表右侧的第一个元素。如下:

3.2.5 LPOP 命令

LPOP 和 RPOP 类似,不同的是 LPOP 移除并返回的是列表左侧的第一个元素。如下:

3.2.6 LINDEX 命令

LINDEX 命令可以返回列表 key 中,下标为 index 的元素,正数下标 0 表示第一个元素,也可以使用负数下标,-1 表示倒数第一个元素,如下:

3.2.7 LTRIM 命令

LTRIM 命令可以对一个列表进行修剪,即让列表只保留指定区间内的元素,不在指定区间之内的元素都将被删除。下标与之前介绍的写法都一致,如下:

3.2.8 BLPOP 命令

BLPOP 是阻塞式列表的弹出原语。它是命令 LPOP 的阻塞版本,当给定列表内没有任何元素可弹出的时候,连接将被 BLPOP 命令阻塞。当给定多个 key 参数时,按照参数 key 的先后顺序依次检查各个列表,弹出第一个非空列表的头元素。同时,在使用该命令时也需要指定阻塞的时长,时长单位为秒,在该时长内如果没有元素可供弹出,则阻塞结束。返回的结果时 key 和 value 的组合,如下:

BRPOP、BPOPLPUSH、BRPOPLPUSH 都是相应命令的阻塞版本,这里不再赘述。

3.3 思考

  • 如何利用 List 结构模拟一个栈?
    入口和出口在同一边。

  • 如何利用 List 结构模拟一个队列?
    入口和出口在不同边。

  • 如何利用 List 结构模拟一个阻塞队列?
    入口和出口在不同边,出队时采用 BLPOP 或 BRPOP。

四、Set 类型

4.1 介绍

Redis 的 Set 结构与 Java 中的 HashSet 类似,可以看做是一个 value 为 null 的 HashMap。因为也是一个 hash 表,因此具备与 HashSet 类似的特征:

  • 无序
  • 元素不可重复
  • 查找快
  • 支持交集、并集、差集等功能

4.2 Set 类型的常见命令

Set 常见命令:

  • SADD key member … :向 set 中添加一个或多个元素
  • SREM key member … :移除 set 中的指定元素
  • SCARD key … :返回 set 中元素的个数
  • SISMEMBER key member:判断一个元素是否存在于 set 中
  • SMEMBERS:获取 set 中的所有元素
  • SINTER key1 key2 … :求 key1 与 key2 的交集
  • SDIFF key1 key2 … :求 key1 与 key2 的差集
  • SUNION key1 key2 … :求 key1 与 key2 的并集

4.2.1 SADD 命令

SADD 命令可以添加一个或多个指定的 member 元素到集合的 key 中,指定的一个或多个 member 元素 如果已经在集合 key 中存在,则忽略,如果集合 key 不存在,则新建集合 key,并添加 member 元素到集合 key 中。如下:

4.2.2 SREM 命令

SREM 命令可以在 key 集合中移除指定的元素,如果指定的元素不是 key 集合中的元素,则忽略。如果 key 集合不存在则视为一个空的集合,该命令返回 0。如下:

4.2.3 SISMEMBER 命令

SISMEMBER 命令可以返回成员 member 是否是存储的集合 key 的成员。如下:

4.2.4 SCARD 命令

SCARD 命令可以返回集合存储的 key 的基数(集合元素的数量),如下:

4.2.5 SMEMBERS 命令

SMEMBERS 命令可以返回 key 集合所有的元素,如下:

4.2.6 SRANDMEMBER 命令

SRANDMEMBER 仅需我们提供 key 参数,它就会随机返回 key 集合中的一个元素,从 Redis2.6 开始,该命令也可以接受一个可选的 count 参数,如果 count 是整数且小于元素的个数,则返回 count 个随机元素,如果 count 是整数且大于集合中元素的个数时,则返回集合中的所有元素,如果 count 是负数,则会返回一个包含 count 的绝对值的个数元素的数组,如果 count 的绝对值大于元素的个数,则返回的结果集里会出现一个元素出现多次的情况。如下:

4.2.7 SPOP 命令

SPOP 命令的用法和 SRANDMEMBER 类似,不同的是,SPOP 每次选择一个随机的元素之后,该元素会出栈,而 SRANDMEMBER 则不会出栈,只是将该元素展示出来。

4.2.8 SMOVE 命令

SMOVE 命令可以将 member 从 source 集合移动到 destination 集合中,如下:

4.2.9 SDIFF 命令

SDIFF 可以用来返回一个集合与给定集合的差集的元素,如下:

4.2.10 SDIFFSTORE 命令

SDIFFSTORE命令与 SDIFF 命令基本一致,不同的是 SDIFFSTORE 命令会将结果保存在一个集合中,如下:

4.2.11 SINTER 命令

SINTER 命令可以用来计算指定 key 之间元素的交集,如下:

4.2.12 SINTERSOTRE 命令

SINTERSOTRE 命令和 SINTER 命令类似,不同的是它会将结果保存到一个新的集合中,如下:

4.2.13 SUNION 命令

SUINON 可以用来计算两个集合的并集,如下:

4.2.14 SUNIONSTORE 命令

SUNIONSTORE 命令和 SUNION 命令类似,不同的是它会将结果保存到一个新的集合中,如下:

五、SortedSet 类型

5.1 介绍

Redis 的 SortedSet 是一个可排序的 set 集合,与 Java 中的 TreeSet 有些类似,但底层数据结构却差别很大。SortedSet 中的每一个元素都带有一个 score 属性,可以基于 score 属性对元素排序,底层的实现是一个跳表(SkipList)加 hash 表。
SortedSet 具备下列特性:

  • 可排序
  • 元素不重复
  • 查询速度快

因为 SortedSet 的可排序特性,经常被用来实现排行榜这样的功能。

5.2 SortedSet 类型的常见命令

SortedSet 类型的常见命令有:

  • ZADD key score member:添加一个或多个元素到 SortedSet,如果已经存在则更新其 score 值
  • ZREM key member:删除 SortedSet 中的一个指定元素
  • ZSCORE key member:获取 SortedSet 中的指定元素的 score 值
  • ZRANK key member:获取 SortedSet 中的指定元素的排名
  • ZCARD key:获取 SortedSet 中的元素个数
  • ZCOUNT key min max:统计 score 值在给定范围内的所有元素的个数
  • ZINCRBY key increment member:让 SortedSet 中的指定元素自增,步长为指定的 increment 值
  • ZRANGE key min max:按照 score 排序后,获取指定排名范围内的元素
  • ZRANGEBYSCORE key min max:按照 score 排序后,获取指定 score 范围内的元素
  • ZDIFF、ZINTER、ZUNION:求差集、交集、并集

注:所有的排名默认都是升序,如果要降序则在命令的 Z 后面添加 REV 即可。

5.2.1 ZADD 命令

ZADD 命令可以将所有指定成员添加到键为 key 的有序集合里面,添加时可以指定多个分数/成员(score/memeber)对。如果指定添加的成员已经是有序集合里面的成员,则会更新该成员的分数(score)并更新到正确的排序位置。如下:

5.2.2 ZSCORE 命令

ZSCORE 命令可以返回有序集 key 中,成员 member 的 score 值。如下:

5.2.3 ZRANGE 命令

ZRANGE 命令可以根据 index 返回 member,该命令在执行时加上 withscores 参数可以连同 score 一起返回:

5.2.4 ZREVRANGE 命令

ZREVRANGE 和 ZRANGE 功能基本一致,不同的是 ZREVRANGE 是降序,如下:

5.2.5 ZCARD 命令

ZCARD 命令可以返回 key 的有序集元素个数,如下:

5.2.6 ZCOUNT 命令

ZCOUNT 命令可以返回有序集 key 中,score 值在 min 和 max 之间(默认包括值等于 min 或 max)的成员,如下:

如果在统计时,不需要包含 66 或者 90,则添加一个 ( 即可,如下:

5.2.7 ZRANGEBYSCORE 命令

ZRANGEBYSCORE 命令可以按照 score 范围获取元素,加上 withscores 可以连同 score 一起返回。如下:

5.2.8 ZRNAK 命令

ZRANK 命令可以返回有序集 key 中成员 member 的排名。其中有序集成员按 score 值递增(从小到大)顺序排列。排名以 0 为底,即 score 值最小的成员排名为 0。如下:

5.2.9 ZREVRANK 命令

ZREVRANK 和 ZRANK 命令功能基本一致,不同的是,ZREVRANK 中的排序是从大到小:

5.2.10 ZINCRBY 命令

ZINCRBY 命令可以为有序集 key 的成员 member 的 score 值加上增量 increment。如果 key 中不存在 member,就在 key 中添加一个 member,score 是 increment(就好像它之前的 score 是 0.0)。如果 key 不存在,就创建一个只含有指定 member 成员的有序集合:

5.2.11 ZINTER 命令

ZINTER 命令可以计算给定的 numkeys 个有序集合的交集。在给定要计算的 key 和其他参数之前,必须先给定 key 个数(numberkeys)。如下:

5.2.12 ZINTERSTORE 命令

ZINTERSTORE 命令可以计算给定的 numkeys 个有序集合的交集,并且把结果放到 destination 中。在给定要计算的 key 和其他参数之前,必须先给定 key 个数(numberkeys)。该命令也可以在执行的过程中给原 score 乘以 weights 后再求和,如下:

5.2.13 ZREM 命令

ZREM 命令可以从集合中弹出一个元素,如下:

5.2.14 ZLEXCOUNT 命令

ZLEXCOUNT 命令用于计算有序集合中指定成员之间的成员数量。如下:

注意:可以用 - 和 + 表示得分最小值和最大值,如果使用成员名的话,一定要在成员名之前加上 [ 。

5.2.15 ZRANGEBYLEX 命令

ZRANGEBYLEX 返回指定成员区间内的成员,安城院字典正序排序,分数必须相同。如下:

注意:min 和 max 参数的写法和 ZLEZCOUNT 一致。

Redis 的五种基本数据类型相关推荐

  1. 【黑马程序员】Redis学习笔记001:Redis简介+五种基本数据类型

    一.Redis入门简介及基本操作命令 问题的抛出 出现的问题: 海量用户 高并发 罪魁祸首--关系型数据库: 性能瓶颈:磁盘IO性能低下 扩展瓶颈:数据关系复杂,扩展性差,不便于大规模集群 解决思路 ...

  2. Redis学习(一)—生活中实用场景帮助理解redis的五种基本数据类型

    Redis实例目录 (一)String (1)业务场景1--分库分表后获取唯一id (2)业务场景2--数据时效性设置 (3)业务场景3--高频数据访问显示 实现方式一 实现方式二 (二)Hash ( ...

  3. redis种类型对应java类型_Redis的五种基本数据类型介绍

    Redis作为缓存具有极其丰富的功能,比如计数器.好友关系以及排行榜等等.而Redis之所能够实现如此强大的功能,完全是依赖着它的基本数据结构.今天我们来看看Redis的五种基本的数据结构,分别是字符 ...

  4. Redis: Redis支持五种数据类型

    ylbtech-Redis: Redis支持五种数据类型 Redis支持五种数据类型:string(字符串) ,hash(哈希),list(列表),set(集合)及zset(sorted set:有序 ...

  5. 【Redis】五种数据类型

    五种数据类型 string类型 list类型 set类型 hash类型 sortset String 添加/修改数据 set key value 获取数据 get key 删除数据 del key 批 ...

  6. 【redis-02】redis的五种数据类型和对应的操作方法,补充RedisUtil模板

    [redis-02]redis的五种数据类型和对应的操作方法,补充RedisUtil模板 [一]redis的五种数据类型 [二]String:字符串常用命令 (1)String基本信息 (2)Stri ...

  7. Redis五种基本数据类型底层详解(原理篇)

    Redis五种基本数据类型底层详解 详细介绍Redis用到的数据结构 简单动态字符串 SDS和C字符串的区别 总结 链表 字典 哈希表 字典 哈希算法 解决键冲突 rehash(重点) 渐进式reha ...

  8. StackExchange.Redis学习笔记(二) Redis查询 五种数据类型的应用

    StackExchange.Redis学习笔记(二) Redis查询 五种数据类型的应用 原文: StackExchange.Redis学习笔记(二) Redis查询 五种数据类型的应用 Connec ...

  9. Redis五种基本数据类型

    五种基本数据类型 redis无论什么数据类型,在数据库中都是以key-value形式保存,并且所有的key(键)都是字符串,所以讨论基础数据结构都是讨论的value值的数据类型 主要包括常见的5种数据 ...

最新文章

  1. linux 查看磁盘分区的文件系统格式
  2. Mongodb数据库初识
  3. Linux——Ubuntu 18.04 安装screenFetch(显示系统/主题信息的命令行脚本)
  4. 51单片机常用寄存器速查
  5. 字符缓冲流特有功能复制Java文件
  6. 拳王公社:网络引流的“4大核心秘诀“,让客户源源不断地加你
  7. [日常] 算法-单链表的创建-尾插法
  8. 题目:[汪老师结婚]婚礼上的袭击
  9. 光波函数和薛定谔方程
  10. 海迅2016破解版下载
  11. 日本盗版漫画网站的罪与罚
  12. 关于一台电脑控制多台手机技术分享被恶意转载的声明
  13. 130、总结:华为、H3C、锐捷三家交换机配置命令详解
  14. 枕头Python 3
  15. 纯代码告诉你:我的原弈非常(Yanj Future)是怎么下棋的
  16. 卷积神经网络(CNN)经典模型分析(一)
  17. C语言中fseek函数
  18. 利用C Free3.5 本身获得自身注册码
  19. 如何用3D流体实现逼真水流效果?
  20. c语言房屋销售管理信息系统

热门文章

  1. 戴尔发布Inspiron 3000/5000系列笔记本电脑和一体机
  2. 基于姿态识别的手势识别
  3. 什么是 DevOps?看这一篇就够了!
  4. vue-wangEditor 上传视频功能
  5. influxdb+grafana监控网络情况
  6. [floodlight]Error: Unable to access jarfile target/floodlight.jar
  7. uniapp阻止页面返回
  8. oracle查sysdate,oracle查询有关sysdate和to_date的用法
  9. python数据分析之描述性统计分析
  10. PVDF电荷放大器的设计实践( 2 )