(十)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 ...
随机推荐
- Nuxt 知识点
脚手架工具 create-nuxt-app 创建项目: $ npx create-nuxt-app <项目名> 启动项目: To get started: cd nuxt_demo npm ...
- 我对ISO 七层模型的理解
应用层: 负责native格式的请求配置,请求发起.关闭等功能: 负责应用数据请求可直接调用的api的支持. 使用表示层和会话层包装而成的便捷工具(API):Alamofire 表示层: 将应用层配置 ...
- Laravel 自定义公共函数全局使用,并设置自定加载
开发中经常定义一些公共函数(如:获取用户信息.csv导入导出等常用函数),方便控制层,模型层调用. 那么在Laravle框架中怎么使用? 方法如下: 1.在根目录app下新建公共目录Library/U ...
- (11)树莓派3 有线网卡静态IP设置
https://www.cnblogs.com/10e-6/p/5778355.html 树莓派设置静态IP地址 首先终端输入: ifconfig 查看树莓派默认分配的动态IP地址. 图 1-4 配置 ...
- Python高级函数--map/reduce
名字开头大写 后面小写:练习: def normalize(name): return name[0].upper() + name[1:].lower() L1 = ['adam', 'LISA', ...
- MVC框架与增强
一.什么是MVC MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用一种业务逻辑.数据.界面显示 ...
- 一个bug程序员的入园
大家好,我叫dg是一个只写bug的程序员.当然只写bug也是有好处的,那就是踩过的坑多了,摔的跟斗多了,并且没有被摔死,勇敢的活了下来,练就了一身钢筋铁骨.哈哈,开个玩笑.但是猜的坑多了就知道了哪里有 ...
- JS 根据不同年份,获取不同月份的天数
在做日期方面的需求时,需要考虑到大小月的问题 ##格式:new Date(year,month,0).getDate() new Date(2019,12,0).getDate() 可以在控制台打印 ...
- oracle 如何通过分组计数查出重复数据?
1.情景展示 现在,机构表数据中机构名称有重复数据,如何筛选出来? 2.分析 第一步:统计是否存在重复数据. 方式一: 方式二: 说明表中确实存在重复数据 第二步:统计重复次数及机构名称. 需要通 ...
- jenkins使用--安装文档
添加Jenkins的源(repository): #sudo wget -O /etc/yum.repos.d/jenkins.repo http://jenkins-ci.org/redhat/je ...