0x01 概述
- Redis(Remote Dictionary Server)是一个开源的基于内存的数据存储系统,可以用作数据库缓存和消息队列等场景,是一种 NoSQL
- 数据类型
- 基本数据类型
- 字符串 String
- 列表 List
- 集合 Set
- 有序集合 SortedSet
- 哈希 Hash
- 高级数据类型
- 消息队列 Stream
- 地理空间 Geospatial
- HyperLogLog
- 位图 Bitmap
- 位域 Bitfield
- 基本数据类型
- 使用方式
- 命令行界面 CLI(Command Line Interface)
- 应用程序接口 API(Application Programming Interface)
- 图形用户界面 GUI(Graphical User Interface)
- 特点
- 性能极高
- 数据类型丰富,单键值对最大支持 512M 大小的数据
- 简单易用,支持所有主流编程语言
- 支持数据持久化、主从复制、哨兵模式等高可用特性
0x02 安装
-
Mac
- 安装:
brew install redis
- 启动:
redis-server
、redis-cli
- 安装:
-
Linux
- 安装:
apt install redis
- 启动:
redis-server
、redis-cli
- 安装:
-
Windows
-
安装
-
通过 WSL 安装 Linux,在其中安装 Redis
-
通过 Docker 寻找镜像并下载,之后运行这个镜像
docker search redis
->docker pull redis
-
通过 EXE 文件
-
-
启动
- Docker 安装时:
docker redis
- EXE 安装时:
redis-server.exe
- Docker 安装时:
-
0x03 RedisInsight 的使用
- RedisInsight 是操作 Redis 的一种图形化工具
- 官网下载
0x04 发布订阅模式
- 通过命令
PUBLISH
将消息发送到指定的频道- 向 abc 频道发布 def 消息:
PUBLISH abc def
- 向 abc 频道发布 def 消息:
- 通过命令
SUBSCRIBE
订阅指定频道- 订阅 abc 频道:
SUBSCRIBE abc
- 订阅 abc 频道:
- 目前缺陷:消息无法持久化、无法计入历史消息等
- 解决方案:消息队列
0x05 数据类型
(1)字符串 String
- Redis 默认使用字符串存储数据,而且是二进制安全的
- 中文以二进制的方式存储,使用
GET
命令并不会输出中文,而是十六进制数 - 在启动 Redis CLI 时使用命令
redis-cli --raw
即可将中文正常显示
- 中文以二进制的方式存储,使用
- 存储过程中需要通过指定键值对来保存数据,同时区分大小写
- 添加
- 添加字符串:
SET name zhangsan
- 添加数字:
SET age 20
- 添加字符串:
- 查找
- 查找 name:
GET name
- 查找 age:
GET age
- 查找所有键:
KEYS *
- 查找 name:
- 删除
- 删除 name:
DEL name
- 删除所有键:
FLUSHALL
- 删除 name:
- 存在性
- 查看键的存在性:
EXISTS key
- 如果键不存在则设置键值:
SETNX key value
- 查看键的存在性:
- 过期时间
- 查看键的过期时间:
TTL key
- 设置键的过期时间:
EXPIRE key 10
(时间单位:秒) - 创建键值对并设置过期时间:
SETEX key 10 value
- 查看键的过期时间:
(2)列表 List
- 可以使用
LPUSH
命令或RPUSH
将元素添加到列表的头部或者尾部- 创建列表 letter 并在头部添加元素 a b c:
LRUSH letter a b c
- 创建列表 letter 并在头部添加元素 a b c:
- 使用命令
LRANGE
获取列表内容- 获取列表 letter 第一个元素到最后一个元素:
LRANGE letter 0 -1
- 获取列表 letter 第一个元素到最后一个元素:
- 可以使用
LPOP
命令或RPOP
将元素从列表的头部或者尾部删除- 删除列表 letter 后两个元素:
RPOP letter 2
- 删除列表 letter 后两个元素:
- 使用命令
LLEN
获取列表长度- 获取列表 letter 的长度:
LLEN letter
- 获取列表 letter 的长度:
- 可以使用
LTRIM
命令删除指定范围以外的元素- 删除列表 letter 除第二个以外的所有元素:
LTRIM letter 1 1
- 删除列表 letter 除第二个以外的所有元素:
(3)集合 Set
-
使用命令
SADD
创建集合- 创建集合 number 并添加元素 1 2 3:
SADD number 1 2 3
- 创建集合 number 并添加元素 1 2 3:
-
使用命令
SMEMBERS
查看集合中的所有元素- 查看集合 number 中的所有元素:
SMEMBERS number
- 查看集合 number 中的所有元素:
-
使用命令
SISMEMBER
判断元素是否在集合中- 查看集合 number 中是否存在元素 1:
SISMEMBER number 1
- 查看集合 number 中是否存在元素 1:
-
使用命令
SREM
删除集合中指定的元素- 删除集合 number 中的元素 1:
SREM number 1
- 删除集合 number 中的元素 1:
-
集合运算
SINTER
:交集运算命令SUNION
:并集运算命令SDIFF
:差运算命令
(4)有序集合 SortedSet
- SortedSet 又称 ZSet
- 与一般集合的区别在于每个元素会被赋予一个分数,之后依据这个分数进行从小到大排序
- 使用命令
ZADD
创建有序集合- 创建有序集合 score 并为学生添加分数:
SADD score 80 Alex 90 Bob
- 创建有序集合 score 并为学生添加分数:
- 使用命令
ZRANGE
查看有序集合中的元素- 查看有序集合 score 中的元素:
ZRANGE result 0 -1
- 查看有序集合 score 中的元素以及对应分数:
ZRANGE result 0 -1 WITHSCORES
- 查看有序集合 score 中的元素:
- 使用命令
ZSCORE
查看指定元素对应分数- 查看有序集合 score 中 Bob 的分数:
ZSCORE score Bob
- 查看有序集合 score 中 Bob 的分数:
- 使用命令
ZRANK
查看指定元素的排名- 查看有序集合 score 中 Bob 的排名:
ZRANK score Bob
- 查看有序集合 score 中 Bob 的排名:
- 使用命令
ZREVRANK
查看指定元素的倒序排名- 查看有序集合 score 中 Bob 的倒序排名:
ZREVRANK score Bob
- 查看有序集合 score 中 Bob 的倒序排名:
(5)哈希 Hash
- 哈希是一个字符类型的字段和值的映射表,是键值对的集合,适合存储对象
- 使用命令
HSET
向哈希中添加键值对- 创建哈希 student 并添加相关信息
HSET student name Bob
HSET student age 20
- 创建哈希 student 并添加相关信息
- 使用命令
HGET
查看哈希中的指定键的值- 查看哈希 student 中 name 的值:
HGET student name
- 查看哈希 student 中的全部键值对:
HGETALL student
- 查看哈希 student 中 name 的值:
- 使用命令
HDEL
删除哈希中指定键值对- 删除哈希 student 中的 age:
HDEL student age
- 删除哈希 student 中的 age:
- 使用命令
HEXISTS
判断哈希中某个键值对是否存在- 查看哈希 student 中 age 的存在性:
HEXISTS student age
- 查看哈希 student 中 age 的存在性:
- 使用命令
HKEYS
查看哈希中所有键 - 使用命令
HLENS
查看哈希中所有键值对的数量
(6)消息队列 Stream
- 使用命令
XADD
向消息队列中添加一条消息- 创建消息队列 stream 并添加消息:
XADD stream * message
*
表示消息 id 自动生成- id 由两个整数以及整数之间的
-
构成- 第一个整数表示时间戳
- 第二个整数表示序列号
- 创建消息队列 stream 并添加消息:
- 使用命令
XLEN
查看消息队列中消息的数量- 查看消息队列 stream 中消息的数量:
XLEN stream
- 查看消息队列 stream 中消息的数量:
- 使用命令
XRANGE
查看消息队列中消息的详细内容- 查看消息队列 stream 中所有消息的内容:
XRANGE stream - +
- 查看消息队列 stream 中所有消息的内容:
- 使用命令
XDEL
删除消息队列中的消息队列中通过 id 指定的消息- 删除消息队列 stream 中消息 id 为 1 的消息:
XDEL stream 1
- 删除消息队列 stream 中所有消息:
XTRIM stream MAXLEN 0
- 删除消息队列 stream 中消息 id 为 1 的消息:
- 使用命令
XREAD
消费消息XREAD COUNT 2 BLOCK 1000 STREAMS stream 0
COUNT 2
:一次读取两条消息BLOCK
:如果没有消息则阻塞 1000 毫秒STREAMS stream
:指定消息队列0
:从头开始读取
- 获取从现在开始最新的消息:
XREAD COUNT 2 BLOCK 1000 STREAMS stream $
$
:从最新消息开始读取
- 消费者读取消息队列 stream 最新消息:
XREADGROUP GROUP group1 consumer1 COUNT 2 BLOCK 3000 STREAMS stream >
- 使用命令
XGROUP
处理消费者组相关任务- 创建一个 id 为 0 的消费者组 group1 读取消息队列 stream 的消息:
XGROUP CREATE stream group1 0
- 为消费者组 group1 添加消费者 consumer1:
XGROUP CREATECONSUMER stream group1 comsumer1
- 创建一个 id 为 0 的消费者组 group1 读取消息队列 stream 的消息:
- 使用命令
XINFO GROUPS
查看消费者组的信息- 查看消息队列 stream 的消费者组信息:
XINFO GROUPS stream
- 查看消息队列 stream 的消费者组信息:
(7)地理空间 Geospatial
- 一种存储地理位置信息的数据结构,支持对地理位置进行各种计算操作
- 使用命令
GEOADD
添加地理空间- 创建地理空间 city,添加以下地理位置,经度为 120,纬度为 40,名称为 moudi:
GEOADD city 120 40 moudi
- 添加多个信息:
GEOADD city 1 1 a 2 2 b
- 创建地理空间 city,添加以下地理位置,经度为 120,纬度为 40,名称为 moudi:
- 使用命令
GEOPOS
获取地理空间中指定位置经纬度坐标- 查看 moudi 的经纬度坐标:
GEOPOS city moudi
- 查看 moudi 的经纬度坐标:
- 使用命令
GEODIST
计算两个地理位置的举例- 计算 a 地和 b 地的距离:
GEODIST city a b
(单位为米)
- 计算 a 地和 b 地的距离:
- 使用命令
GEOSEARCH
搜索指定范围内的成员并返回- 计算在 a 地方圆 100km 内的地理位置:
GEOSEARCH city FROMMEMBER a BYRADIUS 100 KM
- 计算在 a 地方圆 100km 内的地理位置:
(8)HyperLogLog
- 一种用来做基数统计的算法
- 基数:如果集合中的每个元素都是唯一且不重复的,那么这个集合的基数就是集合中元素的个数
- 特点:占用内存小,存在一定误差
- 使用命令
PFADD
添加元素- 创建 number 并添加数字 1 2 3:
PFADD number 1 2 3
- 创建 number 并添加数字 1 2 3:
- 使用命令
PFCOUNT
查看基数- 查看 number 的基数:
PFCOUNT number
- 查看 number 的基数:
- 使用命令
PFMERGE
合并多个 HyperLogLog- 合并 hll1 和 hll2:
PFMERGE hll hll1 hll2
- 合并 hll1 和 hll2:
(9)位图 Bitmap
- 位图是字符串类型的扩展,可以使用一个 String 类型来模拟一个 Bit 数组
- 使用命令
SETBIT
设置某个偏移量的值- 设置一个名为 like 的 Bitmap,其偏移量 0 设置为 1,偏移量 1 设置为 0:
SETBIT like 0 1
,SETBIT like 1 0
- 设置一个名为 like 的 Bitmap,其偏移量 0 设置为 1,偏移量 1 设置为 0:
- 使用命令
GETBIT
获取某个偏移量的值- 获取 like 偏移量 1 的值:
GETBIT like 1
- 获取 like 偏移量 1 的值:
- 使用命令
SET
批量设置某个键的各个偏移量对应的值- 设置 like2:
SET like2 "\xF0"
\xF0
转换为二进制数为 11110000
- 设置 like2:
- 使用命令
BITCOUNT
统计某个键的值里有多少个 1- 统计 like2:
BITCOUNT like2
- 统计 like2:
- 使用命令
BITPOS
可以获取某个键里第一个出现的 0 或 1 的位置- 获取 like2 第一个出现 0 的位置:
BITPOS like2 0
- 获取 like2 第一个出现 0 的位置:
(10)位域 BitField
- 位域能够将很多小的整数存储到一个较大的位图中,从而高效使用内存
- 使用命令
BITFIELD
可以设置位域BITFIELD player:1 set u8 #0 1
player:1
:键名,表示角色 idset
:设置u8
:八位无符号整数,表示角色等级#0
:表示第一个存储位置
BITFIELD player:1 get u8 #0
get
:获取
BITFIELD player:1 incrby u8 #0 2
incrby
:增加
0x06 事务
- Redis 支持事务,使得在一次请求中可以执行多个命令
- Redis 中的事务主要是通过
MULTI
和EXEC
命令实现的MULTI
命令用于开启一个事务,事务开启后,所有命令就会进入一个队列中EXEC
命令用于执行事务中的所有命令
- 事务并不能保证所有命令全部执行成功,但可以保证以下三点
- 在发送
EXEC
命令前,所有命令都会被放入一个队列中缓存起来,而非立即执行 - 在收到
EXEC
命令后,事务开始执行,任何一个命令执行失败不会导致事务暂停 - 在事务执行过程中,其他客户端提交的请求不会插入到该事务当中
- 在发送
- 使用命令
MULTI
开启一个事务,(TX)
说明进入了事务模式,此时输入需要执行的命令即可 - 在事务模式下,使用命令
EXEC
即可执行事务,完成上述指令
0x07 持久化
- 由于 Redis 是一个基于内存的数据库,断电等情况会导致数据丢失,故而需要持久化
- 实现持久化方式
- RDB(Redis Database) 方式
- RDB 是指在指定时间间隔内,将内存中的数据快照写入磁盘
- 数据快照是某个时间点上数据的完整副本,可以通过配置文件中的 save 参数配置
- 在终端直接使用命令
save
即可手动触发快照 - 由于不是实时保存数据,故而 RDB 方式更适合用来做备份
- 在生产环境中,Redis 所需的内存空间比较大,导致内存中的数据同步到硬盘的时间比较长,造成阻塞状态,不能进行操作。因此可以使用命令
bgsave
单独创建一个子进程来负责将内存中的数据写入到硬盘中,使主进程可以继续处理请求
- AOF(Append Only File)方式
- 解决 RDB 无法做到秒级快照的问题
- AOF 是指追加文件,原理是在执行写命令时,不仅将命令写入内存,还会写入到一个追加文件中,以日志的方式记录每个写操作,当 Redis 重启时就会重新执行 AOF 文件中的命令,从而重建数据库
- 开启 AOF 方式:在配置文件中,将
append only
参数的值改为 yes 即可
- RDB(Redis Database) 方式
0x08 主从复制
-
主从复制是指将一台 Redis 服务器的数据复制到其他 Redis 服务器,前者称为“主节点”(master),后者称为“从节点”(slave),主节点有多个从节点,从节点仅有一个主节点;数据的复制是单向的(主节点->从节点)
-
一般情况下,主节点负责写操作,从节点负责读操作
-
主节点会将自己的数据变化,通过异步的方式发送到从节点,从节点接收后更新自己的数据,从而达成数据一致
-
配置主从节点
-
使用命令
role
查看当前节点角色- 一般情况下默认为主节点
-
配置从节点
-
命令行方式,直接指定主节点的 IP 地址和端口
- 旧版:
slaveof host port
- 新版:
replicaof host port
- 旧版:
-
修改配置文件(redis.conf)方式
主节点:6379,从节点:6380
# 修改端口号 port 6380 # 修改 pidfile 配置项 pidfile /.../redis_6380.pid # 修改 dbfilename 配置项,此文件是持久化的文件 dbfilename dump-6380.rdb # 修改 replicaof 配置项,此项用来指定主节点 replicaof 127.0.0.1 6379
- 使用命令
redis-server redis-6380.conf
启动从节点 - 使用命令
redis-cli -p 6380
连接该从节点
- 使用命令
-
-
0x09 哨兵模式 Sentinel
- 哨兵会以一个独立的进程运行在 Redis 集群中,用来监控 Redis 集群中的各个节点是否运行正常
- 功能:
- 监控:通过不断发送命令检查 Redis 节点是否正常
- 通知:当发现某个节点出现问题时,哨兵就会通过发布订阅模式来通知其他节点
- 自动故障转移:当主节点不能正常工作时,哨兵会将一个从节点升级为主节点,并将其他从节点指向新的主节点
- 配置哨兵模式
- 在 Redis 集群中添加哨兵配置文件 sentinel.conf:
sentinel monitor master 127.0.0.1 6379 1
master
:是主节点的名称1
:表示只需要一个哨兵节点同意即可执行自动故障转移
- 启动哨兵节点:`redis-sentinel sentinel.conf
- 在 Redis 集群中添加哨兵配置文件 sentinel.conf:
-End-
标签:入门,stream,Redis,命令,查看,使用,节点 From: https://www.cnblogs.com/SRIGT/p/17573683.html