redis保护模式、持久化、数据类型、弱事务、主从原理、哨兵原理、redis-cluster原理、API支持

Redis

1.Redis 功能介绍

数据类型介绍
支持持久化
多种内存分配及回收策略
支持事务
支持高可用
支持分布式分片集群 
Redis  API

2.企业缓存产品介绍

Memcached :
优点:高性能读写、单一数据类型、支持客户端式分布式集群、一致性hash
多核结构、多线程读写性能高。
缺点:无持久化、节点故障可能出现缓存穿透、分布式需要客户端实现、跨机房数据同步困难、架构扩容复杂度高
Redis
优点:高性能读写、多线程类型支持、数据持久化、高性能架构、支持自定义虚拟机内存、支持分布式分片集群、单线程读写性能极高。
缺点:多线程读写较Memcached慢
memcache 与redis 在读性能的对比
memcached 适合,多用户访问,每个用户少量的rw
redis 适合,少用户访问,每个用户大量rw

Tair
优点:高性能读写、支持三种存储引擎(ddb、rdb、ldb)、支持高可用、支持分布式分片集群、支撑了几乎所有淘宝业务的缓存。

3.Redis 使用场景介绍

Memcached:多核的缓存服务,更加适合于多用户并发访问次数较少的应用场景
Redis:单核的缓存服务,单节点情况下,更加适合于少量用户,多次访问的应用场景。
Redis :一般是单机多实例架构,配合redis集群出现。

4.Redis 安装部署:

下载:
wget http://download.redis.io/releases/redis-3.2.12.tar.gz
在这里插入图片描述
解压:
上传至 /data
tar xzf redis-3.2.12.tar.gz

mv redis-3.2.12 redis

安装:
yum -y install gcc automake autoconf make
cd redis
make 安装
在这里插入图片描述
在这里插入图片描述
环境变量:
vim /etc/profile
export PATH=/opt/redis-3.2.12/src:$PATH
在这里插入图片描述
source /etc/profile 生成环境变量
在这里插入图片描述

启动Redis

redis-server &
在这里插入图片描述

连接测试

在这里插入图片描述

redis.io 官方网址

在这里插入图片描述

5 、Redis基本管理操作

5.1 基础配置文件介绍

mkdir /data/6379
cat > /data/6379/redis.conf << EOF
daemonize yes
port 6379
logfile /data/6379/redis.log
dir /data/6379
dbfilename dump.rdb
EOF
在这里插入图片描述
在这里插入图片描述

redis-cli shutdown
redis-server /data/6379/redis.conf
netstat -lnp |grep 63
########配置文件说明###############
redis.conf
是否后台运行
daemonize yes
默认端口
port 6379
日志定义文件位置
logfile /var/log/redis.log
持久化文件存储位置
dir /data/6379
RDB持久化数据文件:
dbfilename dump.rdb
++++++++++++++++++++++++++++++++++++
redis-cli

5.2 redis 安全配置

在这里插入图片描述
redis默认开启了保护模式,只允许本地回环地址登录并访问数据库。
禁止protected-mode
protected-mode yes/no (保护模式,是否只允许本地访问)
(1)Bind :指定IP进行监听
vim /data/6379/redis.conf
bind 10.0.0.200 127.0.0.1
(2)增加requirepass {password}
vim /data/6379/redis.conf
requirepass 123456
---------验证------------------
方法一:
在这里插入图片描述
方法二:
在这里插入图片描述
在这里插入图片描述

5.3 在线查看和修改配置

CONFIG GET *
CONFIG GET requirepass
CONFIG GET r*
CONFIG SET requirepass 123
在这里插入图片描述
两个为一组,一共70个,有的可以在线修改及时生效,有的不可以改
在这里插入图片描述
在线查看可以模糊查看
在这里插入图片描述

5.4 redis持久化 (内存数据保存到硬盘)

RDB、AOF 两种持久化
ROB 持久化
可以在指定的时间间隔内生成数据集的 时间点快照 (point-in-time snapshot ).
优点:速度快,适合于用做备份,主从复制也是基于RDB持久化功能实现的。
缺点:会有数据丢失。
rdb持久化核心配置:
vim /data/6379/redis.conf
dir /data/6379
dbfilename dump.rdb
save 900 1
save 300 10
save 60 10000
在这里插入图片描述
配置分别表示
900秒 (15分钟) 内有1个更改
300秒 (5分钟)内有10个更改
60秒内有10000个更改
AOF 持久化 (append-only log file ) 变更的语句全都记录下来
记录服务器执行的所有写操作命令,并在服务器启动时,通过重新执行这些命令来还原数据集。
AOF文件中的命令全部以redis 协议的格式来保存,新命令会被追加到文件的末尾。
优点:可以最大程度保证数据不丢
缺点:日志记录量级比较大
AOF持久化配置
appendonly yes
appendfsync always
appendfsync everysec
appendfsync no
是否打开aof日志功能
每1个命令,都立即同步到aof
每秒写1次
写入工作交给操作系统,由操作系统判断缓冲区大小,统一写入到aof
vim /data/6379/redis.conf
appendonly yes
appendfsync everysec

6. Redis 数据类型

6.1 介绍

String :字符类型
H按时 :字典类型
List : 列表
Set : 集合
Sorted set :有序集合

6.2 KEY的通用操作

KEYS * Keys a Keys a* 查看已存在所有键的名字
TYPE 返回键所存储值得类型
EXPIRE\ PEXPIRE 以秒\毫秒设定生存时间
TTL \ PTTL 以秒\毫秒为单位返回生存时间
PERSIST 取消生存时间设定
EXISTS 检查是否存在
RENAME 变更KEY名
在这里插入图片描述

6.3 Strings

应用场景
session 共享
常规计数 :微博数 ,粉丝数,订阅,礼物
Keys :value
(1)
set name zhanghuixin
(2)
MSET id 101 name zhanghuixin age 30 gender m
等价于以下操作:
SET id 101
set name zhanghuixin
set age 30
set gender m
(3)计数器
每点一次关注,都执行以下命令一次

6.4 hash类型 (字典类型)

应用场景
存储部分变更的数据,如用户信息等
最接近mysql表结构的一种类型
主要是可以做数据库缓存
存数据 :
hmset stu id 1001 name zhanghuixin age 30 gender z
hmset stu1 id 1002 name zhanghuixinn age 31 gender h
取数据:
HMGET stu id name age gender
HMGET stu1 id name age gender

6.5 LIST (列表)

应用场景
消息队列系统
比如sina 微博
在Redis 中我们的最新微博ID使用了常住缓存 ,这是一直更新的。

6.6 SET 集合类型 (join union) 交集、并集

6.7 SortedSet (有序集合)

应用场景
排行榜应用,取TOP N操作

7、Redis 弱事务

Redis的事务是基于队列实现的
mysql 的事务是基于事务日志和锁机制实现的
redis是乐观锁机制
开启事务功能时 (multi)
multi 开启
command1
command2
command3
command4
exec 相当于数据库提交事务commit
discard 丢弃掉队列
4条语句作为一个组,并没有真正执行,而是被放入同一队列中。
如果,这是执行discard ,会直接丢弃队列中所有的命令,而不是做回滚。
exec
当执行exec时,对队列中所有操作,要么全成功要么全失败

8、redis (Master-Replica)

8.1 原理

1、副本库通过slaveof 10.0.0.200 6379 命令,连接主库,并发送SYNC给主库
2、主库收到SYNC,会立即触发BGSAVE ,后台保存RDB,发送给副本库
3、副本库接收后会应用RDB快照
4、主库会陆续将中间产生的新的操作,保存并发送给副本库
5、到此,我们主复制集就正常工作了
6、再此以后,主库只要发生新的操作,都会以命令传播的形式自动发送给副本库
7、所有复制相关信息,从info 信息中都可以查到,即使重启任何节点,他的主从关系依然都在
8、如果发生主从关系断开时,从库数据没有任何损坏,在下次重连之后,从库发送PSUNC给主库
9、主库只会将从库缺失部分的数据同步给从库应用,达到快速恢复复主从的目的
在这里插入图片描述

8.2 主从数据一致性保证

min-slaves-to-write 1
min-slaves-max-lag 3

8.3 主库是否要开启持久化功能?

如果不开有可能,主库重启操作,造成所有主从数据丢失!

9.主从复制实现

1、

1、环境准备:
准备两个或两个以上redis实例
mkdir /data/638{0…2}
配置文件示例:
cat >> /data/6380/redis.conf << EOF
port 6380
daemonize yes
pidfile /data/6380/redis.pid
loglevel notice
logfile “/data/6380/redis.log”
dbfilename dump.rdb
dir /data/6380
requirepass 123456
masterauth 123456
EOF

cat >> /data/6381/redis.conf << EOF
port 6381
daemonize yes
pidfile /data/6381/redis.pid
loglevel notice
logfile “/data/6381/redis.log”
dbfilename dump.rdb
dir /data/6381
requirepass 123456
masterauth 123456
EOF

cat >> /data/6382/redis.conf << EOF
port 6382
daemonize yes
pidfile /data/6382/redis.pid
loglevel notice
logfile “/data/6382/redis.log”
dbfilename dump.rdb
dir /data/6382
requirepass 123456
masterauth 123456
EOF

在这里插入图片描述启动:
redis-server /data/6380/redis.conf
redis-server /data/6381/redis.conf
redis-server /data/6382/redis.conf
主节点:6380
从节点:6381 6382
2、开启主从
6381/6382 命令行
redis-cli -p 6381 -a 123456 SLAVEOF 127.0.0.1 6380
redis-cli -p 6382 -a 123456 SLAVEOF 127.0.0.1 6380
3、查询主从状态
redis-cli -p 6380 -a 123456 info replication
redis-cli -p 6381 -a 123456 info replication
redis-cli -p 6382 -a 123456 info replication
在这里插入图片描述
4、解除主从身份
redis-cli -p 6382 -a 123456 SLANEOF no noe 交互式的命令

10.redis-sentinel (哨兵)

1、监控
2、自动选主,切换(6381 slaveof no noe)
采用的是raft 分布式一致性协议进行选主,数据节接近主,可以和大部分节点联系,少数服从多数。
3、重构主从原理
4、应用透明
5、自动处理故障节点
sentinel搭建过程
mkdir /data/26380
cd /data/26380
vim sentinel.conf
port 26380
dir “/data/26380”
sentinel monitor mymaster 127.0.0.1 6380 1
sentinel down-after-milliseconds mymaster 5000
sentinel auth-pass mymaster 123456
在这里插入图片描述
在这里插入图片描述

启动semtinel

redis-sentinel /data/26380/sentinel.conf &>/tmp/sentinel.log &
如果有问题:
1、重新准备1主2从环境
2、kill掉sentinel进程
3、删除sentinel 目录下的所有文件
4、重新搭建sentinel
停主库测试:
第一步:先停掉主库
在这里插入图片描述
第二步:查看sentinel的日志
在这里插入图片描述
在这里插入图片描述
第三步:查看一下哪个是主库哪个是从库
在这里插入图片描述
Sentinel 管理命令:
redis-cli -p 26380
PING :返回PONG.
SENTINEL masters :列出所有被监控的主服务器
SENTINEL slaves
SENTINEL get-master-addr-by-name : 返回给定名字的主服务器的IP 地址和端口号。
SENTINEL reset :重置所有名字和给定模式 pattern 相匹配的主服务器。
SENTINEL failover :当主服务器失效时,在不询问其他sentinel 意见的情况下,强制开始一次故障迁移。

redis 分片原理:
三个分片,SLOT:16384个 槽位 0-16383 均匀分配到分片上 key是字符串 value 键值对 redis算法 CRC16(Key)%16384取模
在这里插入图片描述
[root@localhost 26380]# cd /opt/redis-3.2.12/src/
[root@localhost src]# ll -h
在这里插入图片描述
安装集群插件
EPEL源安装ruby支持
yum install ruby rubygems -y
使用国内源
gem sources -l
gem sources -a http://mirrors.aliyun.com/rubygems/
gem sources --remove https://rubygems.org/
gem sources -l
gem install redis -v 3.3.3
第一步:下载
在这里插入图片描述
第二步:查看 gem sources -l
第三步:替换国内的源gem sources -a http://mirrors.aliyun.com/rubygems/
在这里插入图片描述
第四步:删除不能用的gem sources --remove https://rubygems.org/就剩下一个
在这里插入图片描述
第五步:安装redis驱动
gem install redis -v 3.3.3
在这里插入图片描述

11、集群节点准备

第一步:创建集群目录
mkdir /data/700{0…5}
第二步:添加配置文件

cat > /data/7000/redis.conf << EOF 
port 7000
daemonize  yes 
pidfile /data/7000/redis.pid 
loglevel  notice 
logfile "/data/7000/redis.log"
dbfilename dump.rdb
dir  /data/7000
protected-mode no
cluster-enabled  yes 
cluster-config-file nodes.conf
cluster-node-timeout  5000
appendonly yes 
EOF

cat > /data/7001/redis.conf << EOF 
port 7001
daemonize  yes 
pidfile /data/7001/redis.pid 
loglevel  notice 
logfile "/data/7001/redis.log"
dbfilename dump.rdb
dir  /data/7001
protected-mode no
cluster-enabled  yes 
cluster-config-file nodes.conf
cluster-node-timeout  5000
appendonly yes 
EOF

cat > /data/7002/redis.conf << EOF 
port 7002
daemonize  yes 
pidfile /data/7002/redis.pid 
loglevel  notice 
logfile "/data/7002/redis.log"
dbfilename dump.rdb
dir  /data/7002
protected-mode no
cluster-enabled  yes 
cluster-config-file nodes.conf
cluster-node-timeout  5000
appendonly yes 
EOF

cat > /data/7003/redis.conf << EOF 
port 7003
daemonize  yes 
pidfile /data/7003/redis.pid 
loglevel  notice 
logfile "/data/7003/redis.log"
dbfilename dump.rdb
dir  /data/7003
protected-mode no
cluster-enabled  yes 
cluster-config-file nodes.conf
cluster-node-timeout  5000
appendonly yes 
EOF

cat > /data/7004/redis.conf << EOF 
port 7004
daemonize  yes 
pidfile /data/7004/redis.pid 
loglevel  notice 
logfile "/data/7004/redis.log"
dbfilename dump.rdb
dir  /data/7004
protected-mode no
cluster-enabled  yes 
cluster-config-file nodes.conf
cluster-node-timeout  5000
appendonly yes 
EOF

cat > /data/7005/redis.conf << EOF 
port 7005
daemonize  yes 
pidfile /data/7005/redis.pid 
loglevel  notice 
logfile "/data/7005/redis.log"
dbfilename dump.rdb
dir  /data/7005
protected-mode no
cluster-enabled  yes 
cluster-config-file nodes.conf
cluster-node-timeout  5000
appendonly yes 
EOF

第三步:启动集群节点
redis-server /data/7000/redis.conf
redis-server /data/7001/redis.conf
redis-server /data/7002/redis.conf
redis-server /data/7003/redis.conf
redis-server /data/7004/redis.conf
redis-server /data/7005/redis.conf
第四步:过滤查看
[root@localhost ~]# ps -ef |grep redis
在这里插入图片描述
第五步:将节点加入集群管理
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
在这里插入图片描述
在这里插入图片描述
第六步:查看集群状态
查看集群主节点状态
redis-cli -p 7000 cluster nodes |grep master
在这里插入图片描述
查看集群从节点状态
redis-cli -p 7000 cluster nodes |grep slave
在这里插入图片描述
第七步:集群节点管理
增加新的节点
案例:

mkdir /data/7006 
mkdir /data/7007 
cat > /data/7006/redis.conf << EOF 
port 7006
daemonize  yes 
pidfile /data/7006/redis.pid 
loglevel  notice 
logfile "/data/7006/redis.log"
dbfilename dump.rdb
dir  /data/7006
protected-mode no
cluster-enabled  yes 
cluster-config-file nodes.conf
cluster-node-timeout  5000
appendonly yes 
EOF

cat > /data/7007/redis.conf << EOF 
port 7007
daemonize  yes 
pidfile /data/7007/redis.pid 
loglevel  notice 
logfile "/data/7007/redis.log"
dbfilename dump.rdb
dir  /data/7007
protected-mode no
cluster-enabled  yes 
cluster-config-file nodes.conf
cluster-node-timeout  5000
appendonly yes 
EOF

启动:

redis-server /data/7006/redis.conf
redis-server /data/7007/redis.conf

执行了一个命令添加节点以为这样结束了其实没有结束,看了负载还这么高
redis-trib.rb add-node 127.0.0.1:7006 127.0.0.1:7000
在这里插入图片描述
在这里插入图片描述
转移slot(重新分片) 不影响业务转移slot
redis-trib.rb reshard 127.0.0.1:7000
在这里插入图片描述
在这里插入图片描述
这是添加主节点
在这里插入图片描述
添加一个从节点 从节点不分配槽位号
redis-trib.rb add-node --slave --master-id aa862f05fc5268500f437dbf5c1f73de430fc320 127.0.0.1:7007 127.0.0.1:7000
在这里插入图片描述
查看
在这里插入图片描述
删除节点(需求删除7006、7007)
将需要删除节点slot 移动走
redis-trib.rb reshard 127.0.0.1:7000
分为三步把slot迁移回去
0-1364 5461-6826 10923-12287
1365 1366 1365
在这里插入图片描述
第一组:redis-trib.rb reshard 127.0.0.1:7000
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
第二组:
在这里插入图片描述
第三组:
在这里插入图片描述
在这里插入图片描述
删除一个节点
删除master节点之前首先要使用reshard移除master的全部slot,然后再删除当前节点
第一步:删除主节点7006
redis-trib.rb del-node 127.0.0.1:7006 aa862f05fc5268500f437dbf5c1f73de430fc320
在这里插入图片描述第二步:删除从节点7007
[root@localhost ~]# redis-cli -p 7000 cluster nodes |grep slave
在这里插入图片描述
查看还原之前一样的
[root@localhost ~]# redis-cli -p 7000 cluster nodes |grep master
在这里插入图片描述

设置redis最大内存
config set maxmeory 102400000

12 、redis的多API支持

python为例
yum install -y python36
python3 -V
yum install -y python36-pip
pip3 install redis
pip3 install redis-py-cluster
第一步:安装 yum install -y python36
第二步:安装yum install -y python36-pip
第三步:安装pip3 install redis
在这里插入图片描述

第四步:安装pip3 install redis-py-cluster

对redis的单实例进行连接操作

python3

import redis 导入包
r = redis.StrictRedis(host=‘10.0.0.200’,port=6379,db=0,password=‘123456’) 定义连接
r.set (‘zhx’,‘hui’) 调用set和get
r.get(‘zhuixin’)

sentinel集群连接并操作

导入redis.sentinel 包

from redis.sentinel import Sentinel
指定sentinel的地址和端口号
sentinel=Sentinel ([(‘localhost’,26380)],socket_timeout=0.1)

测试,获取以下主库和从库的信息

sentinel.discover_master(‘mymaster’)
sentinel.discover_slaves(‘mymaster’)

配置读写分离

写节点

naster=sentinel.master_for(‘mysaster’,socket_timeout=0.1,password=“123456”)

读节点

slave=sentinel.slave_for (‘mymaster’,socket_timeout=0.1,password=“123456”)

读写分离测试 Key

master.set(‘zhuixin’,‘123456’)
slave.get (‘zhang’ )

python连接rediscluster集群测试

使用
python3

from rediscluster import RedisCluster
startup_nodes=[{“host”:“127.0.0.1”,“port”:“7000”},{“host”:“127.0.0.1”,“port”:“7001”},{“host”:“127.0.0.1”,“port”:“7002”}]

Note:decode_responses must be set to True when used with python3

rc=RedisCluster(startup_nodes=startup_nodes,decode_responses=True)

rc.set (“ttt”,“bar”)
True
print(rc.get(“tttt”))

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值