Redis(笔记三)---持久化

1. Redis持久化

1.1 Redis之生存时间

1.1 设置生存时间 expire key seconds

Redis在实际使用过程中更多的用作缓存,然而缓存的数据一般都是需要设置生存时间的,即:到期后数据销毁。

EXPIRE key seconds
127.0.0.1:6379> set test 123
OK
127.0.0.1:6379> EXPIRE test 10
(integer) 1
127.0.0.1:6379> TTL test
(integer) 4
127.0.0.1:6379> TTL test
(integer) 3
127.0.0.1:6379> TTL test
(integer) 3
127.0.0.1:6379> TTL test
(integer) 2

1.1.2 清除生存时间 persist

PERSIST key
127.0.0.1:6379> set test 123
OK
127.0.0.1:6379> EXPIRE test 60
(integer) 1
127.0.0.1:6379> TTL test
(integer) 56
127.0.0.1:6379> PERSIST test
(integer) 1
127.0.0.1:6379> TTL test
(integer) -1

注意:重新设置值也会清除生存时间。

1.1.3 生存时间设置单位为:毫秒

PEXPIRE key milliseconds
127.0.0.1:6379> set test 123
OK
127.0.0.1:6379> PEXPIRE test 10000
(integer) 1
127.0.0.1:6379> TTL test
(integer) 7
127.0.0.1:6379> TTL test
(integer) 6
127.0.0.1:6379> TTL test
(integer) 5

1.2 Redis的持久化

Redis的强大功能很大程度上是由于其将所有数据都存储在内存中,为了使Redis在重启后仍能保证数据不丢失,需要将数据从内存中以某种形式持久化到硬盘中。

Redis支持两种方式的持久化,一种是RDB方式,一种是AOF方式。可以单独使用其中一种或将两种结合使用。

RDB方式是通过快照完成的,当符合一定条件时Redis会自动将内存中的所有数据进行快照并且存储到硬盘上。进行快照的条件在配置文件中指定,有2个参数构成:时间和改动的键的个数,当在指定时间内被更改的键的个数大于指定数值时就会进行快照。

RDB是Redis的默认持久化方式。

1.2.1 Redis的持久化之RDB

在配置文件中已经预置了3个条件:

save 900 1  #15分钟内有至少1个键被更改则进行快照

save 300 10  #5分钟内至少有10个键被更改则进行快照

save 60 10000  #1分钟内至少有10000个键被更改则进行快照

以上条件之间是“或”的关系。

默认的rdb的文件路径是在当前目录,文件名是:dump.rdb,可以在配置文件中修改路径和文件名,分别是dir和dbfilename。

Redis启动后会读取RDB快照文件,将数据从硬盘载入到内存,一般情况下1GB的快照文件载入到内存的时间约为20~30秒钟。(不同服务器会有差异)

RDB的快照过程如下:

  1. Redis使用fork函数复制一份当前进程(父进程)的副本(子进程);
  2. 父进程继续接收并处理客户端发来的命令,而子进程开始将内存中的数据写入到硬盘中的临时文件;
  3. 当子进程写入完所有数据后会用该临时文件替换旧的RDB文件。

RDB文件是通过压缩的,可以通过配置rdbcompression参数来禁用压缩。

思考? 压缩与不压缩的优缺点是什么?

可以通过SAVE和BGSAVE命令来手动快照,两个命令的区别是前者是由主进程进行快照,会阻塞其他请求,后者是通过fork子进程快照操作。

注意:由于Redis使用fork来复制一份当前进程,那么子进程就会占有和主进程一样的内存资源,比如说主进程8G内存,那么在备份的时候必须保证有16G的内存,要不然会启用虚拟内存,性能非常差。

1.2.2 Redis的持久化之AOF

Redis的AOF持久化策略是将发送到Redis服务端的每一条命令都记录下来,并且保存到硬盘中的AOF文件,AOF文件的位置和RDB文件的位置相同,都是通过dir参数设置,默认的文件名是appendonly.aof,可以通过appendfilename参数修改。

127.0.0.1:6379> set test 123
OK
127.0.0.1:6379> set test2 234
OK

执行以上命令,可以看到appendonly.aof文件中保存了操作命令:

*2
$6
SELECT
$1
0
*3
$3
set
$4
test
$3
123
*3
$3
set
$5
test2
$3
234

可以使用BGREWRITEAOF命令来重写AOF文件。

重写策略的参数设置:

auto-aof-rewrite-percentage 100

当前的AOF文件大小超过上一次重写时的AOF文件大小的百分之多少时会再次进行重写,如果之前没有重写过,则以启动时的AOF文件大小为依据。
 

auto-aof-rewrite-min-size 64mb

限制了允许重写的最小AOF文件大小,通常在AOF文件很小的时候即使其中有些冗余的命令也是可以忽略的。

文件写入默认情况下会先写入到系统的缓存中,系统每30秒同步一次,才是真正的写入到硬盘,如果在这30秒服务器宕机那数据也会丢失的,Redis可以通过配置来修改同步策略:

# appendfsync always  每次都同步 (最安全但是最慢)

appendfsync everysec  每秒同步  (默认的同步策略)

# appendfsync no  不主动同步,由操作系统来决定 (最快但是不安全)

1.3 Redis的Java客户端

Redis不仅是使用命令来操作,现在基本上主流的语言都有客户端支持,比如java、C、C#、C++、php、Node.js、Go等。

在官方网站里列一些Java的客户端,有Jedis、Redisson、Jredis、JDBC-Redis、等其中官方推荐使用Jedis和Redisson。

在企业中用的最多的就是Jedis, Jedis同样也是托管在github上,地址:https://github.com/xetorthio/jedis

1.2.1 Jedis入门

Jedis基本上实现了所有的Redis命令,并且还支持连接池、集群等高级的用法,而且使用简单,使得在Java中使用Redis服务将变得非常的简单。

Jedis只有一个依赖,那就是commons-pool。 从Maven的依赖可以看出来:

我的第一个Jedis程序

 JedisPool连接池的使用

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值