redis原理详解(了解redis底层原理,自己手写实现jedis)

本文目录
了解redis底层原理,自己手写实现jedis
一、Jedis实现原理
要自己手写jedis,首先要了解jedis的原理,我们在命令窗口输入set、get等命令背后的实现原理是什么?
大白话讲就是jedis通过tcp连接发送消息到redis服务器,接收到回复消息后再解析出来即可(我们执行的命令如set name test等都是按协议构造的),消息按约定好的规范,这个规范就是RESP协议
***隐藏网址***
二、RESP协议
resp协议定义了5种命令格式,间隔符号,在Linux下是r ,在Windows下是
1、单行的简单字符串Simple Strings:以 "+"加号 开头, 格式:+ 字符串 r
2、错误 Errors, 以"-"减号 开头 格式:- 错误前缀 错误信息 r
3、整数型 Integers, 以 ":" 冒号开头 格式:: 数字 r
SETNX、DEL、EXISTS、INCR、INCRBY、DECR、DECRBY、DBSIZE、LASTSAVE、RENAMENX、MOVE、LLEN、SADD、SREM、SISMEMBER、SCARD等命令都会返回整数
4、大字符串类型 Bulk Strings(多行字符串), 以 "#34;美元符号开头,长度限制512M
格式:$ 字符串的长度 r 字符串 r
多用于返回二进制安全的字符串, "$0rnrn"代表空字符串,redis-cli收到后显示的是"";"$-1rn"表示不存在,redis-cli收到显示的是nil
5、数组类型 Arrays,以 "*"开头 格式:* 数组元素个数 r 其他所有类型 (结尾不需要r )
不仅用于服务端向客户端发送命令,也可用于客户端向服务端发送命令
eg:
"*0r " #空数组
"*2r $3r foor $3r barr " #数组包含2个元素,分别是字符串foo和bar
"*3r :1r :2r :3r " #数组包含3个整数:1、2、3
"*5r :1r :2r :3r :4r $6r foobarr " #包含混合类型的数组
"*3r $3r SETr $2r aar $4r testr " #命令:SET aa test
三、代码手写实现
理解了jedis实现原理,我们就可以手写实现了,当然前提是先搭建一个redis服务,我们在本机搭建了一个redis server,端口号是6379
详解Redis 主从复制及主从复制原理
Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。从2010年3月15日起,Redis的开发工作由VMware主持。从2013年5月开始,Redis的开发由Pivotal赞助。
概述
在现有企业中80%公司大部分使用的是redis单机服务,在实际的场景当中单一节点的redis容易面临风险。
2、容量瓶颈。 当我们有需求需要扩容 Redis 内存时,从 16G 的内存升到 64G,单机肯定是满足不了。当然,你可以重新买个 128G 的新机器。
解决办法
要实现分布式数据库的更大的存储容量和承受高并发访问量,我们会将原来集中式数据库的数据分别存储到其他多个网络节点上。
Redis 为了解决这个单一节点的问题,也会把数据复制多个副本部署到其他节点上进行复制,实现 Redis的高可用,实现对数据的冗余备份,从而保证数据和服务的高可用。
主从复制
什么是主从复制
主从复制,是指将一台Redis服务器的数据,复制到其他的Redis服务器。前者称为主节点(master),后者称为从节点(slave),数据的复制是单向的,只能由主节点到从节点。
默认情况下,每台Redis服务器都是主节点;且一个主节点可以有多个从节点(或没有从节点),但一个从节点只能有一个主节点。
主从复制的作用
1、数据冗余: 主从复制实现了数据的热备份,是持久化之外的一种数据冗余方式。
2、故障恢复: 当主节点出现问题时,可以由从节点提供服务,实现快速的故障恢复;实际上是一种服务的冗余。
3、负载均衡: 在主从复制的基础上,配合读写分离,可以由主节点提供写服务,由从节点提供读服务(即写Redis数据时应用连接主节点,读Redis数据时应用连接从节点),分担服务器负载;尤其是在写少读多的场景下,通过多个从节点分担读负载,可以大大提高Redis服务器的并发量。
4、读写分离: 可以用于实现读写分离,主库写、从库读,读写分离不仅可以提高服务器的负载能力,同时可根据需求的变化,改变从库的数量。
5、高可用基石: 除了上述作用以外,主从复制还是哨兵和集群能够实施的基础,因此说主从复制是Redis高可用的基础。
主从复制启用
从节点开启主从复制,有3种方式:
1、配置文件: 在从服务器的配置文件中加入 slaveof《masterip》《masterport》。
2、启动命令: redis-server启动命令后加入 --slaveof《masterip》《masterport》。
3、客户端命令: Redis服务器启动后,直接通过客户端执行命令 slaveof《masterip》《masterport》,则该Redis实例成为从节点。
通过 info replication 命令可以看到复制的一些信息。
主从复制原理
主从复制过程大体可以分为3个阶段:连接建立阶段(即准备阶段)、数据同步阶段、命令传播阶段。
在从节点执行 slaveof 命令后,复制过程便开始运作,下面图示可以看出复制过程大致分为6个过程。
主从配置之后的日志记录也可以看出这个流程。
1、保存主节点(master)信息
执行 slaveof 后 Redis 会打印如下日志:
2、从节点与主节点建立网络连接
从节点(slave)内部通过每秒运行的定时任务维护复制相关逻辑,当定时任务发现存在新的主节点后,会尝试与该节点建立网络连接。
从节点与主节点建立网络连接。
从节点会建立一个 socket 套接字,从节点建立了一个端口为51234的套接字,专门用于接受主节点发送的复制命令。从节点连接成功后打印如下日志:
如果从节点无法建立连接,定时任务会无限重试直到连接成功或者执行 slaveofnoone 取消复制。
关于连接失败,可以在从节点执行 info replication 查看 master_link_down_since_seconds 指标,它会记录与主节点连接失败的系统时间。从节点连接主节点失败时也会每秒打印如下日志,方便发现问题:
3、发送 ping 命令
连接建立成功后从节点发送 ping 请求进行首次通信, ping 请求主要目的如下:
如果发送 ping 命令后,从节点没有收到主节点的 pong 回复或者超时,比如网络超时或者主节点正在阻塞无法响应命令,从节点会断开复制连接,下次定时任务会发起重连。
从节点发送的 ping 命令成功返回,Redis 打印如下日志,并继续后续复制流程:
4、权限验证
如果主节点设置了 requirepass 参数,则需要密码验证,从节点必须配置 masterauth 参数保证与主节点相同的密码才能通过验证。如果验证失败复制将终止,从节点重新发起复制流程。
5、同步数据集
主从复制连接正常通信后,对于首次建立复制的场景,主节点会把持有的数据全部发送给从节点,这部分操作是耗时最长的步骤。
6、命令持续复制
当主节点把当前的数据同步给从节点后,便完成了复制的建立流程。接下来主节点会持续地把写命令发送给从节点,保证主从数据一致性。
作者:LoyaltyLu
***隐藏网址***
redis缓存原理
redis缓存原理是sql语句时key值,查询结果resultSet是value,当同一个查询语句访问时(select * from t_product),只要曾经查询过,调用缓存直接返回resultSet,节省了数据库读取磁盘数据的时间。
redis的存储分为内存存储、磁盘存储和log文件三部分,配置文件中有三个参数对其进行配置。
save seconds updates,save配置,指出在多长时间内,有多少次更新操作,就将数据同步到数据文件。这个可以多个条件配合,比如默认配置文件中的设置,就设置了三个条件。
appendonly yes/no ,appendonly配置,指出是否在每次更新操作后进行日志记录,如果不开启,可能会在断电时导致一段时间内的数据丢失。因为redis本身同步数据文件是按上面的save条件来同步的,所以有的数据会在一段时间内只存在于内存中。
扩展资料
redis的出现,很大程度补偿了memcached这类key/value存储的不足,在部 分场合可以对关系数据库起到很好的补充作用。它提供了Java,C/C++,C#,PHP,JavaScript,Perl,Object-C,Python,Ruby,Erlang等客户端,使用很方便。
Redis支持主从同步。数据可以从主服务器向任意数量的从服务器上同步,从服务器可以是关联其他从服务器的主服务器。这使得Redis可执行单层树复制。
存盘可以有意无意的对数据进行写操作。由于完全实现了发布/订阅机制,使得从数据库在任何地方同步树时,可订阅一个频道并接收主服务器完整的消息发布记录。同步对读取操作的可扩展性和数据冗余很有帮助。
redis的官网地址,redis.io。(域名后缀io属于国家域名,是british Indian Ocean territory,即英属印度洋领地)
Redis持久化的方式选择与原理
通常Redis将数据存储在内存中或虚拟内存中,但它提供了数据持久化功能可以把内存中的数据持久化到磁盘。持久化有什么好处呢?比如可以保证断电后数据不会丢失,升级服务器也会变得更加方便。
1.RDB 持久化机制 :是对 redis 数据执行周期性的持久化。
这种方式就是将内存中数据以快照的方式写入到二进制文件中,默认的文件名为 dump.rdb。客户端也可以使用save或者bgsave命令通知redis做一次快照持久化。save操作是在主线程中保存快照的,由于redis是用一个主线程来处理所有客户端的请求,这种方式会阻塞所有客户端请求。所以不推荐使用。另一点需要注意的是,每次快照持久化都是将内存数据完整写入到磁盘一次,并不是增量的只同步增量数据。如果数据量大的话,写操作会比较多,必然会引起大量的磁盘IO操作,可能会严重影响性能。
2.AOF持久化机制 :AOF 机制对每条写入命令作为日志,以 append-only 的模式写入一个日志文件中,在 redis 重启的时候,可以通过回放 AOF 日志中的写入指令来重新构建整个数据集。当然由于操作系统会在内核中缓存write做的修改,所以可能不是立即写到磁盘上。这样的持久化还是有可能会丢失部分修改。不过我们可以通过配置文件告诉 redis我们想要通过fsync函数强制操作系统写入到磁盘的时机。
appendonly yes //启用日志追加持久化方式
(1)appendfsync always //收到写命令就立即强制写入磁盘。最慢的,但是保证完全持久化,不推荐使用。
(2)appendfsync everysec //每秒钟强制写入磁盘一次,在性能和持久化方面做了很好的折中,推荐使用。
(3)appendfsync no //完全依赖操作系统,性能最好,持久化没保证。
通过 RDB 或 AOF,都可以将 redis 内存中的数据持久化到磁盘上面来,然后可以将这些数据备份到别的地方去。
1.RDB方式
优点:
缺点:
2.AOF方式
优点:
缺点:
不要仅仅使用 RDB,因为那样会导致你丢失很多数据;也不要仅仅使用 AOF,因为那样有两个问题:第一,你通过 AOF 做冷备,没有 RDB 做冷备来的恢复速度更快;第二,RDB 每次简单粗暴生成数据快照,更加健壮,可以避免 AOF 这种复杂的备份和恢复机制的 bug;redis 支持同时开启开启两种持久化方式,我们可以综合使用 AOF 和 RDB 两种持久化机制,用 AOF 来保证数据不丢失,作为数据恢复的第一选择; 用 RDB 来做不同程度的冷备,在 AOF 文件都丢失或损坏不可用的时候,还可以使用 RDB 来进行快速的数据恢复。
***隐藏网址***

更多文章:
mathtype公式编号换成(怎样修改MathType公式编号的格式)
2026年1月1日 05:15
access如何用查询值给一维数组赋值(如何用vb读取access表中数据,并赋值给另一变量然后进行计算判断 急!)
2025年9月7日 11:00
surrendered是什么意思(提单问题surrendered 什么意思)
2026年5月21日 22:00
mysql和sqlyog区别(SQLyog和MySQL自带工具哪个好用)
2025年10月7日 07:30
school report(申请美国本科School report和official transcript 的问题)
2026年3月11日 00:15
ubuntu进入root用户(ubuntu切换到root用户)
2026年5月11日 23:15
sftpget到指定目录(centos7 中使用sftp窗口的get命令下载文件到Windows,请问下载到了Windows的哪个目录)
2026年1月30日 22:00
wps activex控件怎么启用(为什么我的安全设置不允许ActiveX控件!急!)
2025年6月30日 02:15
电脑access数据库下载(access数据库在电脑上怎么下载安装)
2025年9月22日 10:00
sql语句高到低排序(如何用数据库sql把一列数据从大到小排列)
2026年9月12日 18:30
双向可控硅的触发原理图及原理是什么?数据结构——图graph(基础概念)
2026年8月28日 11:15
fclose(stdout)什么意思(freopen在竞赛怎么用)
2026年8月1日 06:30












