redis——入门操作(二)

redis的配置文件

# 配置文件对大小写不敏感
units are case insensitive so 1GB 1Gb 1gB are all the same.

# 可以包含多个配置文件
include /path/to/local.conf
include /path/to/other.conf

# 网络 
bind 127.0.0.1 -::1 # 绑定ip
protected-mode no # 保护模式
port 6379 # 默认端口

# 通用配置
daemonize yes # 守护进程方式开启(后台进程)
pidfile /var/run/redis_6379.pid # 后台运行后,需要指定pid文件


# 日志级别
# debug (a lot of information, useful for development/testing)
# verbose (many rarely useful info, but not a mess like the debug level)
# notice (moderately verbose, what you want in production probably) 默认
# warning (only very important / critical messages are logged)
loglevel notice
logfile "" # 日志文件配置名

databases 16 # 默认的数据库数量
always-show-logo no # 是否显示log

# 快照 持久化规则
# save 3600 1 如果3600秒内至少有1个key进行修改,就进行持久化操作
# save 300 100 如果300秒内至少有10个key进行修改,就进行持久化操作 
# save 60 10000 如果60秒内至少有10000个key进行修改,就进行持久化操作
stop-writes-on-bgsave-error yes # 持久化出错,是否要继续工作


##RDB##
rdbcompression yes # 是否压缩rdb文件(持久化文件,消耗cpu资源)

rdbchecksum yes # 保存rdb文件进行错误的校验检查

dir ./ # rdb文件保存的目录

##安全##
requirepass foobared # 设置密码
config set requirepass "123456"# 命令行设置密码
auth 123456 # 登录


##客户端限制##
maxclients 10000 # 设置能连接上的redis最大客户端吧数量
maxmemory <bytes> # redis限制最大的内存容量
maxmemory-policy noeviction # 内存上限的处理策略
1、volatile-lru:只对设置了过期时间的key进行LRU(默认值) 
2、allkeys-lru : 删除lru算法的key   
3、volatile-random:随机删除即将过期key   
4、allkeys-random:随机删除   
5、volatile-ttl : 删除即将过期的   
6、noeviction : 永不过期,返回错误


##AOF##
appendonly no # 默认不开启aof模式,默认使用的是rdb
appendfilename "appendonly.aof" # 持久化文件的名字

# appendfsync always # 每次修改都会同步
appendfsync everysec # 每秒同步一次,可能会丢失这一秒数据
# appendfsync no # 不同步

Redis持久化

RDB

# The filename where to dump the DB
dbfilename dump.rdb

save 60 5 # 测试60秒内5次操作就行保存

#触发的机制#
1、save规则
2、flushall命令
3、退出redis

# 如何恢复rdb文件
只需要将rdb文件放到redis启动命令目录就行,redis会自动检查

优点:1、适合大规模的数据恢复;2、对数据完整性不高

缺点:1、需要一定的时间间隔;2、fork进程的会占用一定的内存空间

AOF

append only file,

保存的是appendonly.aof文件

# 默认AOF不开启,需要手动
appendonly yes

# 每秒写,最坏情况丢失一秒数据
appendfsync everysec

# root用户默认应该会在root目录下生成aof文件

# 如果aof文件有错误,是无法启动的,redis自带工具进行修复
默认目录应该是在/usr/local/bin下 redis-check-aof
redis-check-aof --fix +aof文件

# aof文件大于默认值64m,会有一个新的进程进行文件重写。aof默认的就是文件的无限追加
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb

优点:每一次修改都要同步,文件保存的完整会更加好;每秒同步。可能会丢失一秒的数据

缺点:修复的数据比rdb慢;效率也比rdb慢,所以默认是rdb

发布订阅

redis的发布订阅是一种消息通信的模式,下图所示某个channel被三个client订阅,当channel发布message时,只有订阅的client才能收到message

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gzoK2B8E-1638966392073)(F:/ZNV/%E7%AC%94%E8%AE%B0%E5%9B%BE%E7%89%87/redis/image-20211207201759543.png)]

1[PSUBSCRIBE pattern [pattern …]] 订阅一个或多个符合给定模式的频道。
2[PUBSUB subcommand [argument [argument …]]]查看订阅与发布系统状态。
3[PUBLISH channel message] 将信息发送到指定的频道。
4[PUNSUBSCRIBE [pattern [pattern …]]]退订所有给定模式的频道。
5[SUBSCRIBE channel [channel …]]订阅给定的一个或多个频道的信息。
6[UNSUBSCRIBE [channel [channel …]]]指退订给定的频道。
# 其中一个窗口
127.0.0.1:6379> SUBSCRIBE xiao # 订阅频道 xiao
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "xiao"
3) (integer) 1

# 另外一个窗口
127.0.0.1:6379> PUBLISH xiao 'hello world' # 推送信息到频道
(integer) 1

# 此时订阅该频道的将出现如下消息
1) "message"
2) "xiao"
3) "hello world"

主从复制

作用:

1、数据冗余:实现了数据的热备份

2、故障恢复:主节点出现问题的时候,可从节点提供服务

3、负载均衡:主从复制配合读写分离,主节点提供写服务,从节点提供读服务

4、高可用:集群配置

# 查看当前库的信息
127.0.0.1:6379> info replication
# Replication
role:master
connected_slaves:0
master_failover_state:no-failover
master_replid:bcf3e2b93c478207e0c733d7eeaf0904b61c76bd
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:0
second_repl_offset:-1
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0

伪分布式

将redis.conf复制三份分别端口为6379、6380、6381,端口查看是否冲突,还需修改pidfile文件、dump.rdb文件、log文件,分别启动

[root@lv94 my_redis_cofig]# redis-server /usr/local/soft/redis-6.2.6/my_redis_cofig/redis6379.conf
[root@lv94 my_redis_cofig]# redis-cli -p 6379

[root@lv94 my_redis_cofig]# redis-server /usr/local/soft/redis-6.2.6/my_redis_cofig/redis6380.conf
[root@lv94 my_redis_cofig]# redis-cli -p 6380

[root@lv94 my_redis_cofig]# redis-server /usr/local/soft/redis-6.2.6/my_redis_cofig/redis6381.conf
[root@lv94 my_redis_cofig]# redis-cli -p 6381

目前还没配置三台都是主机,一般情况下只用配置从机

127.0.0.1:6380> SLAVEOF 127.0.0.1 6379 # 配从机
OK
127.0.0.1:6380> info replication 
# Replication
role:slave
master_host:127.0.0.1
master_port:6379
master_link_status:up
master_last_io_seconds_ago:1
master_sync_in_progress:0
slave_read_repl_offset:14
slave_repl_offset:14
slave_priority:100
slave_read_only:1
replica_announced:1
connected_slaves:0
master_failover_state:no-failover
master_replid:362e035eefb0f1cde0660cd46d4eb16378f1392f
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> info replication
# Replication
role:master
connected_slaves:2
slave0:ip=127.0.0.1,port=6380,state=online,offset=140,lag=1
slave1:ip=127.0.0.1,port=6381,state=online,offset=140,lag=0
master_failover_state:no-failover
master_replid:362e035eefb0f1cde0660cd46d4eb16378f1392f
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:140
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:140

这样其实是在命令端,应该在配置文件中指定主从机

# 主机可写可读
127.0.0.1:6379> set k1 v1
OK
127.0.0.1:6379> get k1
"v1"
127.0.0.1:6379>

# 从机只能读
127.0.0.1:6381> set k1 v1
(error) READONLY You can't write against a read only replica.
127.0.0.1:6381> get k1
"v1"

主机宕机的时候从机还是连接到主机的,身份依旧是从机
主机从宕机恢复后,从机还是可以直接获取信息

复制原理

从机启动后成功连接主机后,会发送一个同步的命令

主机接收到命令后,启动后台存盘的进程,同时接收所有修改数据集的命令,在后台进程执行完毕之后,主机将传送整个数据文件到从机,并且完成一次全量同步

全量复制:从机服务接收到数据库文件后,将其存盘并加载到内存

增量复制:主机将新的所有收集到的修改的命令依次传给从机,完成同步

但默认的只要连接到主机,就会实现一次全量复制

# 主机断开,手工变成主机
127.0.0.1:6381> SLAVEOF no one
OK

哨兵模式

自动选举,监控后台主机是否故障

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0SxwSVes-1638966392075)(F:/ZNV/%E7%AC%94%E8%AE%B0%E5%9B%BE%E7%89%87/redis/image-20211208192807790.png)]

一个哨兵可能会出现问题,这个时候就要使用多哨兵的模式

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hEZ7np9T-1638966392075)(F:/ZNV/%E7%AC%94%E8%AE%B0%E5%9B%BE%E7%89%87/redis/image-20211208192930908.png)]

假设服务器宕机,哨兵1检测发现后并不会立马进行failover过程,仅仅是哨兵1主观的认为主服务器不可用,该现象称为主观下线,当后面哨兵也检测到主的服务器不可用,数量达到一定值时,哨兵之前就会投票,进行failover(故障转移)操作,会通过发布订阅模式,各个哨兵会把自己监控的服务器切换到主机,这叫客观下线

# 配置哨兵文件sentinel.conf
[root@lv94 my_redis_cofig]# cat sentinel.conf
# sentinel monitor 监控名 host 端口 1
sentinel monitor myredis 127.0.0.1 6379 1

1 表示主机宕机时,slave投票让哪一台接替主机,票数最多就是新主机

# 启动哨兵,注意路径
redis-sentinel sentinel.conf

# 6379端口主机宕机后 自动投票选取新主机6380端口
72940:X 08 Dec 2021 19:43:37.834 # +sdown master myredis 127.0.0.1 6379
72940:X 08 Dec 2021 19:43:37.834 # +odown master myredis 127.0.0.1 6379 #quorum 1/1
72940:X 08 Dec 2021 19:43:37.834 # +new-epoch 1
72940:X 08 Dec 2021 19:43:37.834 # +try-failover master myredis 127.0.0.1 6379
72940:X 08 Dec 2021 19:43:37.835 # +vote-for-leader 46af06f048384a3c850f562768d0e33ce42e9b85 1
72940:X 08 Dec 2021 19:43:37.835 # +elected-leader master myredis 127.0.0.1 6379
72940:X 08 Dec 2021 19:43:37.835 # +failover-state-select-slave master myredis 127.0.0.1 6379
72940:X 08 Dec 2021 19:43:37.898 # +selected-slave slave 127.0.0.1:6380 127.0.0.1 6380 @ myredis 127.0.0.1 6379
72940:X 08 Dec 2021 19:43:37.898 * +failover-state-send-slaveof-noone slave 127.0.0.1:6380 127.0.0.1 6380 @ myredis 127.0.0.1 6379
72940:X 08 Dec 2021 19:43:37.988 * +failover-state-wait-promotion slave 127.0.0.1:6380 127.0.0.1 6380 @ myredis 127.0.0.1 6379
72940:X 08 Dec 2021 19:43:38.872 # +promoted-slave slave 127.0.0.1:6380 127.0.0.1 6380 @ myredis 127.0.0.1 6379
72940:X 08 Dec 2021 19:43:38.872 # +failover-state-reconf-slaves master myredis 127.0.0.1 6379
72940:X 08 Dec 2021 19:43:38.926 * +slave-reconf-sent slave 127.0.0.1:6381 127.0.0.1 6381 @ myredis 127.0.0.1 6379
72940:X 08 Dec 2021 19:43:39.935 * +slave-reconf-inprog slave 127.0.0.1:6381 127.0.0.1 6381 @ myredis 127.0.0.1 6379
72940:X 08 Dec 2021 19:43:39.935 * +slave-reconf-done slave 127.0.0.1:6381 127.0.0.1 6381 @ myredis 127.0.0.1 6379
72940:X 08 Dec 2021 19:43:40.019 # +failover-end master myredis 127.0.0.1 6379
72940:X 08 Dec 2021 19:43:40.019 # +switch-master myredis 127.0.0.1 6379 127.0.0.1 6380
72940:X 08 Dec 2021 19:43:40.019 * +slave slave 127.0.0.1:6381 127.0.0.1 6381 @ myredis 127.0.0.1 6380
72940:X 08 Dec 2021 19:43:40.019 * +slave slave 127.0.0.1:6379 127.0.0.1 6379 @ myredis 127.0.0.1 6380
72940:X 08 Dec 2021 19:44:10.024 # +sdown slave 127.0.0.1:6379 127.0.0.1 6379 @ myredis 127.0.0.1 6380

注意,当6379恢复后,会变成6380的从节点

优点:哨兵模式基于主从复制,主从切换方便,自动切换

缺点:redis不好在线扩容,数量上限,扩容麻烦,哨兵模式选项很多

# Example sentinel.conf
# 哨兵sentinel实例运行的端口 默认26379
port 26379

# 哨兵sentinel的工作目录
dir /tmp

# 哨兵sentinel监控的redis主节点的 ip port
# master-name 可以自己命名的主节点名字 只能由字母A-z、数字0-9 、这三个字符".-_"组成。
# quorum 配置多少个sentinel哨兵统一认为master主节点失联 那么这时客观上认为主节点失联了
# sentinel monitor <master-name> <ip> <redis-port> <quorum>
sentinel monitor mymaster 127.0.0.1 6379 2

# 当在Redis实例中开启了requirepass foobared 授权密码 这样所有连接Redis实例的客户端都要提供密码
# 设置哨兵sentinel 连接主从的密码 注意必须为主从设置一样的验证密码
# sentinel auth-pass <master-name> <password>
sentinel auth-pass mymaster MySUPER--secret-0123passw0rd

# 指定多少毫秒之后 主节点没有应答哨兵sentinel 此时 哨兵主观上认为主节点下线 默认30秒
# sentinel down-after-milliseconds <master-name> <milliseconds>
sentinel down-after-milliseconds mymaster 30000

# 这个配置项指定了在发生failover主备切换时最多可以有多少个slave同时对新的master进行 同步,这个数字越小,完成failover所需的时间就越长,但是如果这个数字越大,就意味着越 多的slave因为replication而不可用。可以通过将这个值设为 1 来保证每次只有一个slave 处于不能处理命令请求的状态。
# sentinel parallel-syncs <master-name> <numslaves>
sentinel parallel-syncs mymaster 1

# 故障转移的超时时间 failover-timeout 可以用在以下这些方面:
#1. 同一个sentinel对同一个master两次failover之间的间隔时间。
#2. 当一个slave从一个错误的master那里同步数据开始计算时间。直到slave被纠正为向正确的master那里同步数据时。
#3.当想要取消一个正在进行的failover所需要的时间。 
#4.当进行failover时,配置所有slaves指向新的master所需的最大时间。不过,即使过了这个超时,slaves依然会被正确配置为指向master,但是就不按parallel-syncs所配置的规则来了
# 默认三分钟
# sentinel failover-timeout <master-name> <milliseconds>
sentinel failover-timeout mymaster 180000

# SCRIPTS EXECUTION
#配置当某一事件发生时所需要执行的脚本,可以通过脚本来通知管理员,例如当系统运行不正常时发邮件通知相关人员。
#对于脚本的运行结果有以下规则:
#若脚本执行后返回1,那么该脚本稍后将会被再次执行,重复次数目前默认为10
#若脚本执行后返回2,或者比2更高的一个返回值,脚本将不会重复执行。
#如果脚本在执行过程中由于收到系统中断信号被终止了,则同返回值为1时的行为相同。
#一个脚本的最大执行时间为60s,如果超过这个时间,脚本将会被一个SIGKILL信号终止,之后重新执行。
#通知型脚本:当sentinel有任何警告级别的事件发生时(比如说redis实例的主观失效和客观失效等等),将会去调用这个脚本,这时这个脚本应该通过邮件,SMS等方式去通知系统管理员关于系统不正常运行的信息。调用该脚本时,将传给脚本两个参数,一个是事件的类型,一个是事件的描述。如果sentinel.conf配置文件中配置了这个脚本路径,那么必须保证这个脚本存在于这个路径,并且是可执行的,否则sentinel无法正常启动成功。

#通知脚本
# shell编程
# sentinel notification-script <master-name> <script-path>
sentinel notification-script mymaster /var/redis/notify.sh

# 客户端重新配置主节点参数脚本
# 当一个master由于failover而发生改变时,这个脚本将会被调用,通知相关的客户端关于master地址已经发生改变的信息。
# 以下参数将会在调用脚本时传给脚本:
# <master-name> <role> <state> <from-ip> <from-port> <to-ip> <to-port>
# 目前<state>总是“failover”,
# <role>是“leader”或者“observer”中的一个。
# 参数 from-ip, from-port, to-ip, to-port是用来和旧的master和新的master(即旧的slave)通信的
# 这个脚本应该是通用的,能被多次调用,不是针对性的。
# sentinel client-reconfig-script <master-name> <script-path>
sentinel client-reconfig-script mymaster /var/redis/reconfig.sh # 一般都是由运维来配置!

缓存穿透和雪崩

缓存穿透

问题:用户所查数据缓存中没有,向数据库查询,数据库也没,用户还很多,那数据库就会崩掉,这就是缓存穿透

解决:1、可将该值存为空,这样查询也可返回空,但这样会需要更多的空间存储空值的键;2、添加过滤器(布隆过滤器),对所查询的参数进行hash验证,布隆可以判断一定不存在

缓存击穿

问题:同上面穿透,但是是一个热点行为,指一个key并发很高,我们设想,在此热点key失效时,就会击穿缓存,直接并发请求数据库

解决:1、设置热点数据永不过期;2、加互斥的锁,确保某一线程操作时,其他线程没有执行权限

缓存雪崩

问题:某一时间端,缓存集中过期失效,宕机

解决:1、redis集群;2、加锁/队列,类似于削峰处理;3、设置不同的过期时间,分批次加入缓存

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

友培

数据皆开源!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值