如何正确的使用Redis

  • 格式:docx
  • 大小:280.98 KB
  • 文档页数:24

如何正确地使用Redis

1. REDIS特性介绍

1.1 REDIS概述

Redis是一款依据BSD开源协议发行的高性能,使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value存储系统(cache and store),并提供多种语言的API。它起步较晚,发展迅速,目前已被许多大型机构采用。它通常被称为数据结构服务器,因为值(value)可以是

字符串(String), 哈希(hashes), 列表(list), 集合(sets) 和 有序集合(sorted sets)等类型。

1. 性能极高 – Redis能支持超过 100K 每秒的读写频率。

2. 丰富的数据类型 – Redis支持二进制案例的 Strings, Lists, Hashes, Sets及 Sorted Sets数据类型操作。

3. 原子 – Redis的所有操作都是原子性的,同时Redis还支持对几个操作全并后的原子性执行,我们能非常方便得实现事务。

4. Redis支持 publish/subscribe, 通知, key 过期等重要特性。

5. Redis内存中的数据支持实时持久化,非常安全。

6. 新版本Redis支持集群。

Redis在最近发布了3.0.6稳定版,我把最新的3.0.6稳定版的配置翻译了一遍,获益匪浅,基本上对这个版本的Redis的很多细节清晰了很多,下面针对一些重要配置介绍下Redis的相关特性。

1.2 REDIS配置

花了三天时间,把REDIS 3.0.6英文版大部分都翻译过来了,地址:

/?/article/19

1.3 内存快照

某个时间点Redis服务器内存中的内容我们称之为快照,Redis会自动快照保存到磁盘,调用BGSAVE能手动触发快照保存,保存快照的动作是后台进程完成的,保存快照期间其他客户端仍然和可以读写REDIS服务器。后台保存快照到磁盘会占用大量内存。

如果调用SAVE命令保存内存中的数据到磁盘,将阻塞客户端请求,直到保存完毕。

调用SHUTDOWN命令,Redis服务器会先调用SAVE,所有数据持久化到磁盘之后才会真正退出。

在Redis的配置文件中可以配置内存数据持久化的触发条件 # save

# 两个条件同时满足,发生一次落地本地磁盘动作,下面三个配置是或的关系

# 如果不想落地内存中的数据,直接注释掉下面三个配置即可

# 如果配置成save "",之前落地的数据都可能被删除

save 900 1

save 300 10

save 60 10000

1.4 主从同步

用slaveof的配置来设置本机的Redis作为从实例,实时从主实例读取数据,成为其镜像。主要是高可用场景需要本功能。以下是Redis主从同步的一些特性:

1. 同一个Master可以同步多个Slaves;

2. Slave同样可以接受其它Slaves的连接和同步请求,这样可以有效的分载Master的同步压力。因此我们可以将Redis的Replication架构视为图结构;

3. Master Server是以非阻塞的方式为Slaves提供服务。所以在Master-Slave同步期间,客户端仍然可以提交查询或修改请求;

4. Slave Server同样是以非阻塞的方式完成数据同步。在同步期间,如果有客户端提交查询请求,Redis则返回同步之前的数据;

5. 为了分载Master的读操作压力,Slave服务器可以为客户端提供只读操作的服务,写服务仍然必须由Master来完成。即便如此,系统的伸缩性还是得到了很大的提高;

6. Master可以将数据快照保存操作交给Slaves完成,从而避免了在Master中要有独立的进程来完成此操作,减轻Master的压力;

7. Redis的数据同步是异步进行的,你可以配置主实例在和从实例断掉连接的时候停止接受客户端发过来的写请求,从而保证数据的一致性。

8. 同步是自动完成的,不需要人工干预。主从之间的网络短暂的断开后,从再次连上主之后,会自动从上次断开的时候同步数据。

9. 当新的从实例连入主实例,或者从实例断开连接时间比较长,再连入主实例的时候,为了保证数据一致,主实例会将全量数据同步给从实例。这种主要有两种模式:

文件模式:主实例创建一个任务去写DB文件到磁盘,文件创建完毕后,主实例增量方式读取文件中的数据传输给从实例;使用Disk-backed模式同步数据有个好处就是,这个文件一旦生成,多个slave实例过来全量同步,都可以重用这一个文件;

网络模式:主实例创建一个任务把全量数据直接写入从实例的socket连接上,数据不落地。;使用Diskless模式同步全量数据,一旦一个全量同步行为开始了,其他slave实例的同步请求过来时,只能先排到队列里面去等下一次全量同步开始。 使用diskless的数据同步时,master实例会等一会(时间可配),看看这段时间内是否有多个slave实例同时请求全量同步,好凑齐了一块给所有实例传输数据。

在网络带宽充裕的情况下,diskless的同步避免了磁盘io,性能会好很多。

10. Redis提供一个叫Redis Sentinel的监控程序做主从监控和主从切换工作。他主要有以下功能:

监控(Monitoring): Redis Sentinel实时监控主服务器和从服务器运行状态。

提醒(Notification):当被监控的某个 Redis 服务器出现问题时, Redis Sentinel 可以向系统管理员发送通知, 也可以通过 API 向其他程序发送通知。

自动故障转移(Automatic failover): 当一个主服务器不能正常工作时,Redis Sentinel 可以将一个从服务器升级为主服务器, 并对其他从服务器进行配置,让它们使用新的主服务器。当应用程序连接到 Redis 服务器时, Redis Sentinel会告之新的主服务器地址和端口。

Redis Sentinel 是一个分布式系统, 你可以在架构中运行多个 Sentinel 进程,这些进程通过相互通讯来判断一个主服务器是否断线,以及是否应该执行故障转移。

在配置Redis Sentinel时,至少需要有1个Master和1个Slave。当Master失效后,Redis

Sentinel会报出失效警告,并通过自动故障转移将Slave提升为Master,并提供读写服务;当失效的Master恢复后,Redis

Sentinel会自动识别,将Master自动转换为Slave并完成数据同步。

1.5 安全

Redis可以在配置内设置访问密码,如果设置,那么在运行任何命令前,必须先输入密码。如果你的内网环境有不信任的主机在运行,那么你需要设置这个密码。如果你的内网是安全的,那么不建议设置本密码。

Redis允许客户端每秒尝试15万次密码匹配,如果你密码不够强,很容易被破解。

Redis还有一招挺绝的,就是修改高级别的命令的指令名。比如把CONFIG修改成b840fc02d524045429941cc15f59e41cb7be6c52,基本上就可以避免外部人员调用本命令了。

Redis也可以屏蔽一些命令名,使用rename-command命令将命令的指令名设置为空字符串即可。

需要注意的是,这些对命令名的修改也会同步到AOF文件中,或者传输给从实例中,引起其他问题。

1.6 内存限制及LRU自动清理KEY

Redis可以使用maxmemory来配置内存的使用上限,一旦Redis使用的内存达到设置的上限,那么会出现两种情况:

1. 按照LRU算法自动清理过期Key来释放内存;

2. 拒绝所有客户端发上来的写请求; Redis有个配置叫maxmemory-policy,这个配置决定了Redis内存触限后的处理策略:

1. volatile-lru :根据LRU算法删除过期Key

2. allkeys-lru :根据LRU算法删除所有Key

3. volatile-random :随机删除过期数据

4. allkeys-random :随机删除任意数据

5. volatile-ttl :根据最近过期时间来删除(辅以TTL)

6. noeviction:不删除任何数据,拒绝客户端写请求

如果Reids在当前策略下找不到可以删除的key,那么Redis会拒绝所有客户端的写请求。

写请求的命令包括:

set setnx setex append incr decr rpush lpush rpushx lpushx linsert lset rpoplpush sadd sinter sinterstore

sunion sunionstore sdiff sdiffstore zadd zincrby zunionstore zinterstore hset hsetnx hmset hincrby incrby

decrby getset mset msetnx exec sort

本配置项默认值为 :

maxmemory-policy noeviction

1.7 AOF模式持久化

1.7.1 AOF持久化细节

默认情况下Redis会异步落地内存快照数据到磁盘,这种模式对于很多场景是够用的。但这种模式有个缺点就是对于突发情况,比如突然停电,落地的文件数据会丢失几分钟数据,极端情况丢数据这事对于普通应用程序可能可以接收,但对于类似银行这种机构是苟能容忍的。因此Redis提供一种更可靠的模式来保证数据的安全,AOF是一种可选的更安全的持久化模式,能很好地解决上面说的数据丢失的问题。默认配置下,AOF模式在意外故障发生时最多丢失一秒钟的数据。

AOF和内存快照两种持久化模式能同时启动,不会互相影响。如果AOF模式生效了,那么Redis启动的时候会首先载入AOF文件来保证数据的可靠性。

AOF文件是可识别的纯文本,它的内容就是一个个的Redis标准命令,有比较好的可读性。

AOF日志也不是完全按客户端的请求来生成日志的,比如命令 INCRBYFLOAT 在记AOF日志时就被记成一条SET记录, 因为浮点数操作可能在不同的系统上会不同,所以为了避免同一份日志在不同的系统上生成不同的数据集,所以这里只将操作后的结果通过SET来记录。

每一条写命令都生成一条日志,所以AOF文件会很大。

Redis在落地AOF文件的时候,有三种模式

1. appendfsync always : 每次有客户端发送写操作,都需要落地到磁盘,性能最差,但最安全。

2. appendfsync everysec : 顾名思义,每秒写一次,均衡模式。