redis读书笔记
1、redis两种存储机制(持久化)
Redis的存储机制分为:Snapshot和AOF 都先将内存存储在内存中。
(1)Snapshot当数据累计到一定的阈值,就会触发dump将数据一次性写入到数据文件RDB文件。批量数据存储,写入频率低,效率也高。但是安全性小,redis宕机,没有写入的数据会造成丢失。
(2)AOF采用日志追加的方式来持久化数据,调用fsync来完成对本次写操作的日志记录。调用fsync追加日志文件的频率可以更改,always每次记录都添加进来,everysecond每秒添加一次。rewrite这个日志的概念:根据合理的配置触发rewrite操作,将日志文件中所有数据都重新写在新的文件中,对于同个key的多次操作,保留最终的值得那次操作在日志文件中。缩小了日志文件大小。
2、redis的内存优化
(1)string和数字,redis能识别出一个数字,并按数字存储,节省存储空间。redis内部有一个数字池,默认10000,数字在这个池中就只需要一个简单的索引引用进来就可以,不需要把重复的数字分开存。
(2)复杂类型的存储优化,map,list,set这些大小不固定的集合类。redis会判断这里存储的entry数量,不多则采用紧凑格式来存储数据,这里不做解释。
3、讲讲redis中的hash数据类型
比起String数据类型,这个更适合存储对象,避免了序列化和反序列化

hash是一个string 类型的field和value的映射表。
hash特别适合存储对象。相对于将对象的每个字段存成单个string 类型。一个对象存储在hash类型中会占用更少的内存,并且可以更方便的存取整个对象。
Redis的Hash数据类型的value内部是一个HashMap,如果该Map的成员比较少,则会采用一维数组的方式来紧凑存储该MAP,省去了大量指针的内存开销。
采用key—field—value的方式。一个key可对应多个field,一个field对应一个value。这里同时需要注意,Redis提供了接口(hgetall)可以直接取到全部的属性数据,但是如果内部Map的成员很多,那么涉及到遍历整个内部Map的操作,由于Redis单线程模型的缘故,这个遍历操作可能会比较耗时,而令其它客户端的请求完全不响应,这点需要格外注意
建议使用对象类别和ID构成键名,使用字段表示对象属性,字段值存储属性值。
4、redis集群
如果redis只是单例的话,万一挂了,数据丢失。而且当数据量很大的时候,集群可以保证高可用。它可以把多个redis实例整合在一起,形成一个集群,也就是将数据分散到集群的多台机器上。但是该怎么分散呢,一个Key只能被分配到一台机器上,集群是如何实现把数据分配到不同的节点呢?我们在查询数据时,数据在任意一个节点中,我们如何保证成功存取呢?

如图是redis集群架构图,蓝色的是redis服务器节点,绿色的是客户端。每个节点通过二进制协议进行通信,每个节点也保存着所有集群的信息。节点之间相互ping对方,如果ping不通,说明对方节点挂了,由于每个节点会有一个副本slave,主从备份保证了后台的稳定性。
客户端可以与任何一个节点通信,对其存取和其他操作。由于数据被分配在不同的节点中,集群是如何找到数据在哪儿呢?redis 集群有一个16384长度的插槽。slot。编号分别是0,1,2,……16383,16384.每个节点都会负责一些插槽。集群维护这节点到插槽的映射。是由长度为16384,类型为节点的数组实现的。槽编码就是数组的下标。数组的内容就是节点。所以这样很快的能知道哪些槽是由哪些节点负责的。对于master节点来说,维护一个16384/8字节的位序列,比如对于编号为1的槽,Master只要判断序列的第二位(索引从0开始)是不是为1即可。
redis的数据是key-value存储的。不同的key的数据如何对应到slot呢。有一个键空间分布的算法 HASH_SLOT=CRC16(key)mod16384 这样就可以算出当前key被存在哪个slot里。
5、分片
分片不变的是键对于槽的映射,改变的是槽对于节点的映射。
redis读书笔记的更多相关文章
- [redis读书笔记] 第一部分 数据结构与对象 简单动态字符串
本读书笔记主要来自于<<redis设计与实现>> -- 黄键宏(huangz) redis主要设计了字符串,链表,字典,跳跃表,整数集合,压缩列表来做为基本的数据结构,实现键值 ...
- [REDIS 读书笔记]第一部分 数据结构与对象 跳跃表
下面是跳跃表的基本原理,REDIS的实现大致相同 跳跃表的一个特点是,插入NODE是通过随机的方式来决定level的,比较奇特 下面是skipList的一个介绍,转载来的,源地址:http://ken ...
- [redis读书笔记] 第二部分 集群
1. 一个集群会包含多个节点(一个节点就是一个reid是服务器),CLUST MEET <ip><port>可以添加一个node到集群,命令执行后,两个node之间就会进行握手 ...
- [redis读书笔记] 第三部分 多机数据库的实现 复制
另外一篇写的很好很深入的文章:http://www.tuicool.com/articles/fAnYFb : RDB持久化 http://www.tuicool.com/articles/F3Eri ...
- [redis读书笔记] 第二部分 单机数据库 RDB持久化
内存中的rdb是会存为文件以做到RDB持久化的.RDB文件时一个二进制文件. 一 载入与存储 文件的载入是在server启动时进行的(rdbload()),因为AOF的更新频率比RDB高,所以如果AO ...
- [redis读书笔记] 第二部分 单机数据库 数据库实现
一 数据库基本实现/命令下发的实现 redis.c里,大家能看到redisCommandTable[] 的实现,列出了支持的所有命令.大部分的入参为redisClient *c,当一条REDIS命令下 ...
- [redis读书笔记] 第一部分 数据结构与对象 对象特性
一 类型检查和多态 类型检查,即有的命令是只针对特定类型的,如果类型不对,就会报错,此处的类型,是指的键类型,即robj.type.下面为有类型检查的命令: 对于某一种类型,redis下底层的实 ...
- [redis读书笔记] 第一部分 数据结构与对象 对象类型
- 从前面redis的基本数据结构来看,可以看出,redis都是在基本结构(string)的基础上,封装了一层统计的结构(SDS),这样让对基本结构的访问能够更快更准确,提高可控制度. - redis ...
- [redis读书笔记] 第一部分 数据结构与对象 字典
三 字典 字典是Hash对象的底层实现,比如用HSET创建一个HASH的对象,底层可能就是用一个字典实现的键值对. 字典的实现主要设计下面三个结构: /* * 哈希表节点 */ typedef str ...
随机推荐
- Altium Designer 10 快捷键笔记
一.放置.走线类: 1.交互式走线(Track):P T 2.铺铜(Fill):P F 3.大面积铺铜(Polygon):P G 4.自动扇出:元件封装上右键,C F 二.编辑类 1.调整铺铜(Pol ...
- 图片合并成PDF,两个PDF的合并
需求: 将多张手机照片合并成一个PDF,并于另一个成型PDF合并 过程: 使用全能扫描王处理一遍,拆剪掉多余部分,并提高亮度增加文字对比度 合并: 使用Faststone Capture合并图片即可. ...
- css ——行级元素与块级元素解析
一 . 先说说二者的本质区别吧: 行级元素是可以和其他元素处于一行,不用必须另起一行.块级元素是每个块级元素都是独自占一行,其后的元素也只能另起一行,并不能两个元素共用一行. 二 .下面 ...
- Spring定义事物通知tx:advice
<aop:config proxy-target-class="false"> <aop:advisor advice-ref="txAdvice ...
- ITextSharp构造PDF文件
1.1 生成Document Document是我们要生成的PDF文件所有元素的容器,因此要生成一个PDF文档,必须首先定义一个Document对象. Document有三种构造函数: publ ...
- 多管齐下显神威-2017逐浪CMS开启全新建站与WEB技术革命
培训班里说百遍,不如商业场景来检验. PS.AI.JS工具齐上阵,一统逐浪CMS全网中间件. 从逐浪软件创业团队成立.到逐浪CMS产品,以企业形式运营,历经十二载风雨,作为华文世界排名第一的dotNE ...
- SQL Sever 2012版本数据库的完全卸载
首先再使用的过程中,遇到当前版本和项目数据库服务器的SQL Sever 版本不一致,导致无法正常的数据导入. 所以需要我们将本地的SQL Sever 数据库,进行一个完整的卸载,进而去安装和项目一致的 ...
- 软件开发者路线图梗概&书摘chapter2
空杯心态:放下对技能水平的自鸣得意 1.入门语言:学习一门语言,从实际问题入手→形成反馈回路 构建学习沙箱 利用实际代码,进行学习测试 学习一门语言:与精通该语言的专家一起工作,即找人指导 阅读他人的 ...
- H5 实现图片上传预览
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title&g ...
- CodeForce Div 2 C. Masha and two friends
题目链接: http://codeforces.com/contest/1080/problem/C 思路:双向延长两个矩形方块的4边,会形成一个被分割为9块的更大立方体. 计算所有的9个方框.方框中 ...