前言学习了《Redis设计与实现》第15章关于主从复制的知识,写篇笔记用于复习吧。
1. 旧版复制功能的实现在Redis中,用户可以通过 SLAVEOF 命令或者设置 SLAVEOF 选项,让服务器成为主服务器的从服务器。
127.0.0.1:12345> SLAVEOF 127.0.0.1 6379OK
主从数据库保持相同的数据,称之为“数据库状态一致”,简称“一致”。
旧版复制功能的实现分为两种:同步和命令传播。
同步当客户端执行 SLAVEOF 命令后,从服务器会向主服务器复制数据,通过发送命令 SYNC 完成。执行步骤如下:
从服务器向主服务器发送 SYNC 命令。
收到 SYNC 命令的主服务器执行 BGSAVE 命令生成 RDB 文件,并使用一个缓冲区用来记录执行 BGSAVE 命令期间所有写命令。
当主服务器 BGSAVE 命令执行完毕,主服务器向从服务器发送 RDB 文件,从服务器将 RDB 载入数据库。
主服务器将缓冲区中的命令发送给从服务器,从服务器执行命令。
命令传播当主从数据库达到一致之后,每当主服务器执行一条写命令之后,会将该条命令传播发送给从服务 ...
前言最近笔试遇到一个问题:Go 的 sync.Pool 有什么作用?涉及到我的知识盲区了,遂入门学习了一下,写篇复习笔记以备不时之需。另外笔试的算法没写出来,一是时间不够,而是一段时间没碰算法了,有点手忙脚乱,祈祷笔试能过吧…T_T。
sync.Pool 是什么sync.Pool是 sync 包下的一个组件,用于将对象进行池化,对内存进行复用。
sync.Pool 有什么用在日常的开发中,我们可能需要经常创建某个临时对象,当并发量很高时,频繁的创建和销毁就会对GC造成很大的压力。sync.Pool 通过将对象缓存起来放入“池子”中,用的时候从池子中取,不用的时候返回池子中,避免了频繁的创建和销毁,减少GC压力,提升系统的性能。
sync.Pool 怎么使用sync.Pool有三种基本操作:Get、Put、New。
首先需要设置好New函数,当Pool中没有数据时通过New方法创建一个新的。其次是Get方法,当Pool中有对象时,Get就会拿到这个对象,否则调用New创建一个。Put方法用于将使用完的对象放回Pool中,实现复用。
下面是一个例子:
type student struct ...
Redis服务器本身其实是一个事件驱动程序,内部的所有操作基本都是靠事件进行驱动,也可以说,每一个操作都是一个事件。
Redis中的事件分为两种,文件事件和时间事件。
文件事件首先说文件事件,文件事件是套接字操作的抽象,套接字是Redis服务器和客户端连接和通信的桥梁,在通信的过程中,会产生相应的文件事件,服务器针对这些事件进行监听和处理,就可以完成一系列网络通信操作。
其次是时间事件,Redis中的一些操作,需要在特定时间点下进行,时间事件就是这些操作的抽象。
Redis基于Reactor模式,开发了自己的网络事件处理器,也称为文件事件处理器。文件事件处理器使用I/O多路复用模型来同时监听多个套接字,并根据套接字的类型,分配不同的事件处理器(accept、read、write、close等),当事件发生时,就通过分配的处理器进行处理。
文件事件处理器本身是单线程模型,通过使用I/O多路复用模型,既实现了高性能,又能和其他同样是单线程运行的模块进行对接,保持了单线程设计的简单性。
文件事件处理器由四个部分组成:套接字,I/O多路复用程序,文件事件分配器,事 ...
前言为了锻炼英语阅读能力,我决定每周翻译一篇个人认为讲得不错的文章,不限制主题。本文是第一篇,The Greatest Developer Fallacy Or The Wisest Words You’ll Ever Hear?第一次看到这篇文章是在耗子叔的博客,个人认为说的很有道理,深受启发,遂作为第一篇翻译文章。
你听过的这句话,到底是程序员的真理还是谬论?“我会在我需要的时候再去学”!这些年来,我听过这句话很多次了;当你身处在像软件开发一样快节奏的行业里时,这似乎时是一种非常务实的态度。从某些方面上看,它确实很务实,但从另一些方面上看,我对这句话感到厌烦。这句话已经成为了我们整个行业的座右铭,但却并没有让我们的行业变得更好。问题出在于,开发者把自己伪装成一个聪明且务实的人,但其实只是把这句话当成逃避的借口。有太多的东西需要我们去了解,随着你的前进,逐步掌握某些知识是必要的——这是工作的一部分。但是,在前进的过程中,“捡着学知识”和把所有的事情都推到要用到的时候再去学,这两者是不同的。
现在整个行业的人基本上都是多面手,可能一直以来都是如此,只是我以前没能亲眼看到,但是这两种我都 ...
type Map struct { mu Mutex // 互斥锁, 用于锁定dirty map read atomic.Value //atomic.Value 有两个方法,Load 和 Store,用于加载和存储值。 read中实际存储 readOnly dirty map[interface{}]*entry // dirty是一个当前最新的map,允许读写 misses int // 未命中次数 >= len(dirty) 提升dirty}
type readOnly struct { m map[interface{}]*entry // entry amended bool // 存在数据在dirty不在read,该值为true}
type entry struct { // nil: 表示被删除,dirty调用Delete()会将read map中的元素置为nil // expunged: 表示被删除,但是该 ...
凌晨半夜,从睡梦中醒来,那些埋藏在记忆深处的人和事,原来一直不曾忘记。
马上要找工作了,临近毕业,突然回首,小学,初中,高中,大学,我们一路匆匆忙忙,没有好好珍惜无比宝贵的绚烂的青春。有多少曾经天天在一起玩耍的朋友,现在一年两年也见不上一面?时间催人老,小学时初闻“人越长大越孤单”,只觉得不屑,到了初中,也是模糊的感觉的确如此,到如今高中大学,只觉得困陷其中,无法自拔。
初闻不识曲中意,再听已是曲中人。
回首萧瑟,那些尘封的旧记忆,如今再不写,以后怕是真的要忘了。我的小学没什么好说的,大家都是一个镇上的,就读在我们镇的中心小学,几乎都是读满六年,因此小时候的玩伴,到现在也还有联系。我的小学中规中矩,我还记得小学的班主任鲁明群老师,她经常和我们说,“我陪了你们六年,以后可要常回来看我”,很惭愧,毕业已几近十年,还不曾探望过鲁老师,甚至当我敲下鲁明群三个字,我望着它,还会怀疑是否敲错了,于情于理,让我羞愧难当。
后来小学毕业,我随父母去了广东惠州。惠州与我而言,是一个格格不入的“大城市”,我的前十二年,都生活在我们农村镇上。初入初中,我第一次见到橡胶跑道,第一次见到绿茵的足球场地,第一次知 ...
基本查询SELECT:查询查询多个字段SELECT first_name, last_nameFROM actor;
查询所有字段SELECT *FROM actor
没有 FROM 的 SELECTSELECT NOW();SELECT 1+2;
虚拟表 dualSELECT NOW() FROM dual;SELECT 1+2 FROM dual;
WHERE:过滤SELECT *FROM actorWHERE last_name = 'DAVIS' AND first_name = 'SUSAN';
AND有0则0,无0有NULL则NULL。
SELECT *FROM actorWHERE last_name = 'DAVIS' AND actor_id < 100;
OR有1则1,无1有NULL则NULL。
AND优先级高于OR+--------------+| 1 OR 0 AND 0 |+--------------+| ...
常用命令man查看命令的帮助文档。
ls显示指定目录下的文件列表
ls [选项] 指定目录-a 显示隐藏文件-l 长格式显示详细信息-t 按照时间排序-r 逆序排序(默认按文件名排序)-R 递归显示
cd切换工作目录
cd - 切换到上次目录cd .. 切换到上级目录cd /x/xx/xxx 切换到指定目录
文件通配符:
*(匹配任意字符)
?(匹配单个字符)
[xyz](匹配xyz任意一个)
[a-z](匹配范围a~z)
[!xyz](不匹配)
.开头的文件为隐藏文件
mkdir创建文件夹
mkdir directory...-p 递归创建
rmdir删除空文件夹
rmdir directory...
rm删除文件/文件夹
rm -r directory... 删除文件夹-f 强制删除
cp复制文件夹/文件
cp src dst 复制文件cp -r src dst 复制文件夹-v 显示进度、信息-p 保留原有时间-a 保留所有
mv文件改名/移动
mv file/directory file/directory
文本查看cat显示文本内 ...