(十)redis源码解读
一、redis工作机制

redis是 单线程,所有命令(set,get等)都会加入到队列中,然后一个个执行。
二、为什么redis速度快?
1、基于内存
2、redis协议resp 简单、可读、效率高
三、什么是resp
redis是一个ServerSocket服务器,而Jedis是一个Socket客户端类似redis-cli,用于与redis通讯,而redis和jedis之间通讯用的就是resp,如下图,如果jedis要设置一个值,命令是:set name shyroke,转为resp协议为:
*
$
set
$
name
$
shyroke
而如果jedis想要获取一个值,发送指令:get name,转为resp为:
*2
$
get
$
name

四、redis分表分库
如果数据量太大,一个redis存不下,那么此时就需要分表分库。

最简单的做法编写一个代理服务器,不管是数据库还是客户的缓存都通过代理,然后key进行路由,具体做法是对key长度进行取模,所得的结果就是相应的redis服务器。
案例:
(1)启动3个redis服务器,只要复制3份redis的配置文件(redis.window.conf),修改其中的端口号,然后分别脚本启动启动:redis-serve.exe 配置1.conf redis-serve.exe 配置2.conf redis-serve.exe 配置3.conf

(2)客户端请求代理服务器,代理服务器解析resp协议,并使用代理算法(key长度取模)计算相应的redis服务器,然后进行操作。代理算法:此时有3台服务器,此时执行:set name shyroke ,key的值为name,那么对key长度取模 = 4%3 = 1 ,所以此时会执行第二台redis服务器,也就是会往第二台代理服务器中存数据。

(3)测试如下图,19000是代理服务器的端口,此时jedis连接代理服务器,然后存一个值a=enjoy_a,a的长度是1,此时服务器有3台,所以1%3=1,所以此时会向第二台服务器也就是127.0.0.1:6380这台服务器存一个值。

五、redis之读写分离
如果有读多写少或者读少写多的场景,尤其是电商项目,读多写少,此时可以进行读写分离,也就是说可以用一台服务器用于写操作,多台服务器进行读操作。
案例
以三台服务器为例如下图,关键是数据同步,也就是说写的那台数据库的数据如何同步到其他用于读的数据库里。

1、修改两台读的redis服务器的配置文件,如下图,需要注意的是,加了下图的配置后就不能进行写(set)操作,只能往主节点(即写服务器)中写,只能进行读操作(get)

2、主节点(本例中为写服务器)挂了怎么办?
使用哨兵机制。即设置定时器,定时去ping主节点,如果pign不通则说明主节点(写服务器)挂了,此时就需要从子节点(读服务器)中选一个作为主节点,然后其他子节点作为新主节点的子节点。主节点中执行redis命令:info application 中可以获取主节点中所有子节点。
1、检查主节点状态

2、切换主节点。

(十)redis源码解读的更多相关文章
- redis源码解读--内存分配zmalloc
目录 主要函数 void *zmalloc(size_t size) void *zcalloc(size_t size) void zrealloc(void ptr, size_t size) v ...
- Alamofire源码解读系列(十二)之时间轴(Timeline)
本篇带来Alamofire中关于Timeline的一些思路 前言 Timeline翻译后的意思是时间轴,可以表示一个事件从开始到结束的时间节点.时间轴的概念能够应用在很多地方,比如说微博的主页就是一个 ...
- Alamofire源码解读系列(十二)之请求(Request)
本篇是Alamofire中的请求抽象层的讲解 前言 在Alamofire中,围绕着Request,设计了很多额外的特性,这也恰恰表明,Request是所有请求的基础部分和发起点.这无疑给我们一个Req ...
- AFNetworking 3.0 源码解读(十)之 UIActivityIndicatorView/UIRefreshControl/UIImageView + AFNetworking
我们应该看到过很多类似这样的例子:某个控件拥有加载网络图片的能力.但这究竟是怎么做到的呢?看完这篇文章就明白了. 前言 这篇我们会介绍 AFNetworking 中的3个UIKit中的分类.UIAct ...
- 第二十五课:jQuery.event.trigger的源码解读
本课主要来讲解jQuery.event.trigger的源码解读. trigger = function(event, data, elem, onlyHandlers){ if(elem & ...
- 第二十四课:jQuery.event.remove,dispatch的源码解读
本课还是来讲解一下jQuery是如何实现它的事件系统的.这一课我们先来讲一下jQuery.event.remove的源码解读. remove方法的目的是,根据用户传参,找到事件队列,从里面把匹配的ha ...
- Alamofire源码解读系列(十)之序列化(ResponseSerialization)
本篇主要讲解Alamofire中如何把服务器返回的数据序列化 前言 和前边的文章不同, 在这一篇中,我想从程序的设计层次上解读ResponseSerialization这个文件.更直观的去探讨该功能是 ...
- Spark学习之路 (十六)SparkCore的源码解读(二)spark-submit提交脚本
一.概述 上一篇主要是介绍了spark启动的一些脚本,这篇主要分析一下Spark源码中提交任务脚本的处理逻辑,从spark-submit一步步深入进去看看任务提交的整体流程,首先看一下整体的流程概要图 ...
- AFNetworking 3.0 源码解读(十一)之 UIButton/UIProgressView/UIWebView + AFNetworking
AFNetworking的源码解读马上就结束了,这一篇应该算是倒数第二篇,下一篇会是对AFNetworking中的技术点进行总结. 前言 上一篇我们总结了 UIActivityIndicatorVie ...
随机推荐
- 2019年杭电多校第一场 1009题String(HDU6586+模拟+单调栈)
题目链接 传送门 题意 给你一个字符串,要你构造一个长为\(k\)的子串使得每个字母出现的次数在\([L_i,R_i](0\leq i\leq26)\)间且字典序最小. 思路 做这种题目就是要保持思路 ...
- httprunner学习5-参数化与数据驱动
前言 参数化是自动化测试离不开的话题,httprunner里面只要把上一篇声明变量学会了,参数化也就自然会了. 不同的地方在于声明变量时对应值只有一个,参数化是多个值,存放在list里面. httpr ...
- docker学习7-Dockerfile制作自己的镜像文件
前言 如果你是一个python自动化测试人员,某天你在公司终于完成了一个项目的接口自动化脚本工作,在你自己常用的本机或者服务器上调试完成了脚本,稳稳地没问题. 可是晚上下班回家,你自己找了个linux ...
- vue项目中使用vue-layer弹框插件
vue-layer弹框插件 安装 npm i --save vue-layer 引用 import layer from 'vue-layer' Vue.prototype.$layer = lay ...
- crontab每小时运行一次(转)
https://blog.csdn.net/liu0808/article/details/80668705 先给出crontab的语法格式 对于网上很多给出的每小时定时任务写法,可以说绝大多数都是错 ...
- refPoint 别名与指针
// refPoint.cpp : Defines the entry point for the console application. // #include "stdafx.h&qu ...
- java语言评价--java帝国
“陛下您想想,我们有很多宝贝,” IO大臣根本不理线程大臣, 继续侃侃而谈:“ 比如IoC, AOP,反射.动态代理.泛型.注解.JDBC.JMS...... 还有我们引以为豪的JVM.这些东西,那些 ...
- Python 10 训练模型
原文:https://www.cnblogs.com/denny402/p/7520063.html 原文:https://www.jianshu.com/p/84f72791806f 原文:http ...
- 因子分解机 FM
特征组合 人工方式的特征工程,通常有两个问题: 特征爆炸 大量重要的特征组合都隐藏在数据中,无法被专家识别和设计 针对上述两个问题,广度模型和深度模型提供了不同的解决思路. 广度模型包括FM/FFM等 ...
- python url码转换 chr()码
爬虫生成带搜索词语的网址 1.字符串转为url编码 import urllib poet_name = "李白" url_code_name = urllib.quote(poet ...