Redis 介绍
Redis 是一个开源 (BSD 许可) 的, 内存中的数据结构存储系统, 它可以用作数据库, 缓存和消息中间件
Redis 是 c 语言编写的, 支持数据持久化, 是 key-value 类型数据库.
应用在缓存, 队列系统中
Redis 支持数据备份, 也就是 master-slave 模式
Redis 一秒可以执行 10 万个命令
Redis 为什么这么快?
1. 是完全基于内存数据库
2.Redis 是完全用 c 写的单线程的数据库
Redis 如何安装
1.yum 安装
安装: yum install Redis -y
卸载: yum remove Redis -y
启动: systemctl start Redis
查看监听端口: netstat -tunlp
2.Redis 编译安装(注意删除安装的 Redis)
编译安装三部曲
1. 下载 Redis 源码
wget http://download.redis.io/releases/redis-4.0.10.tar.gz
2. 解压缩 tar -zxvf Redis-4.0.10.tar.gz
3. 切换 Redis 源码目录 cd Redis-4.0.10
4. 编译源文件 make
5. 编译好后, src / 目录下有编译好的 Redis 指令
6.make install 安装到指定目录, 默认在 / usr/local/bin
添加环境变量: VIM /etc/profile
path= "/usr/local/bin"
重新加载变量文件: source /etc/profile
grep -v "^$" Redis.conf |grep -v "^#" 去注释 #
4. 更改 Redis 的配置文件, 启动 Redis, 支持密码和端口
touch Redis.s18.conf 内容如下:
bind 192.168.91.128# 连接 ipprotected-mode yes# 开启 Redis 安全模式 port 6800# 端口 daemonize yes#Redis 后台启动 pidfile /var/run/redis_6379.pidloglevel noticelogfile ""requirepass 123456 #密码
启动: Redis-server Redis.s18.conf
检测端口: netstat -tunlp
5. 登陆 Redis 客户端
Redis-cli -h 192.168.91.128 -p 6800
参数解释 - h 指定主机地址 -p 指定 Redis 端口
登陆之后通过 auth 指令 验证密码
Redis 可执行文件
- ./Redis-benchmark // 用于进行 Redis 性能测试的工具
- ./Redis-check-dump // 用于修复出问题的 dump.rdb 文件
- ./Redis-cli //Redis 的客户端
- ./Redis-server //Redis 的服务端
- ./Redis-check-aof // 用于修复出问题的 AOF 文件
- ./Redis-sentinel // 用于集群管理
Redis 数据类型
Redis 是一种高级的 key:value 存储系统, 其中 value 支持五种数据类型
字符串(strings)
散列(hashes)
列表(lists)
集合(sets)
有序集合(sorted sets)
Redis 存放的数据是 key, 然后通过 value 来取值
keys * 查看所有 key
type key 查看 key 类型
expire key seconds 设置过期时间
ttl key 查看 key 过期剩余时间 -2 表示 key 已经不存在了
persist key 取消 key 的过期时间 -1 表示 key 存在, 没有过期时间
?
exists key 判断 key 存在 存在返回 1 否则 0
del keys 删除 key 可以删除多个
dbsize 计算 key 的数量
set key 名 value 名
set kevins 凯文
ger kevins 取值
1.strings 类型
set 设置 key
get 获取 key
append key 追加 string
mset 设置多个键值对
mget 获取多个键值对
del 删除 key
incr key 递增 + 1
decr key 递减 - 1
Redis 发布订阅
发布订阅的命令
PUBLISH channel msg
将信息 message 发送到指定的频道 channel
SUBSCRIBE channel [channel ...]
订阅频道, 可以同时订阅多个频道
UNSUBSCRIBE [channel ...]
取消订阅指定的频道, 如果不指定频道, 则会取消订阅所有频道
PSUBSCRIBE pattern [pattern ...]
订阅一个或多个符合给定模式的频道, 每个模式以 * 作为匹配符, 比如 it* 匹配所 有以 it 开头的频道( it.news , it.blog , it.tweets 等等), news.* 匹配所有 以 news. 开头的频道( news.it , news.global.today 等等), 诸如此类
PUNSUBSCRIBE [pattern [pattern ...]]
退订指定的规则, 如果没有参数则会退订所有规则
PUBSUB subcommand [argument [argument ...]]
查看订阅与发布系统状态
注意: 使用发布订阅模式实现的消息队列, 当有客户端订阅 channel 后只能收到后续发布到该频道的消息, 之前发送的不会缓存, 必须 Provider 和 Consumer 同时在线.
Redis 持久化 RDB 与 AOF**
1. 当进程挂掉, 只要内存数据被释放, Redis 的 数据默认是会丢
2.Redis 支持数据持久化, 两种模式
rdb 持久化, 是基于内存数据快照的方式, 通过 save 指令, 强制快照到数据本地, 存储为一个二进制文件
3. 开启 rdb 功能, 需要修改 Redis.conf 文件
内容如下:
- daemonize yes
- port 6379
- logfile /data/6379/Redis.log
- dir /data/6379
- dbfilename dbmp.rdb
- bind 127.0.0.1
- save 900 1
- save 300 10
- save 30 10000
4. 开启 Redis 服务端, 支持 rdb 功能
Redis-server Redis-rdb.conf
5. 登陆 Redis, 写入数据, 手动执行 save 触发持久化, 会生成一个二进制的数据文件 dbmp.rdb, 在 / data/6379/Redis.log 目录下
Redis 持久化之 RDB 实践
1. 将修改类的 Redis 命令, 记录到一个日志中, 以保证数据不丢, 下次重启, 再执行这个文件, 数据就回来
2. 开启 rdb 模式, 修改 Redis-aof.conf 配置如下:
- daemonize yes
- port 6379
- logfile /data/6379/Redis.log
- dir /data/6379
- appendonly yes
- appendfsync everysec
3. 指定 aof 配置文件启动
Redis-server Redis-aof.conf
Redis 持久化方式有哪些? 有什么区别?
rdb: 基于快照的持久化, 速度更快, 一般用作备份, 主从复制也是依赖于 rdb 持久化功能
aof: 以追加的方式记录 Redis 操作日志的文件. 可以最大程度的保证 Redis 数据安全, 类似于 MySQL 的 binlog
Redis 在不重启的状态下, 切换 rdb 持久化到 aof 持久化
1. 准备一个支持 rdb 数据
配置文件 Redis-new-rdb.conf 如下:
- daemonize yes
- port 6379
- logfile /data/6379/Redis.log
- dir /data/6379
- dbfilename dbmp.rdb
- bind 127.0.0.1
- save 900 1
- save 300 10
save 30 10000 库
2. 通过命令切换到 aof 功能, 临时生效
- CONFIG set appendonly yes #开启 AOF 功能
- CONFIG SET save "" #关闭 RDB 功能
3. 还得修改 Redis 的配置文件, 让他下次重启也是 aof 模式
修改 Redis-new-rdb.conf 配置如下:
daemonize yesport 6379logfile /data/6379/Redis.logdir /data/6379appendonly yesappendfsync everysec
4.Redis 已经切换到 aof 模式
Redis 主从同步
1.Redis 是支持多实例的数据库 , 在一台机器上, 可以运行多个隔离的数据库环境
实现多实例就是准备多个配置文件
替换: sed "s/6379/6380/g" Redis-6379.conf> Redis-6380.conf
准备 3 个配置文件, 实现, 一主两从的 Redis 数据架构
准备的 3 个配置文件, 仅仅是端口的区分就行
- port 6379daemonize yespidfile /data/6379/Redis.pidloglevel noticelogfile "/data/6379/redis.log"dbfilename dump.rdbdir /data/6379protected-mode no
- port 6380daemonize yespidfile /data/6380/Redis.pidloglevel noticelogfile "/data/6380/redis.log"dbfilename dump.rdbdir /data/6380protected-mode no
- slaveof 127.0.0.1 6379
- port 6381daemonize yespidfile /data/6381/Redis.pidloglevel noticelogfile "/data/6381/redis.log"dbfilename dump.rdbdir /data/6381protected-mode no
- slaveof 127.0.0.1 6379
追加命令: echo "slaveof 127.0.0.1 6379">> Redis-6381.conf
三个同样的文件
建立文件夹: mkdir -p /data/{6379,6380,6381}
分别启动三个 Redis 数据库实例
- Redis-server Redis-6379.conf
- Redis-server Redis-6380.conf Redis-server Redis-6381.conf
查看三个数据库的身份信息, 检测主从状态
进入: Redis-cli -p 6379
输入: info
查看 Replication 结果:
role:masterconnected_slaves:2slave0:ip=127.0.0.1,port=6380,state=online,offset=280,lag=1slave1:ip=127.0.0.1,port=6381,state=online,offset=280,lag=1master_replid:8ebe1c8b3f2211e1be132332d7548d059cffc954master_replid2:0000000000000000000000000000000000000000master_repl_offset:280second_repl_offset:-1repl_backlog_active:1repl_backlog_size:1048576repl_backlog_first_byte_offset:1repl_backlog_histlen:280
测试写入主库 6379 数据, 查看两个从库的信息, 确认 6380,6381
演示干掉主库, 手动切换主从故障
1. 手动检查进程, 杀死主库, 演示故障
2. 手动切换某一个从库, 换成主库身份
就是 Redis-cli -p 6380 登陆 6380 后, 输入 slaveof on one, 去掉自己的 slave 身份
3. 将 6381 重新指引到 6380 位从库,
Redis-cli -p 6381 登陆 6381 后, 输入 slaveof 127.0.0.1 6380
4. 手动改配置文件
自动的 Redis 主从切换, 是哨兵功能
/opt/s18redis 目录下
1. 环境配置 准备 3 个 Redis 数据库实例
准备 3 个配置文件
- Redis-6379.conf
- port 6379
- daemonize yes
- logfile "6379.log"
- dbfilename "dump-6379.rdb"
- dir "/var/redis/data/"
- Redis-6380.conf
- port 6380
- daemonize yes
- logfile "6380.log"
- dbfilename "dump-6380.rdb"
- dir "/var/redis/data/"
- slaveof 127.0.0.1 6379 // 从属主节点
- Redis-6381.conf
- port 6381
- daemonize yes
- logfile "6380.log"
- dbfilename "dump-6380.rdb"
- dir "/var/redis/data/"
- slaveof 127.0.0.1 6379 // 从属主节点
建立文件夹: mkdir -p /data/{6379,6380,6381}
检测身份信息: Redis-cli -p 6370 进入后输入: info
此时再准备三个哨兵, 就是三个值班的, 检测 Redis 主从状态
三个哨兵配置文件如下:
- Redis-26379.conf
- port 26379
- dir /var/Redis/data/
- logfile "26379.log"
- // 当前 Sentinel 节点监控 127.0.0.1 6379 这个主节点
- // 2 代表判断主节点失败至少需要 2 个 Sentinel 节点节点同意
- // s18ms 是主节点的别名
- sentinel monitor s18ms 127.0.0.1 6379 2
- // 每个 Sentinel 节点都要定期 PING 命令来判断 Redis 数据节点和其余 Sentinel 节点是否可达, 如果超过 30000 毫秒 30s 且没有回复, 则判定不可达
- sentinel down-after-milliseconds s18ms 30000
- // 当 Sentinel 节点集合对主节点故障判定达成一致时, Sentinel 领导者节点会做故障转移操作, 选出新的主节点, 原来的从节点会向新的主节点发起复制操作, 限制每次向新的主节点发起复制操作的从节点个数为 1
- sentinel parallel-syncs s18ms 1
- // 故障转移超时时间为 180000 毫秒
- sentinel failover-timeout s18ms 180000
- daemonize yes
- Redis-26380.conf
- port 26380dir /var/Redis/data/logfile "26380.log"
- sentinel monitor s18ms 127.0.0.1 6379 2sentinel down-after-milliseconds s18ms 30000
- sentinel parallel-syncs s18ms 1sentinel failover-timeout s18ms 180000daemonize yes
- Redis-26381.conf
- port 26381dir /var/Redis/data/logfile "26381.log"
- sentinel monitor s18ms 127.0.0.1 6379 2sentinel down-after-milliseconds s18ms 30000
- sentinel parallel-syncs s18ms 1sentinel failover-timeout s18ms 180000daemonize yes
分别启动三个哨兵
536 Redis-sentinel Redis-26379.conf 537 Redis-sentinel Redis-26380.conf 538 Redis-sentinel Redis-26381.conf
查看哨兵信息:
Redis-cli -p 26379
输入: info sentinel
此时哨兵已经正确, 三个哨兵, 检测者一主两从:
sentinel_masters:1sentinel_tilt:0sentinel_running_scripts:0sentinel_scripts_queue_length:0sentinel_simulate_failure_flags:0master0:name=s18ms,status=ok,address=127.0.0.1:6379,slaves=2,sentinels=3
自动主从故障切换演练
1. 干掉 3679, 查看 6380 和 6381 的身份信息
2. 正确是 哨兵会选举 6380 为新的 master, 然后为 6380 为 6381 新 salve
3. 当 6379 重新复活之后, 会自动添加到主从架构之中
Redis-cluster 的集群搭建
1. 环境准备, 准备 6 个节点(6 批马儿), 指的就是启动 6 个 Redis 数据库实例
6 个节点仅仅是端口不同
- Redis-7000.conf
- port 7000
- daemonize yes
- dir "/opt/redis/data"
- logfile "7000.log"
- dbfilename "dump-7000.rdb"
- cluster-enabled yes #开启集群模式
- cluster-config-file nodes-7000.conf #集群内部的配置文件
- cluster-require-full-coverage no #Redis cluster 需要 16384 个 slot 都正常的时候才能对外提供服务, 换句话说, 只要任何一个 slot 异常那么整个 cluster 不对外提供服务. 因此生产环境一般为 no
五个文件仅仅的是端口不同
- Redis-7001.conf
- port 7001
- daemonize yes
- dir "/opt/redis/data"
- logfile "7001.log"
- dbfilename "dump-7001.rdb"
- cluster-enabled yes
- cluster-config-file nodes-7001.conf
- cluster-require-full-coverage no
- Redis-7002.conf
- Redis-7003.conf
- Redis-7004.conf
- Redis-7005.conf
分别启动 6 个 Redis 数据实例
[[email protected] s18cluster]# Redis-server Redis-7000.conf [[email protected] s18cluster]# Redis-server Redis-7001.conf [[email protected] s18cluster]# Redis-server Redis-7002.conf [[email protected] s18cluster]# Redis-server Redis-7003.conf [[email protected] s18cluster]# Redis-server Redis-7004.conf [[email protected] s18cluster]# Redis-server Redis-7005.conf
检查集群状态
Redis-cli -p 7000
进行 Redis-cluster 集群槽位分配
Redis 官方提供了 Ruby 语言的脚本, 进行自动槽位分配
perl python Ruby 都是脚本语言
1. 安装准备 Ruby 语言的环境, 用于自动化创建 Redis 集群
- # 下载 Ruby
- wget https://cache.ruby-lang.org/pub/ruby/2.3/ruby-2.3.1.tar.gz
- # 安装 Ruby
- tar -xvf Ruby-2.3.1.tar.gz
- ./configure --prefix=/opt/Ruby/
- make && make install
- # 准备一个 Ruby 命令 #准备一个 Gem 软件包管理命令
- # 拷贝 Ruby 命令到 path 下 / usr/local/Ruby
- cp /opt/Ruby/bin/Ruby /usr/local/cp bin/Gem /usr/local/bin
2. 编译安装完成后, 添加环境变量
把 bin 添加环境变量:
- [[email protected] bin]# pwd/opt/Ruby/bin
- VIM /etc/profile
- source /etc/profile
3. 通过 Ruby 的软件包管理工具安装 Redis 模块(Gem 就是类似 python 的 pip 工具)
在 opt/s18cluster / 目录下
- wget http://rubygems.org/downloads/redis-3.3.0.gem
- # 通过 Gem 安装这个 Redis 包
- Gem install -l Redis-3.3.0.Gem
- # 查看 Gem 有哪些包
- Gem list -- check Redis Gem
4. 找到 Ruby 创建 Redis 集群的脚本工具
命令: find /opt -name Redis-trib.rb
结果:/opt/Redis-4.0.10/src/Redis-trib.rb
5. 此时就可以通过 Ruby 来创建 Redis 的集群, 分配槽点
一键开启 Redis-cluster 集群
- # 每个主节点, 有一个从节点, 代表 --replicas 1
- /opt/Redis-4.0.10/src/Redis-trib.rb create --replicas 1 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005
6. 集群已经创建成功
- Redis-cli -p 7000 -c#-c 是集群的模式
- 127.0.0.1:7000> set name kevins-> Redirected to slot [5798] located at 127.0.0.1:7001OK
来源: http://www.bubuko.com/infodetail-3362650.html