Redis 基本介绍及性能分析

Redis 基本介绍及性能分析

什么是 Redis?

1、简介

REmote DIctionary Server(Redis) 是一个由Salvatore Sanfilippo写的key-value存储系统。

Redis是一个开源的使用ANSI C语言编写、遵守BSD协议、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。

Redis 与其他 key - value 缓存产品有以下三个特点:

  • Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。
  • Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储。
  • Redis支持数据的备份,即master-slave模式的数据备份。

为什么选用 Redis?

要想知道为什么现在很多厂商都选择 Redis 作为自己产品的缓存和中间件,就得知道 Redis 相较于其他的竞品的优势和劣势。

  • 是否需要复杂的数据结构?若是选择使用 Redis 作为存储,否则 Redis和 MC 都可以考虑。若是简单的 get/post 请求,且需要较高的性能需求,可以是使用 MC 代替 Redis
  • 是否需要进行数据的持久化存储,不允许数据丢失?若是选择使用 Redis 作为存储,并且在申请服务的时候注明需要作为存储而非缓存,需要开启持久化存储并对数据进行定期备份
  • 是否需要 Master/Slave 机制保证服务的高可用?若是选择 Redis作为存储,平台会默认为所有的 Redis 服务部署 Slave 从库

1、Memcache优势

  • Memcache 可以利用多核优势,单实例吞吐量极高,可以达到几十万的 QPS(每秒查询数),适用于最大程度康数据量
  • 支持直接配置 session handler
  • 坑少

2、Memcache劣势

  • 只支持简单的字符串类型数据
  • 无法进行持久化,数据不能备份,只能作为缓存使用,一旦重启数据全部丢失
  • 无法进行数据同步,不能将 MC 实例的数据迁移到另一个 MC 实例
  • Memcached内存分配采用Slab Allocation机制管理内存,value大小分布差异较大时会造成内存利用率降低,并引发低利用率时依然出现踢出等问题。需要用户注重value设计

3、Redis优势

  • 性能极高 – Redis能读的速度是110000次/s,写的速度是81000次/s 。
  • 丰富的数据类型 – Redis支持二进制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 数据类型操作。
  • 原子 – Redis的所有操作都是原子性的,意思就是要么成功执行要么失败完全不执行。单个操作是原子性的。多个操作也支持事务,即原子性,通过MULTI和EXEC指令包起来。
  • 丰富的特性 – Redis还支持 publish/subscribe, 通知, key 过期等等特性。
  • 支持数据持久化,包括 RDB(Redis DataBase)和 AOF(append only file)两种方式,生产环境可以两种方式结合使用
  • 支持 Master/Slave机制,最大程度保证服务的高可用,并且可以实时进行数据的同步复制
  • 支持集群
  • 单线程请求,命令串行化,请求不用考虑加锁释放锁造成的性能消耗
  • 支持 pub/sub 订阅发布机制,可以用来做消息订阅和通知

4、Redis 劣势

  • Redis 是单线程,性能受限于内存,同时无法最大程度发挥多核 CPU 的性能,单实例 CPU 最高可以达到 5-6 W 的 QPS
  • Redis 在 string 类型上会消耗较多的内存,可以使用 dict压缩存储以降低内存耗用

5、与其他 key-value 存储的区别

  • Redis有着更为复杂的数据结构并且提供对他们的原子性操作,这是一个不同于其他数据库的进化路径。Redis的数据类型都是基于基本数据结构的同时对程序员透明,无需进行额外的抽象。
  • Redis运行在内存中但是可以持久化到磁盘,所以在对不同数据集进行高速读写时需要权衡内存,因为数据量不能大于硬件内存。在内存数据库方面的另一个优点是,相比在磁盘上相同的复杂的数据结构,在内存中操作起来非常简单,这样Redis可以做很多内部复杂性很强的事情。同时,在磁盘格式方面他们是紧凑的以追加的方式产生的,因为他们并不需要进行随机访问

Redis 为什么快?

  • Redis 是单线程,不需要进行各种上下文切换,加锁释放锁的操作,也避免了出现死锁的现象从而造成的性能消耗
  • Redis 重新设计了自己的数据类型 SDS(simple dynamic string),在最底层有自己的编码方式,可以根据数据的长度和类型去自动分析选取最适合的数据类型
  • Redis 是纯内存操作,就一个字快
  • Redis可以 I/O多路复用

Redis 配置文件详解

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
# redis进程是否以守护进程的方式运行,yes为是,no为否(不以守护进程的方式运行会占用一个终端)。
daemonize no
# 指定redis进程的PID文件存放位置
pidfile /var/run/redis.pid
# redis进程的端口号
port 6379
# 绑定的主机地址
bind 127.0.0.1
# 客户端闲置多长时间后关闭连接,默认此参数为0即关闭此功能
timeout 300
# redis日志级别,可用的级别有debug.verbose.notice.warning
loglevel verbose
# log文件输出位置,如果进程以守护进程的方式运行,此处又将输出文件设置为stdout的话,就会将日志信息输出到/dev/null里面去了
logfile stdout
# 设置数据库的数量,默认为0可以使用select <dbid>命令在连接上指定数据库id
databases 16
# 指定在多少时间内刷新次数达到多少的时候会将数据同步到数据文件
save <seconds> <changes>
# 指定存储至本地数据库时是否压缩文件,默认为yes即启用存储
rdbcompression yes
# 指定本地数据库文件名
dbfilename dump.db
# 指定本地数据问就按存放位置
dir ./
# 指定当本机为slave服务时,设置master服务的IP地址及端口,在redis启动的时候他会自动跟master进行数据同步
slaveof <masterip> <masterport>
# 当master设置了密码保护时,slave服务连接master的密码
masterauth <master-password>
# 设置redis连接密码,如果配置了连接密码,客户端在连接redis是需要通过AUTH<password>命令提供密码,默认关闭
requirepass footbared
# 设置同一时间最大客户连接数,默认无限制。redis可以同时连接的客户端数为redis程序可以打开的最大文件描述符,如果设置 maxclients 0,表示不作限制。当客户端连接数到达限制时,Redis会关闭新的连接并向客户端返回 max number of clients reached 错误信息
maxclients 128
# 指定Redis最大内存限制,Redis在启动时会把数据加载到内存中,达到最大内存后,Redis会先尝试清除已到期或即将到期的Key。当此方法处理后,仍然到达最大内存设置,将无法再进行写入操作,但仍然可以进行读取操作。Redis新的vm机制,会把Key存放内存,Value会存放在swap区
maxmemory<bytes>
# 指定是否在每次更新操作后进行日志记录,Redis在默认情况下是异步的把数据写入磁盘,如果不开启,可能会在断电时导致一段时间内的数据丢失。因为redis本身同步数据文件是按上面save条件来同步的,所以有的数据会在一段时间内只存在于内存中。默认为no。
appendonly no
# 指定跟新日志文件名默认为appendonly.aof
appendfilename appendonly.aof
# 指定更新日志的条件,有三个可选参数 - no:表示等操作系统进行数据缓存同步到磁盘(快),always:表示每次更新操作后手动调用fsync()将数据写到磁盘(慢,安全), everysec:表示每秒同步一次(折衷,默认值);
appendfsync everysec

本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!