一安装
1、下载redis 下载地址在:redis.io 比如把Redis安装到/usr/local/soft/ cd /usr/local/soft/ wget http://download.redis.io/releases/redis-5.0.5.tar.gz 2、解压压缩包 tar -zxvf redis-5.0.5.tar.gz 3、安装gcc依赖 Redis是C语言编写的,编译需要 yum install gcc 4、编译安装 cd redis-5.0.5/src make MALLOC=libc make install 安装成功的结果是src目录下面出现服务端和客户端的脚本 redis-server redis-cli redis-sentinel 5、修改配置文件 默认的配置文件是/usr/local/soft/redis-5.0.5/redis.conf 后台启动 daemonize no 改成 daemonize yes 下面一行必须改成 bind 0.0.0.0 或注释,否则只能在本机访问 bind 127.0.0.1 如果需要密码访问,取消requirepass的注释 requirepass yourpassword 6、使用指定配置文件启动Redis(这个命令建议配置alias) /usr/local/soft/redis-5.0.5/src/redis-server /usr/local/soft/redis-5.0.5/redis.conf 7、进入客户端(这个命令建议配置alias) /usr/local/soft/redis-5.0.5/src/redis-cli 8、停止redis(在客户端中) redis> shutdown 或 ps -aux | grep redis kill -9 xxxx
二.集合与命令
1.String
2.hash
3.list
4.set
5.zset
6.geo
7.hll
三.redis实现消息队列
队列 channel
订阅命令: SUBSCRIBE channel1 channel2 channel3
发布命令 PUBLISH channel1 myMsg
还可以用表达式订阅
PSUBSCRIBE news* 订阅 news*开头的 PUBLISH news-low haha 能收到 PSUBSCRIBE *eat 订阅吃结尾的 PUBLISH hbgeat haha能收到
PSUBSCRIBE loveAndPeace 全匹配和爱与和平 PUBLISH loveAndPeace haha 能收到
四.redis可以实现事务
重点学习关键字 multi discard exec watch
实现a转账b 100元的
127.0.0.1:6379> set a 1000 OK 127.0.0.1:6379> set b 1000 OK 127.0.0.1:6379> MULTI -- 开启事务 OK 127.0.0.1:6379(TX)> DECRBY a 100 --加入事务队列 QUEUED 127.0.0.1:6379(TX)> INCRBY b 100 --加入事务队列 QUEUED 127.0.0.1:6379(TX)> exec -- 执行事务 1) (integer) 900 2) (integer) 1100 127.0.0.1:6379>
取消事务
127.0.0.1:6379(TX)> set a 1 QUEUED 127.0.0.1:6379(TX)> set b 2 QUEUED 127.0.0.1:6379(TX)> DISCARD --取消事务 OK 127.0.0.1:6379> get a "900" 127.0.0.1:6379> get b "1100" 127.0.0.1:6379>
监听某一个值,修改后事务提交不了
127.0.0.1:6379> get a "900" 127.0.0.1:6379> WATCH a --在此时我开启另一个窗口 修改a的值 127.0.0.1:6379> set a 2000
OK 127.0.0.1:6379> MULTI OK 127.0.0.1:6379(TX)> set a 5000 QUEUED 127.0.0.1:6379(TX)> EXEC (nil) --- 由于被另一个窗口修改了 报错 127.0.0.1:6379>
思考 事务非人为取消发生执行不下去,会有什么情况
分两种:
exce 执行之前
exce执行之后
127.0.0.1:6379> MULTI
OK
127.0.0.1:6379(TX)> set a 1000
QUEUED
127.0.0.1:6379(TX)> HSET a 2000
(error) ERR wrong number of arguments for 'hset' command
127.0.0.1:6379(TX)> EXEC
(error) EXECABORT Transaction discarded because of previous errors. --- 发生在exce执行之前编译不成功,会回滚
127.0.0.1:6379(TX)> set c 1000 QUEUED 127.0.0.1:6379(TX)> hset c d f -- 编译通过 QUEUED 127.0.0.1:6379(TX)> EXEC 1) OK 2) (error) WRONGTYPE Operation against a key holding the wrong kind of value -- 执行失败 127.0.0.1:6379> get c -- c操作还是可以获取到值,说明没有回滚 "1000" 127.0.0.1:6379>
五.redis的集群部署
5.1.主从复制
主从有三种方式:
都是在从节点进行配置
1.从节点的配置文件配置: slaveof master的ip:端口
2.启动后 在redis-cli slaveof master的ip:端口
3.启动从节点时, ./redis.server -- slaveof master的ip:端口
从节点启动查看信息
127.0.0.1:6379> set a 1 ---在设置为从节点之前可以写操作
OK
127.0.0.1:6379> SLAVEOF 47.112.99.31 9376
OK
127.0.0.1:6379> info replication -- 查看从节点信息
# Replication
role:slave
master_host:47.112.99.31
master_port:6379
master_link_status:up
master_last_io_seconds_ago:2
master_sync_in_progress:0
slave_repl_offset:167
slave_priority:100
slave_read_only:1
replica_announced:1
connected_slaves:0
master_failover_state:no-failover
master_replid:1f2ab47f55fd91686c7294f91afc0dcaca4385bc
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:167
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:168
repl_backlog_histlen:0
127.0.0.1:6379> set b 1
(error) READONLY You can't write against a read only replica. -- 设置从节点之后不能设置
此时主节点
127.0.0.1:6379> info replication
# Replication
role:master
connected_slaves:1
slave0:ip=120.78.167.130,port=6379,state=online,offset=14,lag=1
master_failover_state:no-failover
master_replid:1f2ab47f55fd91686c7294f91afc0dcaca4385bc
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:14
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:14
从节点的如果要断开可以
127.0.0.1:6379> SLAVEOF no one
OK
5.2 sentinel 哨兵
架构图如下
由于机器有限,我做一个一主一从(问题:之前没有故障转移都是因为sentinel的ip没有写对)
sentinel.conf配置文件内容,两台机器相同
daemonize yes
port 26379
protected-mode no
dir "/usr/local/soft/redis-6.0.9/sentinel-tmp"
sentinel monitor redis-master 47.112.99.31 6379 1 --- 1代表当个sentinel实例认为master失效时,正式失效
sentinel down-after-milliseconds redis-master 30000
sentinel failover-timeout redis-master 180000
sentinel parallel-syncs redis-master 1
在2台机器上分别启动Redis和Sentinel
./redis-server ../redis.conf
./redis-sentinel ../sentinel.conf
哨兵节点的另一种启动方式:
./redis-server ../sentinel.conf --sentinel
参照:https://gper.club/articles/7e7e7f7ff3g5bgccg68
后续还会写..
问题:
ubuntu的命令
netstat -anp |grep 端口号 或者 ps -ef | grep redis 查找到redis并 kill -9 pid ,这样子是杀不掉的
可以 /etc/init.d/redis-server stop 出现
[ ok ] Stopping redis-server (via systemctl): redis-server.service.
代表成功杀掉了
问题2
从节点连接主节点的时候,连接不上
1)在从节点redis.conf要配置master的密码,masterauth<master-password>
2)在主节点要把阿里云的安全组通过redis的6379端口
大问题3:
模拟一主二从哨兵模式
主节点 47.112.99.31
从节点 120.78.167.130
从节点 45.40.234.80
启动对应的sentinel节点
daemonize yes
sentinel announce-ip 47.112.99.31 -- 刚开始没有加这句,导致出现很多master节点挂点 选举不成功的情况,其次20.78.167.130配置replicaof的 指定错了(本应该是47的主节点,写到了45)
port 26379
protected-mode no
dir "/opt/soft/redis-6.2.4/sentinel-tmp"
sentinel monitor redis-master 47.112.99.31 6379 2
sentinel down-after-milliseconds redis-master 5000
sentinel failover-timeout redis-master 30000
sentinel parallel-syncs redis-master 1