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 <<EOF
       以守护进程模式启动
daemonize yes
      绑定的主机地址
bind 10.0.0.51 127.0.0.1
    监听端口
port 6379
      pid文件和log文件的保存地址
pidfile /opt/redis_6379/pid/redis_6379.pid
logfile /opt/redis_6379/logs/redis_6379.log
      设置数据库的数量,默认数据库为0
databases 16
    本地数据库的目录
dir /data/redis_6379
     指定本地持久化文件的文件名,默认是dump.rdb
dbfilename redis_6379.rdb
EOF
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.先备份一下数据