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 ...
随机推荐
- Hive与HBase表联合使用Join的问题
hive与hbase表结合级联查询的问题,主要hive两个表以上涉及到join操作,就会长时间卡住,查询日志也不报错,也不会出现mr的进度百分比显示,shell显示如下图 如图: 解决这个问题,需要修 ...
- conts、var 、let的区别
1.const定义的变量不可以直接修改,通过 this.a = 'kkk' 进行修改, 而且必须初始化. 2.var定义的变量可以修改,如果不初始化会输出undefined 3.let是块级作用域,函 ...
- 1945 : 卡贩子Carol
题目描述 来自F星球的Carol是一个不折不扣的“正版游戏受害者”,在黑色星期五的疯狂购买后,钱包渐空的Carol突然发现TA所使用的游戏交易平台上有个值得留意的地方————集换式卡牌. 集换式卡牌是 ...
- CentOS 7安全加固
本次实验使用的centos 7 版本 一.查找系统中是否存在空密码账户 1.使用命令: awk -F: '($2==""){print $1}' /etc/shadow 直接查看. ...
- JS实现购物商城商品放大
img属于行内元素 <img src=''>gq</img> 效果 当放大图片时候,文字位置发生改变 文字出现在图片下方,因为图片有一个隐形的g线,这条线的位置和以前上学时候, ...
- 个人练习:使用HTML+CSS3制作图片轮播功能(不使用JavaScript)
先上效果图,不要在意用来当素材的图片: 在搜索相关资料的时候,查到有两种实现方式:一是使用JavaScript,二是使用CSS3中的Animation(动画),这里使用的是CSS3中的Animatio ...
- Java泛型相关总结(下)
约束与局限性 不能用基本类型实例化类型参数 不能像Pair<double>这样调用,只能Pair<Double>,原因是类型擦除 运行时类型查询只使用于原始类型 虚拟机中的对象 ...
- lua 5.3最简单plugin编写
#include <windows.h> #include "lauxlib.h" /* Pop-up a Windows message box with your ...
- spring事务详解(二)简单样例
系列目录 spring事务详解(一)初探事务 spring事务详解(二)简单样例 spring事务详解(三)源码详解 spring事务详解(四)测试验证 spring事务详解(五)总结提高 一.引子 ...
- Idea动态java模板配置
使用全能idea工具可以可以大大的提升开发效率,其中有个特别有用技能跟大家分享一下. 相比大家都用过idea的快速插入代码功能,插入诸如getter,setter还有构造函数生成,做到了只需一键点击就 ...