一,常见非关系数据库和sql
关系型数据库 mysql oracle
非关系型数据库mongodb redis
二, redis重要特性
1.速度快,源码少,不依赖操作系统中的类库
redis 所有的数据都存放在内存中
redis 使用c语言实现
redis 使用单线程架构
2.基于键值对的数据结构服务器
物种数据结构:
字符串: 设置一个key mset k1 2 k2 3 k4 4 MSET,MGET
哈希:由键值对组成 HMSET指令设置hash中的多个域
**生成一个hash类型:**
HMSET user:1 name xiaozhang job it age 28
HMSET user:2 name abc job it age 28
HMSET user:3 name def job it age 28
**查看hash里的多个值**
HMGET user:1 name age job
**查看hash里的所有的值**
HGETALL user:1
**mysql数据和redis哈希对比:**
user表
uid name job age
1 xiaozhang it 28
2 xiaoya it 28
3 yazhang it 28
**redis缓存mysql数据**
名字 key1 k1值 key2 k2的值 key3 k3的值
uid:1 name xiaozahng job it age 28
uid:2 name xiaoya job it age 28
uid:3 name yazahng job it age 28
列表
集合
有序集合
3.丰富的功能
提供键过期功能,可以实现缓存。使用单线程模型,服务端处理模型简单。客户端语言多,java,PHP,python,C, Nodejs等
4. redis支持数据的持久化
实现把所有数据存放在内存中RDB和AOF
5. redis的主从复制和高可用
哨兵 redis-sentinel
集群 redis-cluster
三 redis的应用场景
1. 缓存过期时间,就是设置k值过期 expire k1 100 设置100秒过期
persist k1 取消过期时间
缓存session会话
缓存用户信息,找不到再去mysql查,查到然后回写到redis
优惠卷过期时间
2. 排行榜-列表&有序集合
热度排行榜
发布时间排行榜
3. 计数器天然支持计数器 INCR K1(加1)INCRBY K1 10(加10)
如 帖子浏览数
视频播放次数
商品浏览数
4. 社交网络-集合
5. 消息列队系统-发布订阅
配合ELK实现日志收集
四 redis持久化
总所周知redis是内存数据库,当redis所在服务器宕机所以数据就会丢失,为解决这个问题 redis 用rdb 和aof来解决
牛逼持久化链接 https://www.shuzhiduo.com/A/amd0oNam5g/
用RDB和AOF实现
RDB:实现快照功能,把当前内存里的状态快照到磁盘上
优点,恢复速度快
缺点:可能会丢失数据
AOF:类似与mysql的binlog,重写 一秒一次
优点,安全,有可能丢失一秒的数据
缺点,文件比较大,恢复速度慢
当插入一个新K时会1秒后先触发aof文件记录内容,故当rdb和aof文件同时存在时 优先读取aof文件。
RDB的配置文件配置持久化参数
save 900 1
save 300 10
save 60 10000 60秒发生一万次K的该变就会触发将数据写入到磁盘
dir /data/redis_6379/
dbfilename redis_6379.rdb
结论:
1.执行shutdown的时候,内部会自动执行bgsave,然后再执行 shutdown
2.pkill kill killall 都类似于执行shutdown命令.会触发bgsave持久化
3.恢复的时候,rdb文件名称要和配置文件里写的一样
4.如果没有配置save参数,执行shutdown不会自动bgsave持久化
5.如果没有配置save参数,可以手动执行bgsave触发持久化保存
五,redis的高可用原理
建立主从,在redis服务器上设置哨兵监控主从状态实时进 行故障转移。当主故障库修复后,如果想恢复主库的地位,需要手动设置权重为0,然后重建手动改变
10.模拟权重选举
- 设置其他节点的权重为0
- 手动发起重新选举
- 观察所有节点消息是否同步
- 观察切换结果是否符合预期
命令解释:
1.查询命令:CONFIG GET slave-priority
2.设置命令:CONFIG SET slave-priority 0
3.主动切换:sentinel failover mymaster
操作命令:
redis-cli -h db02 -p 6379 CONFIG SET slave-priority 0
redis-cli -h db03 -p 6379 CONFIG SET slave-priority 0
redis-cli -h db01 -p 26379 sentinel failover mymaster
验证选举结果:
redis-cli -h db01 -p 26379 Sentinel get-master-addr-by-name mymaster
恢复DB01主哨兵后 恢复正常的优先级
redis-cli -h db02 -p 6379 CONFIG SET slave-priority 100
redis-cli -h db03 -p 6379 CONFIG SET slave-priority 100
五,redis的主从复制高可用
redis的主从复制,时在分布式系统中解决单点问题,通常会将数据复制多个副本到其他机器上,满足故障恢复和负载均衡。同时复制功能也是运行高可用的基础。
六,主从复制哨兵
运行在redis的主从复制模式下,解 决主节点一旦发生故障不需要人工干 预的问题,redis的哨兵方案实现的高 可用对系统可用性非常由帮助。
redis sentinel时一个分布式系统,为redis提供高可用功能,主要功能是1. 监控redis服务器节点看主从之间是否运行正常
2.提醒运维运维人员发送故障通知
3.自动故障迁移failover,当主服务 器故障时 哨兵会开始一次故障迁移操作,选择该主从中的一个从节点作为新主,并让其他的从服务器重新复制新主的数据。并且当客户端连接原先的主服务器时,集群也会像客户端返回新主的地址。架构图如下
哨兵安装配置命令
哨兵是基于主从复制,所以需要先部署好主从复制
手工操作步骤如下: 1.先配置和创 建好 1 台服务器的节点和哨兵 2.使用 rsync 传输到另外 2 台机器 3.修改另外两台机器的 IP 地址 建议使用 ansible 剧本批量部署
配置主从关系
db02 和 db03
redis-server /opt/redis_6379/conf/redis_6379.conf
redis-cli slaveof 10.0.0.51 6379
ps -ef|grep redis
启动哨兵
3 台都操作
redis-sentinel /opt/redis_26379/conf/redis_26379.conf
,手动恢复主库,既模拟故障恢复
1.主发生故障后,,观察其他从库的日志变化,故障转移后哨兵配置文件的变化。
2. 修好主库后开启主库,在从库中设置优先级为0:.查询命令:CONFIG GET slave-priority
3.设置命令:CONFIG SET slave-priority 0
4.再在主库中sentinel failover mymaster.重新设置自己为主
5.改回原先设置的从优先级默认的值100,方便下次故障转移。
七,redis Cluster
redis cluster 时redis的分布式解决方案,在3.0版本正式推出
当遇到单机,内存,并发,流量等瓶颈时,可用采用cluster架构方案达到负载均衡目的。
官方的redis Cluster集群方案, 很好的解决了集群方面的问题
分布式redis数据库时将整个数据库按照分区规则映射到多个节点,将数据集划分到多个节点上,
每个节点负责整体数据的一个子集,采用的是hash分片规则。
集群规划目录规划
redis 安装目录
/opt/redis_{PORT}/{conf,logs,pid}
redis 数据目录
/data/redis_{PORT}/redis_{PORT}.rdb
redis 运维脚本
/root/scripts/redis_shell.sh