下面由Redis教程栏目给大家介绍分析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 后端服务降级和限流:当一个接口请求次数过多,那么就会添加过多数据,可以对服务进行限流,限制访问的数量,这样就可以减少问题的出现

redis缓存实现原理php,分析redis原理及实现相关推荐

  1. java用redis缓存的步骤_Java 使用Redis缓存工具的图文详细方法

    开始在 Java 中使用 Redis 前, 我们需要确保已经安装了 redis 服务及 Java redis 驱动,且你的机器上能正常使用 Java. (1)Java的安装配置可以参考我们的 Java ...

  2. mysql redis缓存配置_SpringMVC + MyBatis + Mysql + Redis(作为二级缓存) 配置

    项目环境: 在SpringMVC + MyBatis + MySQL.Redis部署在Linux虚拟机. 1.整体思路 参考Ehcache实现MyBatis二级缓存代码(Maven引用对应jar查阅) ...

  3. ABP入门系列(13)——Redis缓存用起来

    1. 引言 创建任务时我们需要指定分配给谁,Demo中我们使用一个下拉列表用来显示当前系统的所有用户,以供用户选择.我们每创建一个任务时都要去数据库取一次用户列表,然后绑定到用户下拉列表显示.如果就单 ...

  4. Redis缓存过期和淘汰策略

    题记: 文章内容输出来源:拉勾教育Java高薪训练营. 本篇文章是 Redis 学习课程中的一部分笔记. Redis缓存过期和淘汰策略 Redis性能高: 官方数据 读:110000次/s 写:810 ...

  5. Redis缓存预热、缓存穿透、缓存击穿、缓存雪崩,Redis布隆过滤器怎么实现?

    目录 一.缓存预热 1.缓存预热常见步骤 2.代码实现 二.缓存雪崩 1.什么情况会发生缓存雪崩? 2.Redis缓存集群实现高可用 3.如何避免Redis缓存雪崩? 三.缓存穿透 1.什么情况会发生 ...

  6. Redis 缓存数据库

    Redis 缓存数据库 第1章 Redis简介: redis是使用C语言编写的开源的,支持网络,基于内存,可持久性的键值对存储数据库,2013年5月之前,Redis是最流行的键值对存储数据库 Redi ...

  7. redis 缓存测试

    redis 缓存测试 redis 缓存测试 redis介绍 redis测试点 redis查看工具 redis常用命令 redis 缓存测试 redis介绍 地址:https://redis.io/ r ...

  8. Spring Boot集成Redis缓存之注解方式

    首先还是加入依赖Jar pom.xml中加入依赖 <!-- 加载spring boot redis 包 --><dependency><groupId>org.sp ...

  9. Spring Boot Redis缓存

    Spring Boot Redis缓存 目录[ 隐藏 ] 1 Spring Boot Redis缓存 1.1 Spring Boot Redis项目设置 1.2 Spring Boot Redis缓存 ...

最新文章

  1. spring mvc 文件上传 form表单
  2. matlab九节点网络仿真问题,三机九节点电力系统仿真matlab.docx
  3. 教你用纯Java实现一个网页版的Xshell(附源码)
  4. 谈谈java面向对象思想_对于Java面向对象思想的理解
  5. vue-element-admin后台管理模板脚手架
  6. VTK:PolyData之ImplicitDataSetClipping
  7. 使用page-slot显示SAP Spartacus section里包含的Component和layout设计
  8. 为什么我喜欢写即时通讯软件呢?
  9. 如何提高mysql查询效率_如何提高MySQL查询效率
  10. Hive电商数仓实战
  11. JSON.parse()和JSON.stringify()的解析与用途
  12. 使用Telnet 在DS300上配置阵列
  13. java 僵尸进程_僵尸进程ZOMBIE
  14. playwright基本使用方法
  15. Git Commit 规范以及emoji 使用指南
  16. Excel数据导出图片
  17. 半年卖20亿,妙可蓝多是怎么将“奶酪”了吃进嘴里?
  18. 分析洋葱模型实现原理,在自己项目中接入洋葱模型
  19. 快速搭建一个MyBatis项目
  20. php safari播放mp4,修复video标签在safari中无法播放mp4视频的问题

热门文章

  1. php课程 6-20 字符串基础和去除空格和字符串填补函数
  2. JVM类加载机制详解(一)JVM类加载过程
  3. 如何解决ABBYY FineReader中表格检测不到问题
  4. strcpy 函数的实现
  5. Android开发小知识点(二)
  6. Centos7 WARNING: ‘aclocal-1.15‘ is missing on your system.
  7. POJ 1185 炮兵阵地(状压DP)题解
  8. EasyNVR无插件直播服务如何配合EasyBMS使用以及实现流媒体管理功能概述
  9. Lucene6去掉了Filter但是可以用BooleanQuery实现Filter查询
  10. 丰富自己的代码库-快速排序