Redis


概述

Redis是一个高性能的非关系型(NoSQL)内存key-value数据库,可以存储键和五种不同类型的值之间的映射。键的类型只能为字符串,值支持五种数据类型:字符串、散列表、列表、集合、有序集合。
Redis支持很多特性,例如可以将内存中的数据持久化到磁盘中,支持数据的备份。

在这里插入图片描述
上图中,hello为key,world为value,值是字符串类型。

数据类型

Redis支持五种数据类型:字符串(string)、列表(list)、散列表(hash)、集合(set)、有序集合(zset)。

  • 字符串:二进制安全的,可以包含任何数据,比如图片或者序列化对象,最大能存储512M。
  • 列表:可以添加元素到列表的头部或者尾部,按照添加的顺序排序。
  • 散列表:散列表是一个键值对集合,键是string类型,散列表特别适合用于存储对象。
  • 集合:Redis的集合是string类型的无序集合。集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)。
  • 有序集合:与集合一样也是string类型元素的集合,且不允许重复的成员。不同的是每个元素都会关联一个double类型的分数,redis正是通过分数来为集合中的成员进行从小到大的排序。

使用场景

  • 计数器:可以对string进行自增自减运算,从而实现计数功能。Redis这种内存型数据库的读写性能非常高,很适合频繁读写的计数量。
  • 热点缓存:由于redis访问速度快,支持的数据类型比较丰富,所有redis很适合用来存储热点数据,另外结合expire(可用于设置key的过期时间),我们可以进行缓存更新操作。
  • 消息队列:列表数据是一个双向链表,可以通过lpush和rpop写入和读取消息。
  • 会话缓存:可以使用Redis来统一存储多台应用服务器的会话信息,使得某个应用服务器宕机时不会丢失会话信息,保证高可用性。
  • 分布式锁实现:在分布式场景下,无法使用单机环境下的锁来对多个节点上的进程进行同步,可以使用Redis自带的SETNX命令实现分布式锁。
  • 其它:Set可以实现交集、并集等操作,例如共同好友功能;ZSet可以实现有序性操作,例如排行榜功能。

Redis和Memcached的区别

  • 数据类型:Memcached仅支持字符串类型,而Redis支持五种不同的数据类型,可以更灵活的解决问题。
  • Redis支持两种持久化策略:RDB快照和AOF日志,而Memcached不支持持久化。
  • Memcached不支持分布式,只能通过在客户端使用一致性哈希来实现分布式存储,这种方式在存储和查询时都需要先在客户端计算一次数据所在的节点。而Redis Cluster实现了分布式的支持
  • 内存管理机制:Redis中,并不是所有的数据一直存储在内存中,可以将一些很久没用的value交换到磁盘,而Memcached的数据则会一直在内存中。Memcached将内存分割成特定长度的块来存储数据,以完全解决内存碎片问题。但是这种方式会使得内存的利用率不高。

数据淘汰策略

可以设置内存的最大使用量,当内存使用量超出时,会实施数据淘汰策略。
Redis有六种淘汰策略:

  • volatile-lru:从已设置的过期时间的数据集中挑选最近最少使用的数据淘汰
  • volatile-ttl:从已设置过期时间的数据集中挑选将要过期的数据淘汰
  • volatile-random:从已设置过期时间的数据集中任意选择数据淘汰
  • allkeys-lru:从所有数据集中挑选最近最少使用的数据淘汰
  • allkeys-random:从所有数据集中任意选择数据进行淘汰
  • noeviction:禁止驱逐数据(新写入的报错)

持久化

Redis是内存型数据库,为了保证数据在断电后不会丢失,需要将内存中的数据持久化到硬盘上。

RDB持久化:将某个时间点的所有数据都存放到硬盘上,可以将快照复制到其它服务器从而创建就对相同数据的服务器副本。如果系统发生故障,将会丢失最后一次创建快照之后的数据。如果数据量很大,保存快照的时间会很长。

AOF持久化:将写命令添加到AOF文件(Append Only File)的末尾,使用AOF持久化需要设置同步选项,从而确保写命令同步到磁盘文件上的时机。这是因为对文件写入并不会马上将内容同步到磁盘上,而是先存储到缓冲区,然后由操作系统决定什么时候同步到磁盘。
同步选项包括:
always(每个写命令都同步,会严重降低服务器的性能)、
everysec(每秒同步一次,比较合适,可以保证服务器崩溃时只会丢失一秒左右的数据,并且redis每秒执行一次同步对服务器性能几乎没有什么影响)、
no(让系统来决定何时同步)
随着服务器写请求的增加,AOF文件会越来越大,Redis提供了一种将AOF重写的特性,能够去除AOF文件中的冗余写命令。

事件

文件事件:服务器通过套接字与客户端或者其它服务器进行通信,文件事件就是对套接字操作的抽象。Redis开发了自己的网络事件处理器,使用I/O多路复用程序来同时监听多个套接字,并将到达的事件传送个文件事件分派器,分派器会根据套接字产生的事件类型调用相应的事件处理器。

在这里插入图片描述

服务器有一些操作需要在给定的时间点执行,时间事件就是对这类定时操作的抽象。
时间事件又分为:定时事件(让一段程序在指定的时间内执行一次)和周期性事件(让一段程序每隔指定事件就执行一次)。Redis将所有时间时间都放在一个无序链表中,通过遍历整个链表中已到达的时间事件,并调用相应的事件处理器。

因为redis中同时存在文件事件和时间事件两个事件类型,所以服务器需要对这两个事件进行调度。

事件调度过程如下:

  • 首先获取到达事件离当前事件最接近的时间事件,并计算最接近的时间时间距离达到还有多少ms,记为remaind_ms;
  • 如果时间已经到达,那么设置remaind_ms为0;
  • 根据remaind_ms的值,设置阻塞时间,并进入阻塞等待文件事件;
  • 处理所有已到达的文件事件;
  • 处理所有已到达的时间事件

复制

Redis通过主从复制模式实现复制功能,它允许用户为存储着目标数据的服务器创建出多个拥有相同数据库副本的服务器,其中存储目标数据库的服务器称为主服务器,而存储数据库副本的服务器则被称为从服务器。

通过使用slaveof host port命令来让一个服务器称为另一个服务器的从服务器。

一个从服务器只能有一个主服务器,并且不支持主主复制。

连接过程
(1)主服务器创建快照文件,发送给从服务器,并在发送期间使用缓冲区记录执行的写命令,快照文件发送完毕后,开始向从服务器发送存储在缓冲区的写命令;
(2)从服务器丢弃所有旧数据,载入主服务器发来的快照文件,之后从服务器开始接收主服务器发来的写命令;
(3)主服务器每执行一次写命令,就向服务器发送相同的写命令。

主从链:随着负载不断上升,主服务器可能无法很快地更新所有从服务器,或者重新连接重新同步从服务器将导致系统超载。为了解决这个问题,可以创建一个中间层,中间层的服务器是最上层服务器的从服务器,又是最下层服务器的主服务器。

参考:
http://www.cyc2018.xyz/
如有侵权,请联系作者删除

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值