Redis
Redis
一、简单使用
1 简介
Redis(Remote Dictionary Server),基于内存的数据存储系统,非关系型数据库,用作数据库缓存和消息队列等各种场景。
访问方式:
- CLI:使用Redis-CLI命令行工具使用Redis
- API:使用Java或Python通过编写代码的方式访问Redis
- GUI:图形化界面使用Redis,如:RedisInsight
优势:
- 性能极高
- 数据类型丰富,单键值对最大支持512M大小的数
- 简单易用,支持所有主流编程语言
- 支持数据持久化、主从复制、哨兵模式等高可用特性
2 使用
2.1 linux
安装:
sudo apt update
sudo apt install redis-server
查看Redis服务是否正在运行:
sudo systemctl status redis-server
检查Redis是否成功安装并运行,如果返回
PONG
,则表示Redis正常工作:redis-cli ping
启动服务(端口:6379):命令
redis-server
管理:
- 启动Redis服务:
sudo systemctl start redis-server
- 停止Redis服务:
sudo systemctl stop redis-server
- 重新启动Redis服务:
sudo systemctl restart redis-server
2.2 windows
安装:
- 安装WSL,用WSL系统安装一个Linux,将Redis安装在Linux中
- 安装Docker将Redis安装在Docker中
- 官网安装(但版本较老,只有5.0):official::Releases · tporadowski/redis
启动服务(端口:6379):命令
redis-server.exe
2.3 管理
管理redis:
- redis-cli命令行:输入命令redis-cli
- GUI:official::RedisInsight | Redis
二、数据类型
1 Key
键。
# 删除键值(0:失败,1:成功) |
2 String
字符串。
redis的存储都是以二进制的形式存储的,所以在存储中文时会直接将值转化成二进制形式,此时使用
GET key
命令获得的是原始的十六进制。如果要显示中文则可以使用以下命令进入redis:redis-cli --raw
。此时中文将被显示。
# 设置键值 |
3 List
列表。
此处的key指的是列表的名称
# 添加数据 |
4 Set
集合
# 添加数据 |
5 SortedSet
有序集合
不同的是每个元素都会关联一个 double 类型的分数。redis 正是通过分数来为集合中的成员进行从小到大的排序。
有序集合的成员是唯一的,但分数(score)却可以重复。
# 添加元素 |
6 Hash
哈希。
key:hash表的名称。
field:键名。
value:键值。
# 添加元素 |
7 Stream
消息队列。
# 向制定消息队列中添加信息(*指任意ID),返回消息的ID |
8 Geospatial
地理空间。
# 添加城市信息(返回成功添加的城市的数量) |
9 Log
HyperLog。
用于做基数统计的算法。
基数是指数据集中不重复元素的个数。因为HyperLog内部实现是随机算法,所以在计算大数据时可能会存在一定的误差。因此适合用来做一些对精确度要求不高的大数据统计。比如统计某个词的搜索次数。
# 添加基数 |
10 Bitmap
位图。
对二进制位进行操作。通过偏移量来控制具体的位置。
BITMAP实质上是String的扩展,所以用String设置值也可以。
# 设置对应位图对应偏移上的值(0或1) |
# 设置coin值为11110000(可以用十六进制方式设置) |
11 Bitfield
位域。
位域可以将很多小的整数存储到一个较大的位图中,这样可以更加高效地使用内存。
# 设置位域(code:编码,#index:位置) |
# 假设你是一位游戏玩家,你有level、money、exp等属性,可以进行如下设置: |
三、应用
1 订阅
一种消息通信模式。发送者发送消息,订阅者接收消息。
在订阅者订阅消息后将一直监听发送者,当有新消息通过
PUBLISH
命令发送给对应频道时,这个消息就会被发送给对应的客户端。普通发送的消息无法持久化,无法记录历史消息。但是发布Stream则可以解决这些问题。
# 订阅频道 |
2 事务
在关系型数据库中,事务一般是一个原子操作,要么全部执行成功,要么全部执行失败。
在Redis,事务不能保证每一个命令都会执行成功,但是Redis可以保证以下几点:
- 批量操作在发送 EXEC 命令前被放入队列缓存。
- 收到 EXEC 命令后进入事务执行,事务中任意命令执行失败,其余的命令依然被执行。
- 在事务执行过程,其他客户端提交的命令请求不会插入到事务执行命令序列中。
# 开启事务(开启后命令提示符后面会多一个(TX)) |
# 某一个命令失败后面的命令依然会被执行 |
3 持久化
RDB(Redis Database):指在指定时间间隔内,将内存中的数据快照写入磁盘。适合做备份。
因为在save的过程中,redis主线程会阻塞,不可以做其他任何操作。而使用bgsave时,主线程需要先fork一个库,然后开一个子线程做save操作。但是在fork的时候主线程一样会阻塞。为了解决上述问题,redis提出了下面一个持久化存储的办法。
AOF(Append Only File):追加文件。原理是在执行写命令时,不仅会将命令写入内存中,还会将命令写入一个追加的文件中。该文件会以日志的形式记录每一个写操作。因此,当Redis重启时,它就可以通过重新执行AOF文件中的命令来在内存中重建整个数据库的内容。AOF需要手动开启。
# 修改配置 |
4 主从复制
将主节点的数据复制给从节点。一个主节点可以有多个从节点,但是一个从节点只能有一个主节点。
数据的复制是单向的,只能由主节点到从节点。主节点复制写操作,从节点负责读操作。主节点会将自己的数据变化通过异步的方式发给从节点。从节点收到数据后更新自己的数据。
下面是修改从节点的方式。(主节点不需要修改,因为默认就是主节点)
# 方法1:指定主节点(不常用) |
5 哨兵模式
当主节点宕机后,需要手动配置将从节点提升为主节点。
利用redis的哨兵模式,则可以自动地将从节点提升为主节点。
哨兵会以一个独立的进程运行在Redis集群中,用来监控Redis中的各个节点是否运行正常。主要功能如下:
- 监控:通过不断发送命令来检查Redis节点是否正常。
- 通知:当发现某个节点出现问题,哨兵就会通过发布订阅模式来通知其他节点。
- 自动故障转移:当主节点不能工作以后,哨兵将会将一个从节点升级为新的主节点,然后将其他从节点指向新的主节点。
实际生产环境中,哨兵节点也存在宕机的可能。因此一般会设置三个哨兵节点,这三个哨兵节点会通过选举的方式来选出一个领导者,然后由领导者来监控其他节点。领导挂了则其他哨兵节点会重新选举出一个领导者。
# 新建哨兵文件 |