【Redis】事务和持久化

来源:互联网 发布:怎么查看服务器端口 编辑:程序博客网 时间:2024/06/05 22:59

一、前言:

    前面已经写过两篇博客来分别介绍Redis基础知识和Redis数据类型,这篇博客将简单说一下事务和持久化。

    我们已经学过SQL Server,相信大家对事务都不陌生,在此不再赘述。所谓持久化就是将内存中的数据写入到磁盘的过程。


二、事务:

    Redis通过multi、discard、exec和watch四个命令来实现事务功能,这四个指令构成了Redis事务处理的基础。

    .multi用来组装一个事务;

    .exec用来执行一个事务;

    .discard用来取消一个事务;

    .watch用来监视一些key,一旦这些key在事务执行之前被改变,则取消事务的执行。

    但目前对事务的支持还比较简单,Redis只能保证一个Client发起的事务中的命令可以连续执行。由于Redis是通过单线程来处理所有Client请求,所以做到这点很容易的。

    一般情况下Redis在接收到一个Client发来的命令后会立即处理并返回处理结果;但是当一个client发出multi命令后,这个连接会进入一个事务上下文,该连接后序的命令并不是立即执行,而是先放到一个队列中。当此连接接受到exec命令后,redis会顺序执行队列中的所有命令。并将所有命令的运行结果打包到一起返回给Client。然后此连接就结束事务上下文。参考下面例子:

               

    从这个例子,我们可以看到incr a,incr b命令发出后并没有马上执行,而是暂时放入队列中。调用exec后两个命令被连续的执行,最后返回的是两条命令执行后的结果。

    我们还可以调用discard命令来取消一个事务。参考下例: 

                  

    可以发现这次incr a incr b都没有执行。discard命令其实就是清空事务的命令队列并退出事务上下文。

    redis的watch命令,可以用来实现类似于"乐观锁"的效果,watch的作用是"监视key是否被修改过",而且支持同时监视多个key,只要还没有真正出发事务,watch都会尽职尽责的监视,一旦发现某个key被修改了,在执行exec时就会返回nil,表示事务无法触发。

                 

三、持久化:

    Redis是一个支持持久化的内存数据库,也就是说redis需要经常讲内存中的数据同步到磁盘来保证持久化。目前Redis支持两种持久化的方式,分别是是RDB(Redis DataBase)和AOF(Append Only File)。

    RDB,简而言之,就是在不同的时间点,将Redis存储的数据生成快照并存储到磁盘等介质上;AOF,则是换了一个角度来持久化,那就是将redis执行过的所有写执行记录下来,在下次redis重新启动时,只要把这些执行从前到后再重复执行一遍,就可以实现数据恢复了。

    当然,如果你没有数据持久化的需求,也完全可以关闭RDB和AOF方式,这样的话,Redis将变成一个纯内存数据库,就像memcached一样。那么我们应该选择RDB还是AOF,官方的建议是两个同时使用。这样可以提供更可靠的持久化方案。

1、RDB:

    RDB是默认的持久化方式。这种方式就是将内存中数据以快照的方式写入到二进制文件中,默认的文件名为dump.rdb。可以通过配置自动做快照持久化。

    在Redis.conf中可以配置,默认配置如下:  

<span style="font-size:24px;"><span style="font-family:KaiTi_GB2312;font-size:18px;"><span style="font-family:KaiTi_GB2312;font-size:24px;">     save 900 1         #900秒内如超过一个key被修改,则发起快照保存。     save 300 10        #300秒内如超过10个key被修改,则发起快照保存。     save 60 10000</span></span></span>

2、AOF:

    AOF比快照方法有更好的持久化性,因为在使用AOF持久化时,Redis会将收到的每一个写命令都通过write函数追加到文件中(默认为appendonly.aof)

    当Redis重启会通过执行文件中保存的写命令来在内存中重建整个数据库的内容。由于OS会在内核中缓存write做的修改,所以可能不是立即写到磁盘上。这样AOF方式的持久化有可能会丢失部分修改。当然,我们可以通过配置文件告诉Redis,我们要通过fsync函数强制OS写入到磁盘的时机。

     

<span style="font-size:24px;"><span style="font-family:KaiTi_GB2312;font-size:18px;"><span style="font-family:KaiTi_GB2312;font-size:24px;">     appendonly  yes          #启用AOF持久化方式     appendonly  always       #每次收到写命令就立即强制写入磁盘,速度最慢,但是保证完全的持久化,不推荐使用     appendfsync everysec     #每秒钟强制写入磁盘一次,在性能和持久化方面做了很好的折中,推荐     appendfsync  no          #完全依赖os,性能最好,持久化没有保证</span></span></span>


四、总结:

    首先介绍了Redis的简单介绍以及数据类型,然后又了解它的事务和持久化等特性。但关于Redis的其他特性,如主从复制、虚拟内存等都需要我们去挖掘。


     

     


    



0 0
原创粉丝点击