Redis系列(二):Redis的5种数据结构及其常用命令
上一篇博客,我们讲解了什么是Redis以及在Windows和Linux环境下安装Redis的方法,
没看过的同学可以点击以下链接查看:
本篇博客我们来讲解下Redis的5种数据结构及其常用命令,5种数据结构分别为:
- 字符串String
- 列表List
- 集合Set
- 散列Hash
- 有序集合ZSet
注意事项:Redis可以存储键(key)值(value)对的映射,其中键(key)一直是String,而值可以是上面提到的5种数据结构中的一种。
1. 字符串String
在Redis中,字符串可以存储以下3种类型的值:
- 字节串(byte string)
- 整数
- 浮点数
经常使用的字符串命令主要分为以下3种类型:
- 常用命令
- 自增自减命令
- 子串命令
接下来,我们一一讲解。
1.1 常用命令
常用命令主要有:GET、SET、DEL。
GET、SET、DEL命令的功能如下所示:
| 命令 | 功能 |
|---|---|
| GET | 获取指定键的值 |
| SET | 设置指定键的值 |
| DEL | 删除指定键的值 |
然后我们打开一个redis-cli交互式客户端,执行下上面的命令看下效果。
以下是这些命令的使用示例:

1.2 自增自减命令
自增自减命令主要有:INCR、DECR、INCRBY、DECRBY、INCRBYFLOAT。
当用户将一个值存储到Redis字符串的时候,如果这个值可以被转化为整数或者浮点数,那么Redis会察觉到这一点,并允许用户对这个字符串执行各种INCR*和DECR*操作。
INCR、DECR命令的功能如下所示:
| 命令 | 语法 | 功能 |
|---|---|---|
| INCR | INCR keyname | 将键存储的值加1 |
| DECR | DECR keyname | 将键存储的值减1 |
以下是可能存在的3个异常场景:
- 对一个不存在的键执行自增或者自减操作,Redis在执行操作时会将这个键的值当作0来处理。
- 对一个保存了空串的键执行自增或者自减操作,Redis在执行操作时会将这个键的值当作0来处理。
- 对一个值无法被解释为整数或者浮点数的字符串键执行自增或者自减操作,Redis将返回一个错误。
以下是这些命令的使用示例:


INCRBY、DECRBY命令的功能和上面的INCR、DECR命令类似,不过INCRBY、DECRBY可以指定每次自增或者自减的数值,而INCR、DECR每次都自增或者自减1。
INCRBYFLOAT命令与INCRBY命令类似,不过INCRBYFLOAT命令用来自增或者自减浮点,而INCRBY命令用来自增或者自减整数。
INCRBY、DECRBY、INCRBYFLOAT命令的功能如下所示如下所示:
| 命令 | 语法 | 功能 |
|---|---|---|
| INCRBY | INCR keyname amount | 将键存储的值加上整数amount |
| DECRBY | DECR keyname amount | 将键存储的值减去整数amount |
| INCRBYFLOAT | INCRBYFLOAT keyname amount | 将键存储的值加上浮点数amount |
我们可以打开一个redis-cli交互式客户端,执行上面的命令看下效果。

1.3 子串命令
子串命令主要有:APPEND、GETRANGE、SETRANGE。
APPEND命令的功能如下所示:
命令:APPEND
语法:APPEND keyname value
功能:将值value追加到指定键keyname当前存储的值的末尾
GETRANGE命令的功能如下所示:
命令:GETRANGE
语法:GETRANGE keyname start end
功能:获取一个由偏移量start(包含start)至偏移量end(包含end)范围内所有字符组成的子串
SETRANGE命令的功能如下所示:
命令:SETRANGE
语法:SETRANGE keyname start value
功能:将从start偏移量开始的子串设置为给定值
以下是这些命令的使用示例:

2. 列表List
Redis中的列表主要有以下2个特性:
- 有序地存储多个字符串
- 列表里面的元素是可以重复的
经常使用的列表命令主要分为以下3种类型:
- 常用命令
- 阻塞弹出命令
- 元素移动命令
接下来,我们一一讲解。
2.1 常用命令
常用命令主要有:RPUSH、LPUSH、RPOP、LPOP、LINDEX、LRANGE、LTRIM。
RPUSH命令的功能如下所示:
命令:RPUSH
语法:RPUSH keyname value [value ...]
功能:将一个或多个值推入列表的右端
LPUSH命令的功能如下所示:
命令:LPUSH
语法:LPUSH keyname value [value ...]
功能:将一个或多个值推入列表的左端
RPOP命令的功能如下所示:
命令:RPOP
语法:RPOP keyname
功能:移除并返回列表最右端的元素
LPOP命令的功能如下所示:
命令:LPOP
语法:LPOP keyname
功能:移除并返回列表最左端的元素
LINDEX命令的功能如下所示:
命令:LINDEX
语法:LINDEX keyname offset
功能:返回列表中偏移量为offset的元素
LRANGE命令的功能如下所示:
命令:LRANGE
语法:LRANGE keyname start end
功能:返回列表从start(包含start)偏移量到end偏移量(包含end)范围内的所有元素
LTRIM命令的功能如下所示:
命令:LTRIM
语法:LTRIM keyname start end
功能:对列表进行修剪,只保留从start(包含start)偏移量到end偏移量(包含end)范围内的元素
以下是这些命令的使用示例:

2.2 阻塞弹出命令
阻塞弹出命令主要有:BLPOP、BRPOP。
BLPOP命令的功能如下所示:
命令:BLPOP
语法:BLPOP keyname [keyname ...] timeout
功能:从第一个非空列表中弹出最左端的元素,如果没有,则在timeout秒之内阻塞并等待可弹出的元素出现
BRPOP命令的功能如下所示:
命令:BRPOP
语法:BRPOP keyname [keyname ...] timeout
功能:从第一个非空列表中弹出最右端的元素,如果没有,则在timeout秒之内阻塞并等待可弹出的元素出现
以下是这些命令的使用示例:

2.3 元素移动命令
元素移动命令主要有:RPOPLPUSH、BRPOPLPUSH。
RPOPLPUSH命令的功能如下所示:
命令:RPOPLPUSH
语法:RPOPLPUSH source-key dest-key
功能:从source-key列表中弹出最右端的元素,然后将这个元素推入dest-key列表的最左端,并向用户返回这 个元素
BRPOPLPUSH命令可以认为是RPOPLPUSH命令的阻塞实现,功能如下所示:
命令:BRPOPLPUSH
语法:BRPOPLPUSH source-key dest-key timeout
功能:从source-key列表中弹出最右端的元素,然后将这个元素推入dest-key列表的最左端,并向用户返回这 个元素,如果source-key为空,那么在timeout秒之内阻塞并等待可弹出的元素出现
以下是这些命令的使用示例:

3. 集合Set
Redis的集合以无序的方式来存储多个各不相同的元素。
与上面提到的列表相比,Redis中的集合主要有以下2个特性:
- 无序地存储多个字符串
- 集合里面的元素是不可以重复的
经常使用的集合命令主要分为以下3种类型:
- 常用命令
- 元素移动命令
- 差集/交集/并集命令
接下来,我们一一讲解。
3.1 常用命令
常用命令主要有:SADD、SMEMBERS、SISMEMBER、SREM、SCARD。
以上命令的功能描述如下所示:
| 命令 | 语法 | 功能 |
|---|---|---|
| SADD | SADD keyname item [item ...] | 将一个或多个元素添加到集合 |
| SMEMBERS | SMEMBERS keyname | 返回集合包含的所有元素 |
| SISMEMBER | SISMEMBER keyname item | 检查元素item是否存在于集合keyname中 |
| SREM | SREM keyname item [item ...] | 从集合里删除一个或多个元素 |
| SCARD | SCARD keyname | 返回集合包含元素的数量 |
以下是这些命令的使用示例:


3.2 元素移动命令
元素移动命令主要有:SMOVE。
以上命令的功能描述如下所示:
语法:SMOVE sourcekey destkey item
功能:将集合sourcekey中的元素item移除,并将元素item添加到集合destkey中
如果item被成功移除,返回1,否则返回0
以下是SMOVE命令的使用示例:

3.3 差集/交集/并集命令
交集/并集/差集命令主要有:SDIFF、SDIFFSTORE、SINTER、SINTERSTORE、SUNION、SUNIONSTORE。
以上命令的功能描述如下所示:
| 命令 | 语法 | 功能 |
|---|---|---|
| SDIFF | SDIFF keyname [key-name ...] | 返回存在于第1个集合,不存在于其他集合的元素(差集运算) |
| SDIFFSTORE | SDIFFSTORE destkey keyname [key-name ...] | 将存在于第1个集合,不存在于其他集合的元素(差集运算)存储到destkey集合 |
| SINTER | SINTER keyname [key-name ...] | 返回同时存在于所有集合中的元素(交集运算) |
| SINTERSTORE | SINTERSTORE destkey keyname [key-name ...] | 将同时存在于所有集合中的元素(交集运算)存储到destkey集合 |
| SUNION | SUNION keyname [key-name ...] | 返回至少存在于一个集合中的元素(并集运算) |
| SUNIONSTORE | SUNIONSTORE destkey keyname [key-name ...] | 将至少存在于一个集合中的元素(并集运算)存储到destkey集合 |
以下是这些命令的使用示例:

4. 散列Hash
关于数据结构Hash,有些书籍叫做散列,有些书籍叫做哈希,本文中使用名称:散列。
Redis的散列可以存储多个键值对之间的映射,即可以让用户将多个键值对存储到一个Redis键里面,如下所示:

接下来,我们了解下经常使用的散列命令。
4.1 添加键值对
往散列里添加键值对有2个命令,分别是HSET、HMSET,其中HSET一次只能添加1个键值对,而HMSET一次可以添加多个键值对。
以下是这2个命令的使用示例:

此时的hash-key包含3个键值对,如下所示:

4.2 获取键值对
获取散列里键值对有以下5个命令:
- HGET 从散列里获取指定键的值
- HMGET 从散列里获取一个或多个键的值
- HKEYS 获取散列包含的所有键
- HVALS 获取散列包含的所有值
- HGETALL 获取散列包含的所有键值对
以下是这5个命令的使用示例:

4.3 获取键值对数量
可以通过HLEN命令来获取散列包含的键值对数量。
以下是HLEN命令的使用示例:

4.4 判断键是否存在
可以通过HEXISTS命令来检查某个键是否存在于散列中。
以下是HEXISTS命令的使用示例:

4.5 自增/自减
和字符串的自增,自减命令功能类似,在散列里,我们可以使用HINCRBY命令将某个键存储的值加上个整数,使用HINCRBYFLOAT命令将某个键存储的值加上个浮点数。
以下是这2个命令的使用示例:

4.6 删除键值对
可以通过HDEL命令来删除散列中的一个或多个键。
以下是HDEL命令的使用示例:

5. 有序集合ZSet
有序集合和散列一样,可以用于存储多个键值对之间的映射,其中有序集合的键被称为成员(member),每个成员都是各不相同的,有序集合的值被称为分值(score),分值必须为浮点数。
下图表示1个包含2个元素的有序集合示例:

接下来,我们了解下经常使用的有序集合命令。
5.1 添加元素
可以通过ZADD命令往有序集合中添加元素。
以下是ZADD命令的使用示例:

此时的zset-key包含3个成员与分值之间的映射,如下所示:

5.2 获取元素
获取有序集合里元素有以下2个命令:
ZRANGE
语法:ZRANGE keyname start stop [WITHSCORES]
功能:返回有序集合中排名介于start和stop之间的成员,如果给定了可选的WITHSCORES选项,
那么会将成员的分值一并返回
ZRANGEBYSCORE
语法:ZRANGEBYSCORE keyname min max [WITHSCORES] [LIMIT offset count]
功能:返回有序集合中分值介于min和max之间的成员,如果给定了可选的WITHSCORES选项,
那么会将成员的分值一并返回
以下是这2个命令的使用示例:

5.3 获取元素数量
可以通过ZCARD命令来获取有序集合包含的成员数量。
以下是ZCARD命令的使用示例:

还可以通过ZCOUNT命令来获取有序集合中分值处于某个区间的成员数量。
以下是ZCOUNT命令的使用示例:

5.4 自增/自减
和字符串的自增,自减命令功能类似,在有序集合里,我们可以使用ZINCRBY命令将某个成员的分值加上个整数。
以下是这ZINCRBY命令的使用示例:

5.5 删除元素
可以通过ZREM命令来删除有序集合中的一个或多个成员。
以下是ZREM命令的使用示例:

如果想了解更多的Redis命令,可以查看官网地址:https://redis.io/commands。
6. 源码及参考
Josiah L. Carlson 《Reids实战》
Redis系列(二):Redis的5种数据结构及其常用命令的更多相关文章
- Redis系列(二):Redis的数据类型及命令操作
原文链接(转载请注明出处):Redis系列(二):Redis的数据类型及命令操作 Redis 中常用命令 Redis 官方的文档是英文版的,当然网上也有大量的中文翻译版,例如:Redis 命令参考.这 ...
- Redis系列二 Redis数据库介绍
1.SELECT命令 通过查看配置文件可以知道Redis默认有17个库,从0-16. 默认是在0号库.选择库使用SELECT <dbid>命令.例如选择0号库 SELECT 0 2.DB ...
- Redis系列(一):Redis的简介与安装
原文链接(转载请注明出处):Redis系列(一):Redis的简介与安装 什么是 Redis Redis 是一个使用ANSI C 编写的开源.支持网络协议.基于内存.可选持久性的键值对数据库,它是一个 ...
- Redis系列一 Redis安装
Redis系列一 Redis安装 1.安装所使用的操作系统为Ubuntu16.04 Redis版本为3.2.9 软件一般下载存放目录为/opt,以下命令操作目录均为/opt root@ubunt ...
- Redis系列二 - 数据结构
前言 redis作为我们开发的一大神器,我们接触肯定不会少,但是很多同学也许只会存储String类型的值,这是非常不合理的.在这里,将带大家认识Redis的5中数据结构. 1.问:Redis有那些数据 ...
- Redis系列二之事务及消息通知
一.事务 Redis中的事务是一组命令的集合.一个事务中的命令要么都执行,要么都不执行. 1.事务简介 事务的原理是先将一个事务的命令发送给Redis,然后再让Redis依次执行这些命令.下面看一个示 ...
- 深入剖析Redis系列:Redis数据结构与全局命令概述
前言 Redis 提供了 5 种数据结构.理解每种数据结构的特点,对于 Redis 的 开发运维 非常重要,同时掌握 Redis 的 单线程命令处理 机制,会使 数据结构 和 命令 的选择事半功倍. ...
- Redis系列之----Redis的两种持久化机制(RDB和AOF)
Redis的两种持久化机制(RDB和AOF) 什么是持久化 Redis的数据是存储在内存中的,内存中的数据随着服务器的重启或者宕机便会不复存在,在生产环境,服务器宕机更是屡见不鲜,所以,我们希望 ...
- Redis(十二):redis两种持久化方法对比分析
前言 最近在项目中使用到Redis做缓存,方便多个业务进程之间共享数据.由于Redis的数据都存放在内存中,如果没有配置持久化,redis重启后数据就全丢失了,于是需要开启redis的持久化功能,将数 ...
随机推荐
- MySQL视图 definer & invoker 权限
1.创建视图 CREATE VIEW `NewView`AS SELECT `user`.USER_ID, `user`.USER_NAME, department.DEPT_ID, departme ...
- 关于better-scroll的使用注意事项
better-scroll的原理 1.什么是 better-scroll? better-scroll 是一个移动端滚动的解决方案,它不仅可以做普通的滚动列表,还可以做轮播图.picker 等等. 2 ...
- 如何在很短的时间内将大量数据插入到ConcurrentHashMap(转)
将大批量数据保存到map中有两个地方的消耗将会是比较大的:第一个是扩容操作,第二个是锁资源的争夺.第一个扩容的问题,主要还是要通过配置合理的容量大小和扩容因子,尽可能减少扩容事件的发生:第二个锁资源的 ...
- 2018-2-13-win10-uwp-csdn-博客阅读器
title author date CreateTime categories win10 uwp csdn 博客阅读器 lindexi 2018-2-13 17:23:3 +0800 2018-2- ...
- 解读中兴通信在物联网行业如何践行DDD
此前,在由 ThoughtWorks 举办的领域驱动设计峰会 DDD-China 2019 上,InfoQ 记者就开发团队为何需要 DDD.目前业界实践 DDD 的挑战等问题对中兴通讯资深软件架构师张 ...
- python写冒泡排序
冒泡就是重复地遍历要排序的数列,一次比较两个元素(泡泡),如果他们的顺序错误就把他们交换过来,像泡泡一样,依次按照顺序上升排列. 冒泡排序算法的运作如下: 比较相邻的元素.如果第一个比第二个大(升序) ...
- 【小技巧】在PS中测量图层间的边距
今天学到了一个小技巧,前端切页面时会很方便,就是测量间距margin的. 在ps中,选中某个图层,然后按住ctrl键,再移动鼠标,就可以出现这个图层距其他元素的边距,这个太方便了.在此记录一下,免的以 ...
- 从头学pytorch(十二):模型保存和加载
模型读取和存储 总结下来,就是几个函数 torch.load()/torch.save() 通过python的pickle完成序列化与反序列化.完成内存<-->磁盘转换. Module.s ...
- $CF938G\ Shortest\ Path\ Queries$ 线段树分治+线性基
正解:线段树分治+线性基 解题报告: 传送门$QwQ$ 考虑如果只有操作3,就这题嘛$QwQ$ 欧克然后现在考虑加上了操作一操作二 于是就线段树分治鸭 首先线段树叶子节点是询问嘛这个不用说$QwQ$. ...
- 使用EF操作Docker中的Mysql实例
为啥我会选择mysql呢?因为我的服务器配置较低,而SqlServer在docker中的实例,服务器的运行内存应当保持在2G+,我没有这个条件,它会爆出这样的错误 sqlservr: This pro ...