Redis数据安全与性能优化

1.Redis持久化选项

持久化方式:

  • 快照
在某一时刻将所有数据都写入硬盘
具体配置选项如下:
#60 秒后如果至少有 1000个 key 的值变化,则保存
save 60 1000    
# 默认情况下,如果 redis 最后一次的后台保存失败,redis 将停止接受写操作,
# 这样以一种强硬的方式让用户知道数据不能正确的持久化到磁盘,
# 否则就会没人注意到灾难的发生。
# 如果后台保存进程重新启动工作了,redis 也将自动的允许写操作。
# 然而你要是安装了靠谱的监控,你可能不希望 redis 这样做,那你就改成 no 好了。
stop-writes-on-bgsave-error no
# 是否在 dump .rdb 数据库的时候使用 LZF 压缩字符串
# 默认都设为 yes
# 如果你希望保存子进程节省点 cpu ,你就设置它为 no ,
# 不过这个数据集可能就会比较大
rdbcompression yes
# 设置 dump 的文件位置
dbfilename dump.rdb
# 工作目录
# 例如上面的 dbfilename 只指定了文件名,
# 但是它会写入到这个目录下。这个配置项一定是个目录,而不能是文件名。
dir ./
# 附 redis.conf 配置选项的中文解读
https://github.com/linli8/cnblogs/blob/master/redis%E5%89%AF%E6%9C%AC.conf
  • AOF文件
在执行写入命令时,将命令追加至硬盘
具体配置选项如下:
#是否开启AOF追加
appendonly no
#AOF追加的频率
#everysec没秒追加一次
#always 每条指令都追加,影响性能,影响磁盘寿命
#no 不主动追加,由操作系统决定合适追加至文件
appendfsync everysec
#在rewrite的时候是否对新的写操作进行fsync。no表示进行fsync,yes表示不进行
no-appendfsync-on-rewrite no
#当AOF文件大小大于上次重写(BGREWRITEAOF,后面会讲)之后的100%时,会对AOF文件执行BGREWRITEAOF操作
auto-aof-rewrite-percentage 100
#当AOF文件大小大于之后的64mb时,会对AOF文件执行BGREWRITEAOF操作
auto-aof-rewrite-min-size 64mb
# 工作目录
# 例如上面的 dbfilename 只指定了文件名,
# 但是它会写入到这个目录下。这个配置项一定是个目录,而不能是文件名。
dir ./

1.1 快照

快照会被写入dbfilename选项指定的文件中。如果在快照文件创建完毕之前,Redis、系统或者硬件这三者其中之一崩溃,那么Redis将会丢失最近一次快照之后的所有数据。
创建快照的几个办法:

  • 客户端向Redis发送BGSAVE命令来创建快照。对于支持BGSAVE命令的平台来说(除windows外基本都支持),Redis会调用fork创建一个子进程,然后由子进程负责将快照写入硬盘,而父进程则负责继续处理命令请求。
  • 客户端向Redis发送SAVE命令来创建快照。接到SAVE命令的Redis服务器在创建完快照之前不会响应其他任何命令。SAVE命令不常用,一般在服务器内存不足时,才会使用这个命令。
  • 如果用户的配置文件中设置了save选项,则会根据save选项的配置来执行BGSAVE命令生成快照文件。
  • 当Redis通过SHUTDOWNING了接收到关闭服务器的请求或者收到标准的TERM信号时,会执行一个SAVE命令,阻塞所有客户端,并在执行完SAVE命令后关闭服务器。
  • 当一个Redis服务器连接另外一个Redis服务器时,并向对方发送SYNC命令来执行一次复制操作的时候,如果主服务器没有执行BGSAVE命令或者并非刚刚执行完毕BGSAVE命令,那么主服务器会执行BGSAVE命令来生成快照文件,并回传至从服务器。

快照文件的问题:

  • 会造成数据的丢失

1.2 AOF文件

Redis每秒同步一次AOF文件和不使用任何持久化特性时相差无几,而使用每秒同步一次AOF文件,则可以保证Redis最多会丢失1s的数据。
BGREWRITEAOF命令
这个命令会通过移除AOF文件中的冗余命令来重写AOF文件,使AOF文件的体积变得尽可能的小。

2.复制

复制可以让其他服务器拥有一个不断更新的数据副本,从而使得拥有数据副本的服务器可以用于处理客户端发送的读请求。即不再基于单点的Redis服务器形式。可以在某一台服务崩溃时,其他服务器做补偿,从而保证数据的完整性。

2.1 Redis复制的启动过程

Redis复制主动服务器交互过程

当多个从服务器连接同一个主服务器时,如果顺序靠后的从服务器请求主服务器时,主服务正在执行BGSAVE命令或已经执行完毕,那么主服务器会线性对后续的从服务继续执行一遍整个流程。

对于Redis服务器来说使用复制+AOF文件的形式可以最大限度的保证数据的完整性。

3.处理系统故障

验证快照文件和AOF文件

#验证AOF文件的正确性,给定--fix参数时,程序将对AOF文件进行修复,它会扫描AOF文件,
#寻找不正确或不完整的命令,当发现第一个出错命令的时候,程序会删除出错的命令
#以及位于出错命令之后的所有命令,只保留那些位于出错命令之前的正确命令
fulibaodeMacBook-Pro:*** fureitakara$ redis-check-aof
Usage: redis-check-aof [--fix] <file.aof>
##检查快照文件,但是无法对快照文件进行修复
fulibaodeMacBook-Pro:*** fureitakara$ redis-check-dump
-bash: redis-check-dump: command not found

4.Redis事务

  • WATCH命令:
在用户使用WATCH命令对键进行监视之后,直到用户执行EXEC命令的这段时间里面,如果由其他客户端抢先对任何被监视的键进行了替换、更新或删除等操作,那么当用户尝试执行EXEC命令时,事务将失败,并返回UNWATCH/DISCARD等命令
  • UNWATCH命令
UNWATCH命令可以在WATCH命令之后,MULTI命令执行之前对连接进行重置
  • DISCARD命令
DISCARD命令WATCH命令之后,EXEC命令执行之前对连接进行重置,清空所有入队命令

5.非事务型流水线

这种主要是由Redis具体对接语言的客户端来支持,通过将一组命令统一发送给Redis服务器而不是逐条发送,降低由于网路延迟带来的开销,从而提升系统的性能

6.Redis性能测试

使用以下命令来进行Redis性能测试

redis-benchmark
Usage: redis-benchmark [-h <host>] [-p <port>] [-c <clients>] [-n <requests>] [-k <boolean>]

 -h <hostname>      Server hostname (default 127.0.0.1)
 -p <port>          Server port (default 6379)
 -s <socket>        Server socket (overrides host and port)
 -a <password>      Password for Redis Auth
 -c <clients>       Number of parallel connections (default 50)
 -n <requests>      Total number of requests (default 100000)
 -d <size>          Data size of SET/GET value in bytes (default 3)
 --dbnum <db>       SELECT the specified db number (default 0)
 -k <boolean>       1=keep alive 0=reconnect (default 1)
 -r <keyspacelen>   Use random keys for SET/GET/INCR, random values for SADD
  Using this option the benchmark will expand the string __rand_int__
  inside an argument with a 12 digits number in the specified range
  from 0 to keyspacelen-1. The substitution changes every time a command
  is executed. Default tests use this to hit random keys in the
  specified range.
 -P <numreq>        Pipeline <numreq> requests. Default 1 (no pipeline).
 -e                 If server replies with errors, show them on stdout.
                    (no more than 1 error per second is displayed)
 -q                 Quiet. Just show query/sec values
 --csv              Output in CSV format
 -l                 Loop. Run the tests forever
 -t <tests>         Only run the comma separated list of tests. The test
                    names are the same as the ones produced as output.
 -I                 Idle mode. Just open N idle connections and wait.

Examples:

 Run the benchmark with the default configuration against 127.0.0.1:6379:
   $ redis-benchmark

 Use 20 parallel clients, for a total of 100k requests, against 192.168.1.1:
   $ redis-benchmark -h 192.168.1.1 -p 6379 -n 100000 -c 20

 Fill 127.0.0.1:6379 with about 1 million keys only using the SET test:
   $ redis-benchmark -t set -n 1000000 -r 100000000

 Benchmark 127.0.0.1:6379 for a few commands producing CSV output:
   $ redis-benchmark -t ping,set,get -n 100000 --csv

 Benchmark a specific command line:
   $ redis-benchmark -r 10000 -n 10000 eval 'return redis.call("ping")' 0

 Fill a list with 10000 random elements:
   $ redis-benchmark -r 10000 -n 10000 lpush mylist __rand_int__

 On user specified command lines __rand_int__ is replaced with a random integer
 with a range of values selected by the -r option.

7.总结

本篇文章主要总结了Redis对于持久化的一些配置,以及一些提升性能的方案。
对于集群方式下的Redis性能测试,有待于后续补充。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,287评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,346评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,277评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,132评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,147评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,106评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,019评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,862评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,301评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,521评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,682评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,405评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,996评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,651评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,803评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,674评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,563评论 2 352

推荐阅读更多精彩内容