分析redis原理及实现方法

24次阅读
没有评论

共计 2611 个字符,预计需要花费 7 分钟才能阅读完成。

自动写代码机器人,免费开通

丸趣 TV 小编给大家分享一下分析 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 优先移除。
分析 redis 原理及实现方法

9 缓存击穿的解决方案:

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

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

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

10 缓存雪崩的解决方案:

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

解决方法:

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

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

看完了这篇文章,相信你对分析 redis 原理及实现方法有了一定的了解,想了解更多相关知识,欢迎关注丸趣 TV 行业资讯频道,感谢各位的阅读!

向 AI 问一下细节

丸趣 TV 网 – 提供最优质的资源集合!

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-12-18发表,共计2611字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)