redis 事务,与memocache的区别和持久化

redis 事务,与memocache的区别和持久化

  • Redis 事务
    • 分为三个阶段:
    • 乐观锁和悲观锁
      • 悲观锁:
      • 乐观锁:
    • 监视命令
    • Redis事务的三个特性
      • 1.单独的隔离操作
      • 2.没有隔离界别的概念
      • 3.不保证原子性
  • memocache与redis的区别
  • Redis持久化
    • RDB(Redis DataBase)
      • 备份
      • fork
      • 设置RDB文件存储地址
      • rdb的保存策略
      • rdb的优缺点
    • AOF(Append Of File)
      • AOF同步频率设置
      • AOF重写
      • AOF优缺点:
    • AOF和RDB用哪个好

Redis 事务

Redis事务还是一个单独的隔离操作:事务中的所有命令都会序列化,按顺序地执行,事务在执行过程中,不会被其他客户端发送的命令请求所打断

Redis事务主要作用就是串联多个命令防止别的命令插队

分为三个阶段:

Multi:(组队阶段):
从输入Multi命令开始,输入的命令都会一次进入命令队列,但不会执行。
Exec(执行阶段):
当输入Exec后,Redis会将之前的命令队列中的命令依次执行
discard(放弃组队):
组队过程中可以通过discard来放弃组队

组队阶段时某个命令出现了报告错误,执行时整个所有队列都会被取消。也就是说有语法错误的话,那么将不会被执行
执行阶段某个命令执行报错,执行时会跳过那个命令。

乐观锁和悲观锁

悲观锁:

在执行操作之前先上锁,然后在执行操作,在执行的过程中,其他线程无法进行该操作,直到执行完毕,锁解除。
关系型数据库采用了很多的悲观锁

乐观锁:

当进行操作的时候不会上锁,但是当数据进行修改时候会修改数据的版本,当版本对不上的时候,则操作失败
redis采用的是check-and-set机制实现的的乐观锁事务
乐观锁适用于多读的应用类型,可以提高吞吐量

监视命令

WATCH key1 key2…
在执行multi之前,先执行watch key1可以监视一个或多个key,如果事务执行之前这个或者这些key被其他命令所改动,那么事务将被打断
**unwatch **
取消watch命令对所有key的监视
如果在执行watch命令之后,exec命令或者discard命令先被执行了的话,那么久不需要再执行了

Redis事务的三个特性

1.单独的隔离操作

事务中的所有命令都会被序列化,按顺序地执行,事务在执行的过程中,不会被其他客户端发来的命令请求所打断

2.没有隔离界别的概念

队列中的命令没有提交之前都不会实际的备操作,因为事务提交前的任何指令都不会被实际执行,所以就不需要隔离级别的概念

3.不保证原子性

Redis执行阶段,同一个事务中如果有一个命令执行失败,其后的命令依然被执行不会被回滚

memocache与redis的区别

1.memocache不支持持久化,redis支持持久化
2.momocache支持简单的key-value,redis除了简单的key-value,还有list之类的操作
3.memocache是多线程加锁,redis是单线程加IO多路复用

Redis持久化

支持两种不同形式的持久化方式
RDB(Redis DataBase)
AOF(Append Of File)

RDB(Redis DataBase)

指定的时间间隔内将内存中的数据集快照写入磁盘,也就是行话里面的Snapshot快照,它恢复时是将快照文件直接读到内存里

备份

Redis会单独创建(fork)一个子进程来进行持久化,会先将数据写入到一个临时文件中,待持久化过程都结束了,再用这个临时文件替换上次持久化好的文件。
整个过程中,主线程是不会进行任何IO操作的。
这就确保了极高的性能如果需要进行大规模数据的恢复。
且对于数据恢复的完整性不是非常敏感,那RDB方式要比AOF方式更加的高效
RDB的缺点就是最后一次持久化后的数据可能丢失

fork

在linux程序中,fork会产生一个与父进程完全相同的子进程,但子进程在此后多会exec系统调用,处于效率考虑。
linux中引入了**“写时复制技术”,一般情况父进程和子进程会共用同一段物理内存**,只有进程空间的各段的内容要发生变化时,才会将父进程的内容复制一份给子进程

设置RDB文件存储地址

在redis.conf文件中修改持久化文件,dump.rdb的存储路径(原先是dir ./)
在这里插入图片描述
redis 事务,与memocache的区别和持久化_第1张图片
redis 事务,与memocache的区别和持久化_第2张图片

rdb的保存策略

save 900 1
在15分钟(900s)时最少一个key发生了变化,就会发生保存
save 300 10
在5分钟(300s)时最少10个key发生了变化,就会发生保存
save 60 10000
在1分钟(60s)时最少一万个key发生了变化,就会发生保存

stop-writes-on-bgsave-error yes
当redis无法写入磁盘的话,直接关闭redis的写操作

rdbcompression yes
进行rdb保存时,将文件压缩

rdbchecksum yes
在存储快照后,还可以让redis使用CRC64算法进行数据校验
但是这样会增加大约10%的性能消耗,如果希望获得最大的性能提升,可以关闭此功能

rdb的优缺点

rdb的优点:
1.节省磁盘空间;
2.恢复速度快
rdb的缺点:
虽然Redis在fork时使用了写时拷贝技术,但是如果数据庞大时还是比较消耗性能
在备份周期在一定间隔时间做一次备份,所以如果Redis意外down掉的话,就会丢失最后一次快照后的所有修改

AOF(Append Of File)

以日志的形式来记录每个写操作,将redis执行过的所有写指令记录下来,只追加文件,但是不可修改
redis重启的话,会根据日志文件的内容将写指令从前到后执行一次以完成数据的恢复操作

AOF默认不开启,需要手动在配置文件中配置
appendonly no

AOF和RDB同时开启,系统默认取AOF的数据

AOF同步频率设置

appendfsync always
始终同步,每次redis的写入都会like记入日志
appendfsync ererysec
每秒同步,每秒记入日志依稀,如果宕机,本秒的数据可能丢失
appendfsync no
不主动进行同步,把同步时机交给操作系统

AOF重写

Rewrite
当AOF文件持续增长而过大时,会fork出一条新进程来将文件重写

AOF优缺点:

AOF优点:
备份机制更稳健,丢失数据概率更低。
可读的日志文件,通过操作AOF稳健,可以处理误操作。
AOF缺点:
比起RDB占用更多的磁盘空间
恢复备份速度要慢
每次读写都同步的话,有一定的性能压力
存在个别BUG,无法恢复

AOF和RDB用哪个好

官方推荐两个都启用
如果对数据不敏感,可以单独用RDB
不建议单独使用AOF,因为可能会出现BUG
如果只是做纯内存缓存,可以都不用

你可能感兴趣的:(Linux,redis,redis,linux)