Redis简单介绍以及原理

Redis是一种基于键值对的Nosql数据库,由于其所有的数据都存放在内存中,所以它的读写性能非常的惊人。

一、Redis的特性

  1. 速度快
    原因一:其数据在内存中存储
    原因二:采用c语言实现
    原因三:采用单线程架构,避免了多线程频繁的内存切换
  2. 基于键值对的数据结构服务器
    主要提供了五种基本的数据结构:string、list、hash、set、zset
  3. 支持丰富的功能
    提供键过期功能
    提供消息发布订阅功能
    提供了简单的事务功能
  4. 提供持久化功能
    将数据放到内存中是不安全的,一旦发生断电或者机器故障,就会出现数据丢失的情况。redis 提供了两种持久化的方式 RDB 和 AOF。
  5. 主从复制
    提供复制功能,复制功能是分布式的基础

二、redis的使用场景

  1. 缓存
  2. 排行榜系统
  3. 计数器应用
  4. 社交网络
  5. 消息队列系统
  6. 限速(手机验证码一分钟发送一次)
    redis不可以做什么:从数据的规模上来说:它不适合大规模的数据,从数据的冷热上来说:它不适合冷数据

三、Redis的持久化

redis支持ROF、AOF两种持久化机制。持久化机制能有效避免数据丢失问题。

1、RDB

RDB是将当前进程的数据的数据生成快照保存到硬盘的过程,出发RDB持久化过程分为手动触发和自动触发。

  1. 手动触发
    (1)使用save 命令:阻塞当前redis服务器,直到RDB过程完成。可能会造成长时间的阻塞,不建议线上使用。
    (2)使用bgsave命令:Redis执行fork操作,创建子进程,子进程用于持久化,完成后自动结束,阻塞只发生在fork阶段。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ErHQRu08-1574768001004)(http://10.15.0.10:8090/upload/2019/11/image-f2457d39533a4f4bb64470f89bc96e16.png)]
2. 被动触发
(1)使用save m n 相关配置,表示m秒内进行n次修改时,触发RDB操作。
(2)从节点执行全量复制操作
(3)执行debug reload 命令重新加载redis时,触发RDB
3. RDB的优缺点

  • 优点
    (1)采用rdf存储的为紧凑压缩的二进制文件,代表某个时间点上的数据快照。
    (2)Redis加载RDB恢复数据远远快于AOF的方式。
  • 缺点
    (1)不能实时的持久化数据
    (2)多个格式的RDB版本,存在不兼容的情况。
2.AOF(append only file)

以独立日志的方式记录每次写命令,重启的时候在重新执行AOF文件中的命令以达到恢复数据的目的。其解决了RDB中无法实时的持久化问题。目前是 Redis 主流的持久化方式。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-d6sPQ6xh-1574768001006)(http://10.15.0.10:8090/upload/2019/11/image-348b2eab27f9437c9c2eaa4c2f0649b5.png)]
这里需要注意:AOF写入的内容就是文本格式

  1. 数据同步策略
    (1) always : 每写一条命令就同步一次
    (2) everysec: 每秒同步一次(推荐使用)
    (3) no: 有操作系统负责,周期最长为30秒

  2. 重写机制
    随着命令不断的被写入AOF,文件会越来越大,为了解决这个问题,Redis引入重写机制用来压缩文件的体积。AOF文件重写机制就是将Redis进程中的数据转换为写命令同步到新的AOF文件中。
    这里有个疑问:为什么重写机制可以保证压缩文件体积:(1)去掉了一些没用的命令,del (2) 对某些命令进行合并,lpush num a, lpush num b , lpush num b 可以合并成lpush num a b c (3) 还可能存在超时的键,不用存在AOF文件中
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Fvg6tcXM-1574768001007)(http://10.15.0.10:8090/upload/2019/11/image-8227883f4ea14b6eb65c4bbfac68a9ee.png)]

四、Redis问题

Redis持久化功能一直是影响Redis性能的高发地。

1.fork操作

无论是RDB还是AOF,都需要进行fork操作,对于操作系统来说,fork算是一个重量级操作。虽然fork操作不需要拷贝父进程的内存空间,但是会复制空间内存页表。
解决方案:控制redis实例最大可用内存,fork操作耗时和内存量成正比。

2.AOP追加阻塞

通过下图可以看出,(1)使用everysec同步策略,最多丢失两秒的数据;(2)如果系统的fsync比较慢,则会影响Redis主进程的性能。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-U4GTEZ0T-1574768001007)(http://10.15.0.10:8090/upload/2019/11/image-fbbf2e40b3624eca99e2a9b420784ff7.png)]
解决方案:(1)不要和其他高硬盘负载的服务部署在一起,存储服务、消息队列服务
(2)使用ssd硬盘

发布了66 篇原创文章 · 获赞 26 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/Time__Lc/article/details/103263597
今日推荐