redis安全及必备知识

一.redis安全

为redis设置密码命令行的模式(重启后失效): 
查看密码:

CONFIG GET requirepass

密码认证:

AUTH password

设置密码:

CONFIG SET requirepass "password"

127.0.0.1:6379> CONFIG GET requirepass
1) "requirepass"
2) ""
127.0.0.1:6379> CONFIG SET requirepass "abc123"
OK
127.0.0.1:6379> CONFIG GET requirepass
(error) NOAUTH Authentication required.
127.0.0.1:6379> AUTH "abc123"
OK
127.0.0.1:6379> CONFIG GET requirepass
1) "requirepass"
2) "abc123"

在redis配置文件中设置密码,在requirepass后面直接加密码即可:

requirepass abc123456

在配置文件中指定不能使用的命令:

rename-command FLUSHALL ""
rename-command FLUSHDB ""
rename-command SHUTDOWN ""
rename-command KEYS ""
rename-command MONITOR ""

二.redis性能测试

所谓性能测试就是在大并发下看redis的响应速度。可以通过redis-benchmark这个redis自带的测试命令来测试。

# redis-benchmark -n 100000 -q
PING_INLINE: 62111.80 requests per second
PING_BULK: 50100.20 requests per second
SET: 68823.12 requests per second
GET: 69348.12 requests per second
INCR: 69979.01 requests per second
LPUSH: 67842.61 requests per second
RPUSH: 68965.52 requests per second
LPOP: 69589.42 requests per second
RPOP: 66889.63 requests per second
SADD: 65061.81 requests per second
HSET: 52938.06 requests per second
SPOP: 56401.58 requests per second
LPUSH (needed to benchmark LRANGE): 45167.12 requests per second
LRANGE_100 (first 100 elements): 63451.78 requests per second
LRANGE_300 (first 300 elements): 47938.64 requests per second
LRANGE_500 (first 450 elements): 67796.61 requests per second
LRANGE_600 (first 600 elements): 68352.70 requests per second
MSET (10 keys): 63131.31 requests per second
-h 指定主机名
-p 指定端口
-c 指定并发数
-n 指定请求数
-q 强制退出 redis。仅显示 query/sec 值
-l 生产循环,永久执行测试

三. 持久化机制

redis是一个支持持久化的内存数据库,也就是redis需要经常将内存中的数据库同步到硬盘来保证持久化。 
redis支持两种持久化方式:

RDB(snapshotting快照的方式(默认)) 
AOF(append-only file)的方式

RDB方式: 
RDB是默认的持久化方式,这种方式是将内存中的数据以快照的方式写入二进制文件中(dump.rdb)。 
配置方式:

save 900 1 #900秒内如果超过1个key被修改,则发起快照保存 
save 300 10 #300秒内如果超过10个key被修改,则发起快照保存 
save 60 10000 #60秒内如果超过10000个key被修改,则发起快照保存

aof方式: 
快照是按照一定时间间隔或者规则来进行的,但是如果redis意外down掉,就会丢失最后一次快照的修改的数据。aof的方式具有更好的持久化性能。在使用aof时,redis会将每个收到的写命令都通过write函数追加到文件中,当redis重启时会通过重新执行文件中保存的写命令来内存中重建整个数据库的内容。当然由于os会在内核中缓存write做的修改,所以可能不是立即写入磁盘上,这样aof方式的持久化也还是有可能会丢失部分修改。可以通过配置文件告诉redis我们想要通过fsync函数强制os写入到磁盘的时机。 
配置方式:

appendonly yes  # 启动aof持久化方式
appendfilename "appendonly.aof"  #指定aof文件名称
# appendfsync always  # 收到写命令就立即写入磁盘最慢,但是保证完全的持久化
appendfsync everysec  # 每秒钟写入磁盘一次,在性能和持久化方面做了很好的折中处理
# appendfsync no  # 完全依赖os,性能最好持久化没保证

四. redis事务

redis事务可以一次执行多个命令。 
一个事务从开始到执行会经历以下三个阶段:

  • 开始事务(MULTI)

  • 命令入队

  • 执行事务(EXEC)

    127.0.0.1:6379> MULTI
    OK
    127.0.0.1:6379> SET name "jack"
    QUEUED
    127.0.0.1:6379> GET name
    QUEUED
    127.0.0.1:6379> SADD tag "C++" "python" "java" "c#"
    QUEUED
    127.0.0.1:6379> SMEMBERS tag 
    QUEUED
    127.0.0.1:6379> EXEC
    1) OK
    2) "jack"
    3) (integer) 4
    4) 1) "java"
       2) "C++"
       3) "c#"
       4) "python"
DISCARD 取消事务,放弃执行事务内的所有命令
EXEC 执行所有事务块的命令
MULTI 标记一个事务块的开始
UNWATCH 取消WACTCH命令对所有key的监控
WATCH key [key ...] 监视一个(或多个) key ,如果在事务执行之前这个(或这些) key 被其他命令所改动,那么事务将被打断。