redis

day 7 下午

redis学习

mysql 关系型数据库
非关系型数据库 redis mongodb
nosql 不仅仅是sql

数据持久化,可以将数据存储到磁盘上,以文件形式存储

redis是内存性的数据库,读写是非常快的
缺点是:断电释放内存数据,redis数据丢失,redis进程挂掉,数据丢失,redis提供了持久化机制

redis的安装方式
1.yum install redis -y
rpm

源码编译(在选择编译的时候,注意删掉之前的yum安装的)
1.yum remove redis -y

2.下载redis的源代码包
wget http://download.redis.io/releases/redis-4.0.10.tar.gz

3.解压缩源码包
编译三部曲:

(此redis压缩包,已经提供好了makefile,只需要执行,编译的第二,第三曲)

2.执行gcc的make指令,执行makefile文件
make
3.开始安装
make install

4.会安装在当前的源码包中的src目录,且帮你配置好了PATH变量
在src下:通过redis-加上tab补全查看所有命令

redis-benchmark redis-check-rdb redis-sentinel
redis-check-aof redis-cli redis-server

5.制定一个安装可靠的redis数据库,如下功能通过配置文件定义
1.更改端口
2.设置密码
3.开启redis的安全启动模式

默认直接输入redis-server可以启动服务端,默认端口6379,且没有密码
redis-cli登录

redis.conf 内容如下,有多少参数,就有多少功能,

bind 192.168.16.142    #绑定redis启动的地址
protected-mode yes		#开启redis的安全模式,必须输入密码才可以远程登录
port 6380			 #指定redis的端口  
daemonize no			#让redis以守护进程方式在后台运行,不占用窗口
pidfile /var/run/redis_6379.pid   #记录redis的进程id号的文件
loglevel notice    		#日志运行等级 .严重级别,警告级别,debug调试界别.....logging
requirepass haohaio     #设置redis的密码,是 haohaio

指定配置文件的启动方式
redis-server  s20redis.conf  

#此时登录redis必须加上参数了,并且登录了之后,必须输入密码才可以使用 
redis-cli -p 6380 -h 192.168.16.142

	# 在另一个窗口redis-cli -h 192.168.230.132	
	# (error) NOAUTH Authentication required.
	#auth haohaio   #认证才可以操作  
持久化 touch s20rdb.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 60  10000
touch s20aof.conf
daemonize yes
port 6379   
logfile /data/6379/redis.log
dir /data/6379	
appendonly yes
appendfsync everysec		 #每秒做一次持久化

学习redis的数据类型使用

1.常用redis的公共命令

keys *         查看所有key
type key      查看key类型
expire key seconds    过期时间
ttl key     查看key过期剩余时间        -2表示key已经不存在了
persist     取消key的过期时间   -1表示key存在,没有过期时间

exists key     判断key存在    存在返回1    否则0
del keys     删除key    可以删除多个
dbsize         计算key的数量


2.学习string类型的操作

通过set设置的就是string类型的key -value

set   设置key
get   获取key
append  追加string
mset   设置多个键值对
mget   获取多个键值对
del  删除key
incr  递增+1
decr  递减-1

list类型,双向队列

dic1={
'k1':{"k2":"v2"}
}

dic1[k1][k2]

redis的发布订阅

QQ群

详细命令看博客

1 开多个窗口 redis-cli

PUBLISH football dafdfas		(integer) 2
SUBSCRIBE football music 	# channel 订阅多个
SUBSCRIBE football 

2

 PUBLISH python20 dafdfas		(integer) 2
PUBLISH python19 dafdfas		(integer) 1

 PSUBSCRIBE python20
PSUBSCRIBE python*

redis的持久化机制

分为aof和rdb两种,具体看博客

在不重启redis的情况下,切换rdb中的数据,到aof中的操作

环境准备
1.配置一个rdb的redis服务端
s20rdb.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 60  10000

两种都有的情况下 ,只执行aof的数据 删了aof dbmp里数据也没了

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 60  10000
appendonly yes
appendfsync everysec

2.基于这个文件启动redis,支持rdb的数据库
redis-server s20rdb.conf

3.登录redis设置key,然后手动触发save,生成rdb数据文件

4.通过登录redis,两条命令,切换为aof持久化方式
127.0.0.1:6379>
127.0.0.1:6379> CONFIG set appendonly yes
OK
127.0.0.1:6379> CONFIG SET save ""
OK

5.第四部的操作,仅仅是临时生效(下一回登录s20rdb.conf还是原来),还得修改配置文件,保证下次重启,也得用aof进行持久化

daemonize yes
port 6379
logfile /data/6379/redis.log
dir /data/6379
bind  127.0.0.1
appendonly yes
appendfsync always

save 900 1:表示900 秒内如果至少有 1 个 key 的值变化,则保存
save 300 10:表示300 秒内如果至少有 10 个 key 的值变化,则保存
save 60 10000:表示60 秒内如果至少有 10000 个 key 的值变化,则保存

redis是单线程的,由c编写

redis的主从复制

-1 建一个文件夹 /opt/sd

0 建存数据的文件夹
一条命令(整明白): mkdir -p /var/redis/data/{6379,6380,6381}

1.redis和mysql都是支持多实例功能,基于配置文件区分,就是一个数据库单独的实例

环境准备,一个6379的redis(master),和一个6380的redis(slave)

分别准备2个配置文件,内容如下
redis-6379.conf

port 6379
daemonize yes
logfile "6379.log"
dbfilename "dump-6379.rdb"
dir "/var/redis/data/6379"

redis-6380.conf (从)

port 6380
daemonize yes
logfile "6380.log"
dbfilename "dump-6380.rdb"
dir "/var/redis/data/6380" 
slaveof 127.0.0.1 6379 

redis-6381.conf (从)

port 6381
daemonize yes
logfile "6380.log"
dbfilename "dump-6380.rdb"
dir "/var/redis/data/6381" 
slaveof 127.0.0.1 6379

2.分别启动2个redis实例

redis-server redis-6381.conf

!ps 查看上一条,是进程
3.登录数据库,查看两人之间的关系

查看80的身份信息:
redis-cli -p 6380 info replication
role:slave
master_port:6379

登录6379数据库,输入如下命令
127.0.0.1:6379> info replication

6380数据库查看如下关系
[root@s20 smredis]# redis-cli -p 6380 info replication

4.数据读写查看
在6379中是可以读写的
redis-cli -p 6379 set name5 haoxiangxiake

redis-cli -p 6380 get name5

5.主从复制故障恢复
从库挂了无所谓
主库挂了得立即恢复主库,或者将从库切换为主库,继续工作

-.实验步骤
1.分别启动 6379  6380 6381 三个数据库实例,建立好主从关系

2.杀死6379主库,此时6380 6381 群龙无首

3.选择让6381为新的主库,就要去除6381的从的身份
redis-cli -p 6381 slaveof  no one 
#查看此时6381的身份
redis-cli -p 6381 info replication

4.此时将6380的主人改为6381
redis-cli -p 6380 slaveof 127.0.0.1 6381

6.redis的哨兵,自动的主从故障切换
配置步骤

1.环境准备,准备3个redis数据库实例,分别是 6379 6380 6381
redis-6379.conf
port 6379
daemonize yes
logfile "6379.log"
dbfilename "dump-6379.rdb"
dir "/var/redis/data/6379"

redis-6380.conf
port 6380
daemonize yes
logfile "6380.log"
dbfilename "dump-6380.rdb"
dir "/var/redis/data/6380"
slaveof 127.0.0.1 6379

redis-6381.conf
port 6381
daemonize yes
logfile "6380.log"
dbfilename "dump-6380.rdb"
dir "/var/redis/data/6381"
slaveof 127.0.0.1 6379

2.分别启动三个redis数据库实例
1106 redis-server redis-6379.conf
1107 redis-server redis-6380.conf
1108 redis-server redis-6381.conf

3.准备三个redis-sentinel哨兵的配置文件

redis-sentinel-26379.conf

port 26379  
dir /var/redis/data/26379
logfile "26379.log"

// 当前Sentinel节点监控 127.0.0.1:6379 这个主节点
// 2代表判断主节点失败至少需要2个Sentinel节点节点同意
// mymaster是主节点的别名
sentinel monitor s20master 127.0.0.1   6379  2

//每个Sentinel节点都要定期PING命令来判断Redis数据节点和其余Sentinel节点是否可达,如果超过30000毫秒30s且没有回复,则判定不可达
sentinel down-after-milliseconds s20master 30000

//当Sentinel节点集合对主节点故障判定达成一致时,Sentinel领导者节点会做故障转移操作,选出新的主节点,
原来的从节点会向新的主节点发起复制操作,限制每次向新的主节点发起复制操作的从节点个数为1
sentinel parallel-syncs s20master 1

//故障转移超时时间为180000毫秒
sentinel failover-timeout s20master 180000
//让哨兵在后台运行
daemonize yes
port 26379  
dir /var/redis/data/26379
logfile "26379.log"
sentinel monitor s20master 127.0.0.1   6379  2
sentinel down-after-milliseconds s20master 30000
sentinel parallel-syncs s20master 1
sentinel failover-timeout s20master 180000
daemonize yes  # 让哨兵在后台运行

如下26380和26381的配置文件,仅仅是端口的不同,可以快速生成

一条命令 生成

sed "s/26379/26380/g" redis-26379.conf > redis-26380.conf
追加: echo 'daemonize yes' >> redis-26381.conf

redis-sentinel-26380.conf
redis-sentinel-26381.conf

生成命令如下

1119 sed "s/26379/26380/g" redis-26379.conf > redis-26380.conf
1121 sed "s/26379/26381/g" redis-26379.conf > redis-26381.conf

4.分别运行三个哨兵进程
(保证sentinel的配置正确,否则,你在启动报错后,配置文件的内容发发生变化,这是个坑!!!!)

创建哨兵的数据文件夹

1126 mkdir -p /var/redis/data/26380
1127 mkdir -p /var/redis/data/26379
1128 mkdir -p /var/redis/data/26381

分别启动三个哨兵

1134 redis-sentinel redis-26379.conf
1137 redis-sentinel redis-26380.conf
1138 redis-sentinel redis-26381.conf

5.检查redis的哨兵状态
redis-cli -p 26379 info sentinel

查看到如下参数,哨兵就正确了

master0:name=s20master,status=ok,address=127.0.0.1:6379,slaves=2,sentinels=3

6.杀死主库,检查主从状态,是否会切换

posted @ 2019-07-04 22:12  learnacode  阅读(131)  评论(0编辑  收藏  举报