redis
1. redis 部署安装
redis 编译安装
规划目录
/data/soft/ #redis下载目录
/opt/redis_{PORT}/{conf,logs,pid} #redis安装目录
/data/redis_{PORT}/redis_{PORT}.rdb #redis数据目录
/root/scripts/redis_shell.sh #redis运维脚本安装 命令
编辑host文件
10.0.0.51 db01
10.0.0.52 db02
10.0.0.53 db03编译安装
Yum install -y gcc 下载依赖软件
Make distclean 清除编译缓存创建目录
Mkdir -p /data/soft
Mkdir -p /data/redis_6379
Mkdir -p /opt/redis_6379{conf,pid,logs}下载软件压缩包
Cd /data/soft
wget [http://download.redis.io/releases/redis-3.2.9.tar.gz] (http://download.redis.io/releases/redis-3.2.9.tar.gz)解压软件包
Tar zxf redis-3.2.9.tar.gz -C (指定文件解压路径) /opt/
ln -s /opt/redis-3.2.9/ /opt/redis 创建软连接
cd /opt/redis编译
make && make install
2. 编写配置文件
cat >/opt/redis_6379/conf/redis_6379.conf <
3. 启动redis
redis-server /opt/redis_6379/conf/redis_6379.conf
4. 检查服务是否启动
pe -ef|grep redis
netstat -lntup |grep redis
5. 进入redis
redis -cli
redis 全局操作命令
1. 写入key
set key "1" values "1"
set k"1" v"1"
set k 1 v1 k2 v2 k3 v3
2. 查看所有keys (线上环境禁止使用)
keys *
3. 查看有多少个key 估值
DBSIZE
4. 查看key值是否存在
EXISTS k1
EXISTS k1 k2 k3
返回状态码:
0 表示这个key 不存在
1 表示这个key 存在
N 表示有N个key存在
5. 删除key
Del k1
Del k1 k2 k3
状态码 :
0 表示这个key不存在
1 表示这个key存在,并且删除成功
N 表示有N个key存在 , 并且删除N个key
6 . 键过期
设置过期时间 EXPIPE K1 100
取消过期时间 PESIST k1
状态码 :
0 表示这个key 不存在
1 表示这个key存在 , 并且设置过期时间成功
7. 查看key是否过期
TTL k1
状态码 :
-1 这个key存在过 ,并且永不过期
-2 这个key不存在
N 这个key存在 ,并且在N秒后过期
(过期后的key直接会被删除)
字符串操作
- 设置一个key set k1 v1
- 查看一个key get k1
- 设置多个key mset k1 v1 k2 v2 k3 v3
- 查看多个key mget k1 k2 k3
- 天然计数器
加1 :
Set k1 1
Incr k1
Get k1
加N INCRBY k1 100
减1 : INCRBY k1 -1
减N : INCRBY k1 –N
列表操作
- 插入列表 :
LPUSH : 从列表左侧插入数据
RPUSH : 从列表右侧插入数据
LPUSH list1 1
LPUSH list1 2
LPUSH list1 3
RPUSH list1 4
RPUSH list1 5
RPUSH list1 6 - 查看列表长度 LLEN “list 1”
- 查看列表的内容 :
127.0.0.1:6379> LRANGE list1 0 -1
- "3"
- "2"
- "1"
- "4"
- "5"
- "6"
- 删除列表元素 :
LPOP : 从列表的左侧删除
RPOP : 从列表的右侧删除
LPOP “list1”
RPOP “list2”
删除列内容 :
DEL “list1”
哈希
- 哈希:
Hash看起来就像一个’hash’的样子.由键值对组成
HMSET指令设置hash中的多个域
HGET取回单个域
HMGET取回一系列的值 - 生成一个hash类型
HMSET user :1 name 嚣张 job IT age 27
HMSET user:2 name 小刚 job IT age 23
HMSET user: 3 name 小杨 job IT age 22 - 查看hash 里的一个值 HMGET user: 1 name
- 查看hash 里的多个值 HMGET user : 1 name age job
- 查看hash 里的所有值 HGETALL user : 1
- MySQL 数据和redis 哈希对比
uid name job age
1 xiaozhang it 28
2 xiaoya it 28
3 yazhang it 28
Select * from user where id = 3
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
集合操作
- 创建集合
db01:6379> SADD set1 1 2 3
(integer) 3
db01:6379> SADD set2 1 3 5 7
(integer) 4
2. 查看集合成员 :
SMEMBERS set1
SMEMBERS set2
3. 查看集合的差集, 以前面一个集合为基准对比后面的,前面有,后面没有则选出来 db01:6379> SDIFF set1 set2
- "2"
db01:6379> SDIFF set2 set1 - "7"
查看集合的交集
db01:6379> SINTER set1 set2
- "1"
- "3"
- "5"
查看集合的并集
db01:6379> SUNION set1 set2
- "1"
- "2"
- "3"
- "5"
- "7"
db01:6379> SUNION set1 set2 set3 - "1"
- "2"
- "3"
- "5"
- "7"
- "9"
集合不允许出现重复的值
redis 持久化
- RDB和AOF优缺点
RDB : 快照 , 把当前内存里的状态快照到磁盘上
优点 : 恢复速度快
缺点 : 可能会丢失数据
AOF : 类似于MySQL的binlog , 重写 ,一秒写一次
优点 : 安全 , 有可能会丢失 1秒的数据
缺点: 文件比较大 , 恢复速度慢 - 配置RDB
配置文件里编写
Save 900 1 900秒内出现一次变更
Save 300 10 300秒内有10次变更
Save 60 10000 60秒 内有1000次变更
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触发持久化保存
常用命令 :
ll /data/redis_6379/
cat /opt/redis_6379/conf/redis_6379.conf
vim /opt/redis_6379/conf/redis_6379.conf
pkill redis
redis-server /opt/redis_cluster/redis_6379/conf/redis_6379.conf
redis-cli -h db01
redis-cli -h db01 shutdown
bash for.sh
配置AOF
appendfilename "redis_6379.aof"
appendonly yes
appendfsync everysec
- 实验 :
实验:
如果aof和rdb文件同时存在,redis会如何读取:
实验步骤:
1.插入一条数据
aof: 有记录
rdb: 没有记录
2.复制到其他地方
3.把redis停掉
4.清空数据目录
5.把数据文件拷贝过来
aof: 有记录
rdb: 没有记录
6.启动redis
7.测试,如果有新插入的数据,就表示读取的是aof,如果没有,就表示读取的是rdb
实验结论:
如果2种数据格式都存在,优先读取aof
认证 :
- 配置文件 requirepass 123456
- 使用密码登录
方法一: redis –cli –h 10.0.0.51
AUTH 123456
方法二 :
Redis –cli –h –a 123456 get k1
redis 主从复制流程
主从复制命令:
临时生效 : SLAVEOF 10.0.0.51 6379
永久生效 : SLAVEOF 10.0.0.51 6379 写入配置文件 vim /opt/redis_6379/conf/redia_6379.conf取消同步命令 : SLAVEOF no one
主从复制流程 : 从库发起同步请求 ----> 主库接收请求 ---> 主库开始BGSAVE ---> 从库接收主库的数据 , 清空自己的数据 , 然后将主库发送过来的PDB文件加载到内存中
从库发起同步请求
11:55:12.686 * Connecting to MASTER 10.0.0.51:6379
11:55:12.687 * MASTER <-> SLAVE sync started
11:55:12.687 * Non blocking connect for SYNC fired the event.
11:55:12.687 * Master replied to PING, replication can continue...
11:55:12.688 * Partial resynchronization not possible (no cached master)
11:55:12.690 * Full resync from master:c63b80909e49adfa3880dcc87ccffb89d148a564:436
主库接收请求
11:55:12.694 * Slave 10.0.0.52:6379 asks for synchronization
11:55:12.694 * Full resync requested by slave 10.0.0.52:6379
主库开始BGSAVE
11:55:12.694 * Starting BGSAVE for SYNC with target: disk
11:55:12.695 * Background saving started by pid 13009
11:55:12.700 * DB saved on disk
11:55:12.700 * RDB: 6 MB of memory used by copy-on-write
从库接收主库的数据,清空自己的数据,然后将主库发送过来的RDB文件加载到内存中
11:55:12.780 * MASTER <-> SLAVE sync: receiving 12887 bytes from master
11:55:12.781 * MASTER <-> SLAVE sync: Flushing old data
11:55:12.781 * MASTER <-> SLAVE sync: Loading DB in memory
11:55:12.782 * MASTER <-> SLAVE sync: Finished with success
主库接收从库消息,主从复制成功
11:55:12.786 * Background saving terminated with success
11:55:12.786 * Synchronization with slave 10.0.0.52:6379 succeeded
redis 主从复制部署
快速创建第二台redis节点 :
Rsync –avz /opt/* db02:/opt/
Rsync –avz /data db02:/
Cd /opt/redis
Make install
Sed –i ‘s#51#52#g’ /opt/redis_6379/conf/redis_6379.conf
Rm –rf /data/redis_6379/*
Redis-server /opt/redis_6379/conf/redis_6379.conf
- 配置方法
方法一 : 临时生效 : redis –cli –h 10.0.0.52
SLAVEOF 10.0.0.51 6379
方法二 : 写入配置文件
SLAVEOF 10.0.0.51 6379 写入配置文件 - 主从复制流程:
1.从节点发送同步请求到主节点
2.主节点接收到从节点的请求之后,做了如下操作
- 立即执行bgsave将当前内存里的数据持久化到磁盘上
- 持久化完成之后,将rdb文件发送给从节点
3.从节点从主节点接收到rdb文件之后,做了如下操作 - 清空自己的数据
- 载入从主节点接收的rdb文件到自己的内存里
- 后面的操作就是和主节点实时的了
- 取消主从复制 :
SLAVEOF no one
注意!!!
1.从节点只读不可写
2.从节点不会自动故障转移,它会一直同步主
10.0.0.52:6379> set k1 v1
(error) READONLY You can't write against a read only slave.
3.主从复制故障转移需要人工介入
- 修改代码指向REDIS的IP地址
- 从节点需要执行SLAVEOF no one
注意!!!
1.从节点会清空自己原有的数据,如果同步的对象写错了,就会导致数据丢失
安全的操作:
1.无论是同步,无论是主节点还是从节点
2.先备份一下数据