首页 > 编程知识 正文

redis集群三种方式,redis是什么

时间:2023-05-03 10:29:23 阅读:159155 作者:4870

另一方面,所谓redis redis是指nosql (也是巨大的map )单线程,但每秒可以处理10w的同时运行)的数据全部在存储器中)。 使用java操作redis类似于jdbc接口标准对mysql,有实现各种各样的他的实现类,我们常用的是druid。

其中对于redis,我们通常使用Jedis。 (还提供了连接池JedisPool。

在redis中,key是字节redis的数据结构(value ) :

String、list、set、orderset、hash

二、为什么快速1、纯内存操作数据保存在内存中,内存响应时间约为100纳秒,这是Redis每秒万亿级访问的重要基础。

2、通过单线程操作,避免了频繁的上下文切换。 虽然采用了单线程,但单线程避免了不必要的上下文切换和竞争条件。 另外,不存在基于多进程和多线程的开关,消耗了CPU。 作者认为CPU不是瓶颈,内存和网络带宽才是重要的。 但在实际测试中却并非如此。 请参阅上面。

3、采用非阻塞I/O复用机制的复用I/O复用模型是利用select、poll、epoll同时监测多个流I/O事件的能力,空闲时阻塞当前线程,一个或多个程序轮询所有流(这里“复用”指的是多个网络连接,而“复用”指的是复用同一个线程。 除了Redis自身的事件处理模型外,还将epoll中的连接、读写、关机转换为事件,不会浪费I/O时间。

4、纯粹的ANSI C的制作不依赖于第三方的类库,不像memcached那样使用libevent。 由于libevent的代码越来越庞大以适应其通用性,作者通过对libevent中两个文件的修改实现了自己的epoll event loop。 微软兼容Windows补丁也因同样的理由被拒绝。

好快。 原因之一是Redis的多种数据结构,每个结构只做自己喜欢的事情。 当然,数据库为Table,MongogoDB只比JSON的一个结构快。

三. I/O复用模式和响应设计模式详细信息,请参阅使用libevent和libev提高网络应用性能的——I/O模式的发展史

Redis内部安装采用了epoll独自安装的简单的事件框架。 所有对epoll的读取、写入、关闭和连接都将转换为事件,利用epoll的多路复用功能,在io上花费较少的时间。

1、I/O复用的封装I/O复用实际上通过用1个线程记录并追踪各sock(I/O流)的状态来管理多个I/O流。

Redis需要在多个平台上运行,同时为了最大化执行的效率和性能,不同的编译平台选择不同的I/O复用函数作为子模块,提供给上层统一的接口。

redis的复用提供了select、epoll、evport、kqueue几个选择,在编译时选择一个。

select由POSIX提供,一般操作系统都支持;

epoll由LINUX系统内核支持;

Solaris系统内核支持evport;

Mac系统支持kqueue;

# ifdef have _ ev port # include ' AE _ ev port.c ' # else # ifdef have _ epoll # include ' AE _ epoll.c ' # else # ifdef hef Redis将类型名称aeApiState统一到所有的IO复用中,对epoll来说,类型成员是调用epoll_wait所需的参数

接下来,我们将讨论epoll接口的封装。

包括创建epoll_create

注册事件(epoll_ctl ) ) )。

删除事件(epoll_ctl )

块侦听(epoll_wait )等

创建epoll只是申请aeApiState的内存空间,将返回的指针保存到事件驱动循环中,事件的注册和删除是epoll_ctl的封装,通过根据操作选择不同的参数阻塞侦听是epoll_wait的封装,返回后由事件驱动保存活动事件。

2、Reactor设计模式:事件驱动循环流程Redis服务采用Reactor方式实现文件事件处理器。 (每个网络连接实际上对应于文件描述符) ) ) ) ) )。

main函数初始化完成后,需要执行事件驱动循环。 在循环中,调用并接收I/o复用函数

初始化完成后,main函数调用aeMain函数,传递的参数是服务的事件驱动

由于Redis以链表形式记录时间事件,所以每次寻找最早超时的事件时都需要遍历整个链表,容易导致性能下降

瓶颈。而 libevent 是采用最小堆记录时间事件,寻找最早超时事件只需要 O(1) 的复杂度。

通过Reactor的方式,可以将用户线程轮询IO操作状态的工作统一交给handle_events事件循环进行处理。

用户线程注册事件处理器之后可以继续执行做其他的工作(异步),而Reactor线程负责调用内核的select/epoll函数检查socket状态。当有socket被激活时,则通知相应的用户线程(或执行用户线程的回调函数),执行handle_event进行数据读取、处理的工作。由于select/epoll函数是阻塞的,因此多路IO复用模型也被称为异步阻塞IO模型。注意,这里的所说的阻塞是指select函数执行时线程被阻塞,而不是指socket。一般在使用IO多路复用模型时,socket都是设置为NONBLOCK的,不过这并不会产生影响,因为用户发起IO请求时,数据已经到达了,用户线程一定不会被阻塞。

3、redis线程模型:


简单来说,就是。我们的redis-client在操作的时候,会产生具有不同事件类型的socket。在服务端,有一段I/0多路复用程序,将其置入队列之中。然后,IO事件分派器,依次去队列中取,转发到不同的事件处理器中。

四、redis的持久化方式:

能,将内存中的数据异步写入硬盘中,两种方式:RDB(默认)和AOF

1、RDB持久化原理

通过bgsave命令触发,然后父进程执行fork操作创建子进程,子进程创建RDB文件,根据父进程内存生成临时快照文件,完成后对原有文件进行原子替换(定时一次性将所有数据进行快照生成一份副本存储在硬盘中)

优点:是一个紧凑压缩的二进制文件,Redis加载RDB恢复数据远远快于AOF的方式。缺点:由于每次生成RDB开销较大,非实时持久化, 2、AOF持久化原理

开启后,Redis每执行一个修改数据的命令,都会把这个命令添加到AOF文件中。

优点:实时持久化。

缺点:所以AOF文件体积逐渐变大,需要定期执行重写操作来降低文件体积,加载慢

五、redis主挂了怎么操作

redis提供了哨兵模式,当主挂了,可以选举其他的进行代替,哨兵模式的实现原理,就是三个定时任务监控。

每隔10s,每个S节点(哨兵节点)会向主节点和从节点发送info命令获取最新的拓扑结构每隔2s,每个S节点会向某频道上发送该S节点对于主节点的判断以及当前Sl节点的信息,同时每个Sentinel节点也会订阅该频道,来了解其他S节点以及它们对主节点的判断(做客观下线依据)每隔1s,每个S节点会向主节点、从节点、其余S节点发送一条ping命令做一次心跳检测(心跳检测机制),来确认这些节点当前是否可达

当三次心跳检测之后,就会进行投票,当超过半数以上的时候就会将该节点当做主。

六、redis集群

redis集群在3.0以后提供了ruby脚本进行搭建,引入了糙的概念,

Redis集群内节点通过ping/等待的美女消息实现节点通信,消息不但可以传播节点槽信息,还可以传播其他状态如:主从状态、节点故障等。因此故障发现也是通过消息传播机制实现的,主要环节包括:主观下线(pfail)和客观下线(fail)

1、主客观下线:

主观下线:集群中每个节点都会定期向其他节点发送ping消息,接收节点回复等待的美女消息作为响应。如果通信一直失败,则发送节点会把接收节点标记为主观下线(pfail)状态。

2、客观下线

超过半数,对该主节点做客观下线
主节点选举出某一主节点作为领导者,来进行故障转移。
故障转移(选举从节点作为新主节点)

七、内存淘汰策略

Redis的内存淘汰策略是指在Redis的用于缓存的内存不足时,怎么处理需要新写入且需要申请额外空间的数据。

noeviction:当内存不足以tdppx写入数据时,新写入操作会报错。allkeys-lru:当内存不足以tdppx写入数据时,在键空间中,移除最近最少使用的key。allkeys-random:当内存不足以tdppx写入数据时,在键空间中,随机移除某个key。volatile-lru:当内存不足以tdppx写入数据时,在设置了过期时间的键空间中,移除最近最少使用的key。volatile-random:当内存不足以tdppx写入数据时,在设置了过期时间的键空间中,随机移除某个key。volatile-ttl:当内存不足以tdppx写入数据时,在设置了过期时间的键空间中,有更早过期时间的key优先移除。

九、缓存击穿的解决方案:

原因:
就是别人请求数据的时候,很多数据在缓存中无法查询到,直接进入数据查询,

解决方法:
对相关数据进行查询的数据只查询缓存,如果是一些特殊的可以进行数据库查询,也可以采用布隆过滤器进行查询

十、缓存雪崩的解决方案:

缓存雪崩的原因:一次性加入缓存的数据过多,导致内存过高,从而影响内存的使用导致服务宕机

解决方法:

redis集群,通过集群方式将数据放置后端服务降级和限流:当一个接口请求次数过多,那么就会添加过多数据,可以对服务进行限流,限制访问的数量,这样就可以减少问题的出现

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。