zoukankan      html  css  js  c++  java
  • redis原理及实现

    1 什么是redis

    redis是nosql(也是个巨大的map) 单线程,但是可处理1秒10w的并发(数据都在内存中)

    使用java对redis进行操作类似jdbc接口标准对mysql,有各类实现他的实现类,我们常用的是druid

    其中对redis,我们通常用Jedis(也为我们提供了连接池JedisPool)

    在redis中,key就是byte[](string)

    redis的数据结构(value):

    String,list,set,orderset,hash

    2 redis的使用

    先安装好redis,然后运行,在pom文件中引入依赖,在要使用redis缓存的类的mapper.xml文件配置redis的全限定名。引入redis的redis.properties文件(如果要更改配置就可以使用)

    应用场景:

    String :

    1存储json类型对象,2计数器,3优酷视频点赞等

    list(双向链表)

    1可以使用redis的list模拟队列,堆,栈

    2朋友圈点赞(一条朋友圈内容语句,若干点赞语句)

    规定:朋友圈内容的格式:

    1,内容: user:x:post:x content来存储;

    2,点赞: post:x:good list来存储;(把相应头像取出来显示)

    hash(hashmap)

    1保存对象

    2分组

    3 string与hash的数据差别

    在网路传输时候,必须要进行进行序列化,才可以进行网路传输,那么在使用string类型的类型的时候需要进行相关序列化,hash也是要进行相关的系列化,所以会存在很多序列化,在存储的时候hash是可以存储的更加丰富,但是在反序列化的时候,string的反序列化相对较低,而hash的序列化和返序列化是相对hash类更加复杂,所以看业务场景,如果是数据经常修改的那种,为了性能可以使用string,如果是数据不是经常改的那种就可以使用hash,由于hash,存储数据时比较丰富,可以存储多种数据类型

    4 redis的持久化方式:

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

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

    优点:是一个紧凑压缩的二进制文件,Redis加载RDB恢复数据远远快于AOF的方式。

    缺点:由于每次生成RDB开销较大,非实时持久化,

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

    优点:实时持久化。

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

    5 redis单线程为什么这么快

      redis是单线程的,但是为什么还是这么快呢,

      原因1: 单线程,避免线程之间的竞争

      原因2 :是内存中的,使用内存的,可以减少磁盘的io

      原因3:多路复用模型,用了缓冲区的概念,selector模型来进行的

    6 redis主挂了怎么操作

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

      6.1 每隔10s,每个S节点(哨兵节点)会向主节点和从节点发送info命令获取最新的拓扑结构

      6.2 每隔2s,每个S节点会向某频道上发送该S节点对于主节点的判断以及当前Sl节点的信息,同时每个Sentinel节点也会订阅该频道,来了解其他S节点以及它们对主节点的判断(做客观下线依据)

      6.3 每隔1s,每个S节点会向主节点、从节点、其余S节点发送一条ping命令做一次心跳检测(心跳检测机制),来确认这些节点当前是否可达

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

    7 redis集群

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

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

      主客观下线:

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

      客观下线:超过半数,对该主节点做客观下线

      主节点选举出某一主节点作为领导者,来进行故障转移。

      故障转移(选举从节点作为新主节点)

    8 内存淘汰策略

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

    noeviction:当内存不足以容纳新写入数据时,新写入操作会报错。

    allkeys-lru:当内存不足以容纳新写入数据时,在键空间中,移除最近最少使用的key。

    allkeys-random:当内存不足以容纳新写入数据时,在键空间中,随机移除某个key。

    volatile-lru:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,移除最近最少使用的key。

    volatile-random:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,随机移除某个key。

    volatile-ttl:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,有更早过期时间的key优先移除。

     

    9 缓存击穿的解决方案:

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

      解决方法,对相关数据进行查询的数据只查询缓存,如果是一些特殊的可以进行数据库查询,

      也可以采用布隆过滤器进行查询

    10缓存雪崩的解决方案:

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

      解决方法:

      1 redis集群,通过集群方式将数据放置

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

  • 相关阅读:
    【Java EE 学习 36】【struts2】【struts2系统验证】【struts2 ognl值栈】【struts2 ongl标签】【struts2 UI标签】【struts2模型驱动和令牌机制】
    【Java EE 学习 35 下】【struts2】【struts2文件上传】【struts2自定义拦截器】【struts2手动验证】
    【Java EE 学习 35 上】【strus2】【类型转换器】【struts2和Servlet API解耦】【国际化问题】【资源文件乱码问题已经解决】
    【Java EE 学习 34】【struts2学习第一天】
    【JavaScript中的正则表达式】
    【Java EE 学习 33 下】【validate表单验证插件】
    【Java EE 学习 33 上】【JQuery样式操作】【JQuery中的Ajax操作】【JQuery中的XML操作】
    【Java EE 学习 32 下】【JQuery】【JQuey中的DOM操作】
    【Java EE 学习 32 上】【JQuery】【选择器】
    【Java EE 学习 31】【JavaScript基础增强】【Ajax基础】【Json基础】
  • 原文地址:https://www.cnblogs.com/FLy-1992/p/11635284.html
Copyright © 2011-2022 走看看