目录
1 Redis的前世今生
1.1 简介
1.2 应用场景
2 Redis下载及安装
2.1 下载及安装
3 Redis使用
3.1 数据类型
3.2 持久化
3.3 事务
3.4 脚本
语法
4 Redis集群
4.1 主从模式
4.2 Sentinel模式
1.哨兵模式集群架构
2.哨兵模式作用
3.哨兵模式工作过程
4.3 Cluster模式
1.Cluster数据分区
2.Cluster高可用
3.Cluster数据分片
4.4 集群模式对比
主从模式优缺点
哨兵模式优缺点
Redis(Remote Dictionary Server ),即远程字典服务,是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的高性能的日志型、Key-Value数据库,并提供多种语言的API。Redis的出现补偿了memcached这类key/value存储的不足,在部分场合可以对关系数据库起到很好的补充作用。它提供了Java,C/C++,C#,PHP,JavaScript,Perl,Object-C,Python,Ruby,Erlang等客户端,使用很方便。
常见的16种应用场景:
缓存、数据共享分布式、分布式锁、全局 ID、计数器、限流、位统计、购物车、用户消息时间线 timeline、消息队列、抽奖、点赞、签到、打卡、商品标签、商品筛选、用户关注、推荐模型、排行榜.
Linux下载地址:Download | Redis,下载最新稳定版本。(Windows:https://github.com/tporadowski/redis/releases。)
本教程使用的最新文档版本为 2.8.17,下载并安装:
# wget http://download.redis.io/releases/redis-6.0.8.tar.gz
# tar xzf redis-6.0.8.tar.gz
# cd redis-6.0.8
# make
执行完 make 命令后,redis-6.0.8 的 src 目录下会出现编译后的 redis 服务程序 redis-server,还有用于测试的客户端程序 redis-cli:
下面启动 redis 服务:
# cd src
# ./redis-server
注意这种方式启动 redis 使用的是默认配置。也可以通过启动参数告诉 redis 使用指定配置文件使用下面命令启动。
# cd src
# ./redis-server ../redis.conf
redis.conf 是一个默认的配置文件。我们可以根据需要使用自己的配置文件。
启动 redis 服务进程后,就可以使用测试客户端程序 redis-cli 和 redis 服务交互了。 比如:
# cd src
# ./redis-cli
redis> set foo bar
OK
redis> get foo
"bar"
redis提供了两种持久化的方式,分别是RDB(Redis DataBase)和AOF(Append Only File)。
其实RDB和AOF两种方式也可以同时使用,在这种情况下,如果redis重启的话,则会优先采用AOF方式来进行数据恢复,这是因为AOF方式的数据恢复完整度更高。
如果你没有数据持久化的需求,也完全可以关闭RDB和AOF方式,这样的话,redis将变成一个纯内存数据库,就像memcache一样
Redis 事务可以一次执行多个命令, 并且带有以下三个重要的保证:
一个事务从开始到执行会经历以下三个阶段:
Redis 事务的相关命令:
序号 | 命令及描述 |
---|---|
1 | DISCARD 取消事务,放弃执行事务块内的所有命令。 |
2 | EXEC 执行所有事务块内的命令。 |
3 | MULTI 标记一个事务块的开始。 |
4 | UNWATCH 取消 WATCH 命令对所有 key 的监视。 |
5 | WATCH key [key ...] 监视一个(或多个) key ,如果在事务执行之前这个(或这些) key 被其他命令所改动,那么事务将被打断。 |
Redis 脚本使用 Lua 解释器来执行脚本。 Redis 2.6 版本已内嵌支持 Lua 环境。执行脚本的常用命令为 EVAL。
Eval 命令的基本语法如下:
redis 127.0.0.1:6379> EVAL script numkeys key [key ...] arg [arg ...]
Redis 脚本常用命令:
序号 | 命令及描述 |
---|---|
1 | EVAL script numkeys key [key ...] arg [arg ...] 执行 Lua 脚本。 |
2 | EVALSHA sha1 numkeys key [key ...] arg [arg ...] 执行 Lua 脚本。 |
3 | SCRIPT EXISTS script [script ...] 查看指定的脚本是否已经被保存在缓存当中。 |
4 | SCRIPT FLUSH 从脚本缓存中移除所有脚本。 |
5 | SCRIPT KILL 杀死当前正在运行的 Lua 脚本。 |
6 | SCRIPT LOAD script 将脚本 script 添加到脚本缓存中,但并不立即执行这个脚本。 |
1.主从复制概念
主从复制,是指将一台Redis服务器的数据,复制到其他的Redis服务器。前者称为主节点(Master),后者称为从节点(Slave);数据的复制是单向的,只能由主节点到从节点。默认情况下,每台Redis服务器都是主节点;且一个主节点可以有多个从节点(或没有从节点),但一个从节点只能有一个主节点。
2.主从复制流程
若启动一个Slave机器进程,则它会向Master机器发送一个"sync_command"命令,请求同步连接。
无论是第一次连接还是重新连接,Master机器都会启动一个后台进程,将数据快照(RDB)保存到
数据文件中(执行rdb操作),同时Master还会记录修改数据的所有命令并缓存在数据文件中。
后台进程完成缓存操作之后,Master机器就会向Slave机器发送数据文件,Slave端机器将数据
文件保存到硬盘上,然后将其加载到内存中,接着Master机器就会将修改数据的所有操作一并发送给Slave端机器。若Slave出现故障导致宕机,则恢复正常后会自动重新连接。
Master机器收到slave端机器的连接后,将其完整的数据文件发送给Slave端机几器,如果Mater同时收到多个slave发来的,同步请求则Master会在后台启动一个进程以保存数据文件,然后将其发送给所有的Slave端机器,确保所有的Slave端机器都正常。
是一个分布式系统,用于对主从结构中的每台服务器进行监控,当出现故障时通过投票机制选择新的 Master 并将所有 Slave 连接到新的 Master。所以整个运行哨兵的集群的数量不得少于3个节点。哨兵是Redis集群架构中非常重要的一个组件,哨兵的出现主要是解决了主从复制出现故障时需要人为干预的问题。
集群监控:负责监控Redismaster和slave进程是否正常工作。
消息通知:如果某个Redis实例有故障,那么哨兵负责发送消息作为报敬通知给管理员。
故障转移:如果masternode挂掉了,会自动转移到slave node上。
配置中心:如果故障转移发生了,通知client客户端新的master地址。
(1)三个哨兵之间建立命令连接,周期性检测队友状态。
(2)哨兵会向master节点(已在配置文件中)发送两条连接,分别是命令连接和订阅连接(为了周期性获取master节点的数据)。
(3)哨兵想master周期性发送info命令,master(活着的情况下)会返回redis-cil inforeplication master 节点的信息+从节点位置。
(4)哨兵通过master返回的信息,再会向slaves 节点发送info命令,slaves返回数据,从而哨兵集群就可以获取到redis所有集群信息。
(5)哨兵会向服务器发送命令连接,建立自己的hello频道,哨兵会向这个hello频道建立订阅,用于哨兵之间的消息共享。
redis的哨兵模式基本已经可以实现高可用、读写分离,但是在这种模式每台redis服务器都存储相同的数据,很浪费内存资源,所以在redis3.0上加入了Cluster群集模式,实现了redis的分布式存储,也就是说每台redis节点存储着不同的内容根据官方推荐,集群部署至少要3台以上的master节点,最好使用3主3从六个节点的模式。
数据分区(或称数据分片)是集群最核心的功能,集群将数据分散到多个节点,一方面突破了 Redis 单机内存大小的限制,存储容量大大增加,另一方面每个主节点都可以对外提供读服务和写服务,大大提高了集群的响应能力,Redis 单机内存大小受限问题,在介绍持久化和主从复制时都有提及。
集群支持主从复制和主节点的自动故障转移(与哨兵类似),当任意节点发送故障时,集群仍然可以对外提供服务。
Redis 集群引入了哈希槽的概念,有 16384 个哈希槽(编号 0~16383)。集群的每个节点负责一部分哈希槽,每个 Key 通过 CRC16 校验后对 16384 取余来决定放置哪个哈希槽,通过这个值,去找到对应的插槽所对应的节点,然后直接自动跳转到这个对应的节点上进行存取操作。
以 3 个节点组成的集群为例:
节点 A 包含 0~5469 号的哈希槽
节点 B 包含 5461~10922 号的哈希槽
节点 C 包含 10923~16383 号的哈希槽
主从模式优缺点
优点: 主从结构具有读写分离,提高效率、数据备份,提供多个副本等优点。
不足: 最大的不足就是主从模式不具备自动容错和恢复功能,主节点故障,集群则无法进行工作,可用性比较低,从节点升主节点需要人工手动干预。
哨兵模式优缺点
优点: 哨兵模式是基于主从模式的,解决可主从模式中master故障不可以自动切换故障的问题。
不足: (1)是一种中心化的集群实现方案:始终只有一个Redis主机来接收和处理写请求,写操作受单机瓶颈影响。
(2)集群里所有节点保存的都是全量数据,浪费内存空间,没有真正实现分布式存储。数据量过大时,主从同步严重影响master的性能。
(3)Redis主机宕机后,哨兵模式正在投票选举的情况之外,因为投票选举结束之前,谁也不知道主机和从机是谁,此时Redis也会开启保护机制,禁止写操作,直到选举出了新的Redis主机。
Redis Cluster模式优缺点
优点: 数据依照slot存储分布在多个节点,节点间数据共享,能够动态调整数据分布;可扩展性;无中心架构;高可用性;能够降低运维成本,有效提高系统的可用性以及扩展性。
不足: 数据通过异步复制,不保证数据的强一致性;Client 实现复杂;节点会因为某些原因发生阻塞被判断下线;多个业务使用同一套集群的时候,不能够依据统计区分冷热数据,资源隔离性较差,非常容易出现互相影响;Slave 在集群中充当“冷备”,不能缓解读压力;Key批量操作限制;Key事务操作支持有限;Key不可以将一个很大的键值对象如 hash、list 等映射到不同的节点;不支持多数据库空间;复制结构只支持一层;避免产生hot-key,导致主库节点成为系统的短板;避免产生 big-key,导致网卡撑爆、慢查询等;重试时间应该大于cluster-node-time时间;