Redis

Redis 是一个开源的,高性能的 key-value 系统,可以用来缓存或存储数据。Redis 数据可以持久化,并且支持多种数据类型:字符串(string),列表(list),哈希(hash),集合(set)和有序集合(sorted set)。能够对关系型数据库起到很好的补充作用。它还提供了多接口多种客户端 Python,Ruby,Erlang,PHP ,可以方便调用。

持久化:Redis 是一种内存数据库(跟 memcache 类似),在数据存取效率方面很优秀,由于内存中的数据时刻面临丢失的危险,Redis 提供了两种持久化机制,及时将内存中的数据写入磁盘。

    RDB  利用存储快照的方式把内存数据定期写入磁盘,半持久化

AOF  利用写日志的方式(类似 mysql 的 binlog),每执行一条更改 Redis 数据的命令,就写入到磁盘的一个 aof 文件中

Redis 默认开启 RDB 模式,关闭 AOF 模式,因为 AOF 更耗资源,但是对数据安全极高,称为全持久化,按需选择哪种模式。

 

一、安装 redis

[root@localhost src]#wget

[root@localhost redis-3.0.3]#make

[root@localhost redis-3.0.3]#make install

 

二、redis制定到目录

[root@localhost redis-3.0.3]# mkdir/usr/local/redis

[root@localhost redis-3.0.3]# cd/usr/local/redis

[root@localhost redis]# cp../src/redis-3.0.3/redis.conf  .

[root@localhost redis]# cp../src/redis-3.0.3/src/redis-cli  .

[root@localhost redis]# cp../src/redis-3.0.3/src/redis-server  .

[root@localhost redis]# cp../src/redis-3.0.3/src/redis-sentinel  .

[root@localhost redis]# cp../src/redis-3.0.3/src/redis-benchmark  .

[root@localhost redis]# cp../src/redis-3.0.3/src/redis-check-aof  .

[root@localhost redis]# cp../src/redis-3.0.3/src/redis-check-dump .

 

说明:

    # redis.conf       主配置文件

    # redis-cli       命令行操作工具

    # redis-server     启动程序

    # redis-sentinel   集群管理工具

    # redis-benchmark  性能测试工具,测试 redis 在当前系统配置下的读写性能

    # redis-check-aof  更新日志检查,--fix 可以修复 log 文件

    # redis-check-dump 检查本地数据文件

 

三、主文件配置(redis.conf)

 

[root@localhost redis]# mv redis.confredis.conf.bak

 

[root@localhost redis]# vim redis.conf

 

daemonize yes    # 以守护进程方式启动

 

pidfile /var/run/redis.pid  # 定义 PID 文件存放路径

 

port 6379         # 默认监听端口

 

timeout 300       # 请求超时时间

 

loglevel debug    # 定义日志级别

 

logfile/usr/local/redis/logs/redis.log    # 定义日志文件路径

 

databases 16    # 启动数据库实例数,默认连接的数据库为 0 ,可以通过 select N 来连接不同的数据库

 

save 900 1

save 300 10

save 60 10000

 

# 从内存保存数据到磁盘的策略

# 当有 1 条 keys 数据改变时,900 秒刷新到磁盘一次

# 当有 10 条 keys 数据改变时,300 秒刷新到磁盘一次

# 当有 1W 条 keys 数据改变时,60 秒刷新到磁盘一次

 

rdbcompression yes     # dump .rdb 数据库时,是否压缩数据对象

 

dbfilename dump.rdb    # dump 数据库时,数据库保存的文件名

 

dir /usr/local/redis/data/    # dump 时数据库保存路径

 

#-----------------------------------------------------------------------------------------------------

 

appendonly no    # 是否开启日志功能,如果开启每次操作都会记录一条日志,相当于 mysql 的 binlog ,但是会影响效率

 

#appendfilename appendonly.aof    # AOF 文件的默认文件名

 

#appendfsync everysec

 

# 同步数据到磁盘的规则,

# no 不主动写入磁盘,依赖与系统的写入,一般 30 秒左右写入一次,性能最好,但是持久化没有保证。

# everysec 每秒强制写入磁盘一次,在性能跟持久化方面折中,推荐使用。

# always 每次收到写操作就立即强制写入磁盘,是最有保证的完全持久化,但是速度慢。

 

#no-appendfsync-on-rewrite yes      # 在日志重写时,不进行命令追加操作,而只是将其放在缓冲区里,避免与命令的追加造成磁盘 IO 上的冲突

 

#auto-aof-rewrite-percentage 100    # 当前 AOF 文件的大小是上次日志重写得到的 AOF 文件大小的两倍时,自动启动新的日志重写过程

 

#auto-aof-rewrite-min-size 64mb     # 当前 AOF 文件启动新的日志重写过程的最小值,避免刚启动 redis 时由于文件较小导致频繁重写

 

#-----------------------------------------------------------------------------------------------------

 

# 设置在向客户端应答时,是否把较小的包合并为一个包发送

 

 

四、启动redis

 

[root@localhost~]# echo "vm.overcommit_memory = 1" >> /etc/sysctl.conf

 

[root@localhost~]# sysctl vm.overcommit_memory=1

 

# 调整内核参数,如果不调整 redis 会报一个警告信息

 

[root@localhost~]# mkdir /usr/local/redis/data    # 创建 data 目录

 

[root@localhost~]# mkdir /usr/local/redis/logs    # 创建 logs 目录

 

[root@localhost~]# redis-server /usr/local/redis/redis.conf   # 启动 redis ,需要指定配置文件路径

 

[root@localhost~]# netstat -anpt | grep redis

tcp0 0 0.0.0.0:6379 0.0.0.0:* LISTEN 1176/redis-server

 

五、正常测试 Redis

 

[root@localhostredis]# redis-cli

127.0.0.1:6379>set jiang 123

OK

127.0.0.1:6379>get jiang

"123"

 

# 登陆本机的 redis , 写入 keys/value , 读取 keys

 

[root@localhostredis]# ll /usr/local/redis/data/

total0

 

# 没有生成 dump.rdb ,因为半持久化的 save 规则没有触发

 

[root@localhost~]# redis-cli shutdown  #当关闭 redis 的时候,会将内存中的数据保存为 dump.rdb

 

[root@localhostredis]# ll /usr/local/redis/data/

total4

-rw-r--r--.1 root root 29 Jul 31 03:20 dump.rdb

 

[root@localhost~]# redis-server /usr/local/redis/redis.conf

[root@localhost~]# redis-cli

redis127.0.0.1:6379> get jiang

"123"

redis127.0.0.1:6379> quit

 

#redis 启动后从 dump.rdb 文件中读取数据,所以数据依然存在

 

六、故障测试redis

 

 

[root@localhost~]# rm -rf /usr/local/redis/data/*    # 删除数据文件,重新测试

点击(此处)折叠或打开

[root@localhost~]# redis-cli

redis127.0.0.1:6379> set jiang abcdef

OK

redis127.0.0.1:6379> get jiang

"abcdef"

redis127.0.0.1:6379> quit

 

[root@localhost~]# kill -9 `cat /var/run/redis.pid `

 

# 当不是正常关闭 redis 时,如 kill -9 、redis 服务器突然宕机等

 

[root@localhost~]# ls /usr/local/redis/data/

 

# 是不会将内存中的数据同步到磁盘的,也就是说不会生成 dump.rdb 文件

 

[root@localhost~]# redis-server /usr/local/redis/redis.conf

 

[root@localhost~]# redis-cli

redis127.0.0.1:6379> get jiang

(nil)

redis127.0.0.1:6379> quit

 

# 这时启动 redis ,发现数据丢失了。可通过启动AOF全持久化解决,但是影响性能。

 

 

redis AOF持久化,将每次接收到更改 redis 数据的操作都记录到一个 aof 文件,当服务器意外宕机或 redis 服务器非法关闭时,不会丢失数据。可以做到数据安全化,但是性能会受到影响。

 

一、主要是修改 redis.conf

 

修改部分:

 

#save900 1

#save300 10

#save60 10000

#rdbcompressionyes

#dbfilenamedump.rdb

 

# 关闭 RDB 持久化

 

appendonlyyes

appendfilenameappendonly.aof

appendfsynceverysec

 

# 开启 AOF 持久化,定义 aof 文件名,定义同步磁盘规则为每秒强制同步

 

no-appendfsync-on-rewriteyes

auto-aof-rewrite-percentage100

auto-aof-rewrite-min-size64mb

 

# 由于 AOF 的特性是记录每次操作,当客户端执行相同的操作时,aof 也会记录这些相同的每次操作,那么 aof 文件会不断增加。对于这个问题,可以使用 aof 文件的重写功能解决 aof 文件的增长。当 aof 文件满足一定条件时就对 aof 进行重写,重写是根据当前内存数据库中的数据进行遍历到一个临时的 aof 文件,写完后替换原来的 aof 文件。

 

说明:

#no-appendfsync-on-rewrite    参数表示在重写期间对新接收到的写操作不同步,暂时存在内存中,等重写完后再写入,防止与磁盘 IO 冲突。

#auto-aof-rewrite-percentage  参数表示 aof 文件增长率大于这个值并且同时 aof 文件大于下面参数值时,触发 aof rewrite

#auto-aof-rewrite-min-size    参数表示当前 aof 文件大小大于这个值时

 

 

2、测试 Redis AOF 持久化

[root@localhostredis]# redis-server /usr/local/redis/redis.conf

 

[root@localhostredis]# ls /usr/local/redis/data/

Appendonly.aof             # 生成一个 .aof 的空文件

 

[root@localhostredis]# redis-cli   #设置key-value值

127.0.0.1:6379>set test1 123

OK

127.0.0.1:6379>set test2 456

OK

127.0.0.1:6379>set test3 789

OK

127.0.0.1:6379>quit

 

#查看appendonly.aof的记录情况

[root@localhostredis]# cat data/appendonly.aof

*2

$6

SELECT

$1

0

*3

$3

set

$5

test1

$3

123

*3

$3

set

$5

test2

$3

456

*3

$3

set

$5

test3

$3

789

# 记录了每一次操作

 

[root@localhostredis]# kill -9 `cat /var/run/redis.pid` 

# 像测试 RDB 一样,非法关闭 redis

 

[root@localhostredis]# ./redis-server /usr/local/redis/redis.conf

[root@localhostredis]# redis-cli

127.0.0.1:6379>get test1

"123"

127.0.0.1:6379>get test2

"456"

127.0.0.1:6379>get test3

"789"

# 启动测试 keys/value 都存在。

# 建议使用 AOF 持久化的同时也使用 RDB 半持久化,AOF 的优先级是高于 RDB 的,也就是说启动服务时是先加载 AOF ,后加载 RDB 的。

# 当 Redis 服务器磁盘坏掉时,数据如何保证不丢失? Master / slave 的方式解决!