- Redis是C语言开发的一个开源的高性能键值对(key-value)的内存数据库,与传统数据库不一样的是,Redis是非关系型数据库,数据是存储在内存中,读写性能很是高,因此Redis经常做为缓存在系统中存在。
- Redis还能够用来作分布式锁。
- Redis提供了多种数据类型来支持不一样的业务场景。
- Redis支持事务、持久化、多种集群方案
若是碰到须要执行耗时特别久,且结果不频繁变更的 SQL,就特别适合将运行结果放入缓存。这样,后面的请求就去缓存中读取,使得请求可以迅速响应 。redis
在大并发的状况下,全部的请求直接访问数据库,数据库会出现链接异常。这个时候,就须要使用 Redis作一个缓冲操做,用缓存预热将一部分数据提早 加载到Redis中,让请求先访问到 Redis,而不是直接访问数据库算法
String
String类型就是简单的key-value类型,value能够是String,也能够是数字,。主要用来简单的key-value缓存,好比存储用户的粉丝数之类的;数据库
hash
hash是一个field和value的映射表,适合用于存储对象,好比存储用户基本信息,咱们要修改用户的姓名的时候,就能够直接修改具体的字段;设计模式
List
Redis list就是链表,在项目中应用的也比较多,好比微博的关注列表,粉丝列表等;Redis list能够经过 lrange 命令,就是从某个元素开始读取多少个元素,能够基于 list 实现分页查询,这个很棒的一个功能,基于 redis 实现简单的高性能分页,能够作相似微博那种下拉不断分页的东西(一页一页的往下走),性能高。缓存
Set
set和list相似,也是一个列表功能,可是set是能够自动去重的,set提供了判断成员是否在一个set集合内的重要接口;基于set能够很好的实现交集、并集、差集等。
好比:在微博应用中,能够将一个用户全部的关注人存在一个集合中,将其全部粉丝存在一个集合。Redis能够很是方便的实现如共同关注、共同粉丝、共同喜爱等功能。服务器
Sorted Set
和set相比,sorted set增长了一个权重参数score,使得集合中的元素可以按score进行有序排列
举例: 在直播系统中,实时排行信息包含直播间在线用户列表,各类礼物排行榜,弹幕消息(能够理解为按消息维度的消息排行榜)等信息,适合使用 Redis 中的 Sorted Set 结构进行存储。网络
反应器设计模式(Reactor pattern) 是一种为处理并发服务请求,并将请求提交到一个或者多个服务处理程序的事件设计模式。 当客户端请求抵达后,服务处理程序使用多路分配策略,由一个非阻塞的线程来接收全部的请求,而后派发这些请求至相关的工做线程进行处理。 简单说,就是如何处理多个客户端的并发请求的解决模式。多线程
咱们都知道Redis是单线程模型,从内部结构来看,之因此Redis是单线程的,是由于Redis基于Reactor模式开发了本身的网络事件处理器,这个处理器被称为文件事件处理器,而这个文件事件处理器是单线程的,因此Redis才是单线程模型。文件事件处理器主要包含IO多路复用程序、socket队列、文件事件分派器、事件处理器。如图架构
咱们都知道Redis是基于内存来存储的,因此咱们在设置key的时候须要去设置key的过时时间,经过这个过时时间咱们能够指定这个key在内存中的存活时长,那么Redis是怎么来删除这些过时的key的呢?并发
按期删除+惰性删除:
可是这样就有一个问题,若是按期删除没有删除,而后程序也没有主动去查询,那么会致使在内存中存在大量的过时key,进而会致使redis的内存耗尽,因此Redis提供了内存淘汰机制。
Redis提供了六种淘汰机制
MySQL里有2000w数据,Redis中只存20w的数据,如何保证Redis中的数据都是热点数据?
经过内存淘汰机制咱们能够淘汰冷数据,将热数据加载到内存中;计算一下20W数据须要的内存,而后设置Redis的内存限制就行
Redis的持久化方式有两种:
把全部的对Redis的服务器进行修改的命令都存到一个文件里,命令的集合。
Redis4.0支持同时开启 RDB 和 AOF,系统重启后,Redis 会优先使用 AOF 来恢复数据,这样丢失的数据会最少。
单个节点redis,通常生产环境中不会使用
经过持久化功能,Redis保证了即便在服务器重启的状况下也不会损失(或少许损失)数据,由于持久化会把内存中数据保存到硬盘上,重启会从硬盘上加载数据。 。可是因为数据是存储在一台服务器上的,若是这台服务器出现硬盘故障等问题,也会致使数据丢失。为了不单点故障,一般的作法是将数据库复制多个副本以部署在不一样的服务器上,这样即便有一台服务器出现故障,其余服务器依然能够继续提供服务。为此, Redis 提供了复制(replication)功能,能够实现当一台数据库中的数据更新后,自动将更新的数据同步到其余数据库上。
在复制的概念中,数据库分为两类,一类是主数据库(master),另外一类是从数据库(slave)。主数据库能够进行读写操做,当写操做致使数据变化时会自动将数据同步给从数据库。而从数据库通常是只读的,并接受主数据库同步过来的数据。一个主数据库能够拥有多个从数据库,而一个从数据库只能拥有一个主数据库。
redis的普通主从模式,能较好地避免单独故障问题,以及提出了读写分离,下降了Master节点的压力。互联网上大多数的对redis读写分离的教程,都是基于这一模式或架构下进行的。但实际上这一架构并不是是目前最好的redis高可用架构。
当主数据库遇到异常中断服务后,开发者能够经过手动的方式选择一个从数据库来升格为主数据库,以使得系统可以继续提供服务。然而整个过程相对麻烦且须要人工介入,难以实现自动化。 为此,Redis 2.8开始提供了哨兵工具来实现自动化的系统监控和故障恢复功能。 哨兵的做用就是监控redis主、从数据库是否正常运行,主出现故障自动将从数据库转换为主数据库。
顾名思义,哨兵的做用就是监控Redis系统的运行情况。它的功能包括如下两个。
(1)监控主数据库和从数据库是否正常运行。
(2)主数据库出现故障时自动将从数据库转换为主数据库。
即便使用哨兵,redis每一个实例也是全量存储,每一个redis存储的内容都是完整的数据,浪费内存且有木桶效应。为了最大化利用内存,能够采用cluster群集,就是分布式存储。即每台redis存储不一样的内容。 采用redis-cluster架构正是知足这种分布式存储要求的集群的一种体现。redis-cluster架构中,被设计成共有16384个hash slot。每一个master分得一部分slot,其算法为:hash_slot = crc16(key) mod 16384 ,这就找到对应slot。采用hash slot的算法,其实是解决了redis-cluster架构下,有多个master节点的时候,数据如何分布到这些节点上去。
Redis线程模型
Redis持久化RDB和AOF
redis架构演变与redis-cluster群集读写方案
一文看懂Redis的持久化原理
简明的图解Redis RDB持久化、AOF持久化