实战redis

简介: redis事务、持久化、发布订阅、主从复制。

redis实战

(1)redis事务

  • redis不存在事务隔离级别

  • redis对单条命令保证原子性,对事务不保证

    --队列  set  set set 执行--
    

    开启事务(multi)

    命令入队(写命令)

    事务执行(exec)

    取消事务(discard)

1、事务开启时,所有的命令都会进入到队列中,并不会执行,只有当我们执行exec命令时,所有的命令才会执行。

2、当我们出现编译错误时,执行exec命令时,所有的命令都不会被执行。

3、出现 运行时异常 ,执行exec命令时,并不影响其他代码的操作。

1、redis锁机制

redis的锁实现是乐观锁

  • 悲观锁:执行一件事没有结束时只可以自己操作,别人要想操作只能等待。

  • 乐观锁:执行一件事没有结束时别人也可以操作,为设置一个version,当别人如果修改数据的话,version就会改变,执行事情就会失败。

redis的watch可以当作乐观锁使用。修改失败后,我们放弃监视(unwatch)的值,从新监视就行了。

springboot2.x之后,对redis的操作底层已经不是jedis了,而是 lettuce-core

lettuce-core 采用的是netty,可以减少线程数据,更像NIO模式。

(2)redis持久化

redis是内存数据库,当进程结束或服务器关闭时,我们不去做数据的持久化的话,那么数据就会丢失在我们下次使用时,所以redis的持久化很重要。

1、RDB(redis database)

SNAPSHOTTING:快照

save 900 1 //自动保存策略,表示900秒内,至少1个key发生变化,保存
  • stop-writes-on-bgsave-error : 默认值为yes。持久化失败了,还继续工作。

  • rdbcompression: 默认值是yes。对于存储到磁盘中的快照,可以设置是否进行压缩存储。如果是的话,redis会采用LZF算法进行压缩。

  • rdbchecksum: 默认值是yes。在存储快照后,我们还可以让redis使用CRC64算法来进行数据校验。

  • dbfilename : 设置快照的文件名,默认是 dump.rdb

  • dir: 设置快照文件的存放路径,这个配置项一定是个目录,而不能是文件名。默认是和当前配置文件保存在同一目录。

持久化机制:

  • 正常的执行保存的策略

  • 执行save,bgsave,flushall和redis正常的关闭

    save:该命令会阻塞当前Redis服务器,执行save命令期间,Redis不能处理其他命令,直到RDB过程完成为止。
    bgsave:Redis会在后台异步进行快照操作,快照同时还可以响应客户端请求。具体操作是Redis进程执行fork操作创建子进程,RDB持久化过程由子进程负责,完成后自动结束。也是RDB后台持久化的原理。
    

优点:

  • 可以对大规模数据恢复。
  • 利用fork子进程操作持久化,效率高。

缺点:

  • 操作持久化有时间间隔,突然的宕机可以导致一些数据无法保存。
2、持久化AOF

以日志的形式来记录每个写操作,将Redis执行过的所有指令记录下来(读操作不记录) , 只可以追加文件但不可以改写文件, redis启动之初会读取该文件重新构建数据换言之 , redis重 启的话就根据日志文件的内容将写指令 从前到后执行一-次以完成数据的恢复工作。

  • AOF:在redis中默认是不开启的

    appendonly no #默认是关闭的
    appendfilename "appendonly.aof" #存储的文件名
    
  • 更新日志的条件

# appendfsync always  同步持久化,每次发生数据变化会立刻写入到磁盘中。性能较差当数据完整性比较好(慢,安全)
appendfsync everysec  #默认选项,1秒异步执行一次
# appendfsync no   Redis不会主动调用fsync去将AOF日志内容同步到磁盘,所以这一切就完全依赖于操作系统的调试了。对大多数Linux操作系统,是每30秒进行一次fsync,将缓冲区中的数据写到磁盘上
  • AOF的文件恢复数据

正常情况下appendonly.aof文件生成在到redis的安装目录的bin目录下,重启redis服务时就可以读取该配置文件。因为某些原因导致appendonly.aof文件格式异常,从而导致数据还原失败,可以通过命令redis-check-aof --fix appendonly.aof 进行修复 。

  • AOF重写机制

AOF的工作原理是将写操作追加到文件中,文件的冗余内容会越来越多。所以 Redis 就有了重写机制, Redis就会启动AOF文件压缩,只保留可以恢复数据的最小指令集,可以使用命令bgrewriteaof 。

**触发机制:**Redis会记录上次重写时的AOF文件大小,默认配置时当AOF文件大小是上次rewrite后大小的一倍且文件大于64M时触发

auto-aof-rewrite-percentage 100 (一倍)
auto-aof-rewrite-min-size 64mb

**优点:**数据的完整性很高。

**缺点:**当数据库内容很多时,数据恢复的速率会很慢

(3)redis的发布订阅

客户端命令订阅一个频道,就会接收服务端队列发来信息。非常简单。

(4)redis主从复制

1、主从复制,是指将一台Redis服务器的数据 ,复制到其他的Redis服务器。前者称为主节点(master/leader) ,后者称为从节点(slave/follower) ;数据的复制是单向的,只能由主节点到从节点。Master以写为主, Slave以读为主。

127.0.0.1:6379> info replication   #查看redis的信息
# Replication
role:master    #当前库的角色
connected_slaves:0  #连接从机的个数
master_replid:43d783d6c91ccee4bf9e97099f104f1d0740e92f
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

2、 默认每一台服务器都是主机(主节点),

slaveof ip  port  #找给地址的redis服务器当老大。

3、slaveof 127.0.0.1 6379,默认将该地址下的redis服务器当主机,此时运行该命令的服务器就会默认当作从机了。

role: slave  #变成了从机
master host:127 .0.0.1 #主机的ip地址
master port:6379  #主机端口
master_ Link_ status:up #在线状态
master last io seconds ago :3
master sync_ in progress:0
slave_ repl_ offset:14

4、命令配置主从复制是暂时的,想要永久生效我们要通过配置文件配置

5、 在主从复制中,从机只可以进行读操作

  • 当主机宕机的话,从机依然连接这主机,但是不可以进行写操作了。
  • 如果是使用命令行,来配置的主从,这个时候如果重启了,就会变回主机!只要变为从机,立马就会从主机中获取值!

Slave启动成功连接到master后会发送一个sync同步命令,Master接到命令,启动后台的存盘进程,同时收集所有接收到的用于修改数据集命令,在后台进程执行完毕之后,master将传送整个数据文件到slave ,并完成一次完全同步。
**全量复制:**而slave服务在接收到数据库文件数据后,将其存盘并加载到内存中。

增量复制: Master继续将新的所有收集到的修改命令依次传给slave ,完成同步。

6、 配置集群的方法我们可以:一主二从层层链表

当主机挂了,我们可以使用 slaveof no one 命令,在第二个服务器中使用,将该服务器当作主机。

1、哨兵模式

主从切换技术的方法是: 当主服务器宕机后,需要手动把一台从服务器切换为主服务器,这就需要人工干预,费事费力,还会造成一段时间内服务不可用。这不是一种推荐的方式,更多时候,我们优先考虑哨兵模式。Redis从2.8开始正式提供了Sentinel (哨兵)架构来解决这个问题。

哨兵模式是一种特殊的模式,首先Redis提供了哨兵的命令,哨兵是一个独立的进程,作为进程,它会独立运行。其原理是哨兵通过发送命令,等待Redis服务器响应,从而监控运行的多个Redis实例。如果故障了根据投票数自动将从库转换为主库。

配置哨兵模式

sentinel.conf #哨兵默认的配置文件
-------------------------------------
# time while performing the synchronization with the master.
sentinel monitor mymaster 127.0.0.1 6379 2 #核心配置:sentinel monitor 名称(随意) IP 端口 票数
# sentinel failover-timeout <master-name> <milliseconds>

打开后会自动找出主机下面的从机

主机挂了,就会随机从从机服务服务器中随机选择(投票算法)一个当作主机,如果主机此时回来了,只能归并到新的主机下,当做从机,这就是哨兵模式的规则!

# 架构 

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×