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读书笔记的更多相关文章

  1. [redis读书笔记] 第一部分 数据结构与对象 简单动态字符串

    本读书笔记主要来自于<<redis设计与实现>> -- 黄键宏(huangz) redis主要设计了字符串,链表,字典,跳跃表,整数集合,压缩列表来做为基本的数据结构,实现键值 ...

  2. [REDIS 读书笔记]第一部分 数据结构与对象 跳跃表

    下面是跳跃表的基本原理,REDIS的实现大致相同 跳跃表的一个特点是,插入NODE是通过随机的方式来决定level的,比较奇特 下面是skipList的一个介绍,转载来的,源地址:http://ken ...

  3. [redis读书笔记] 第二部分 集群

    1. 一个集群会包含多个节点(一个节点就是一个reid是服务器),CLUST MEET <ip><port>可以添加一个node到集群,命令执行后,两个node之间就会进行握手 ...

  4. [redis读书笔记] 第三部分 多机数据库的实现 复制

    另外一篇写的很好很深入的文章:http://www.tuicool.com/articles/fAnYFb : RDB持久化 http://www.tuicool.com/articles/F3Eri ...

  5. [redis读书笔记] 第二部分 单机数据库 RDB持久化

    内存中的rdb是会存为文件以做到RDB持久化的.RDB文件时一个二进制文件. 一 载入与存储 文件的载入是在server启动时进行的(rdbload()),因为AOF的更新频率比RDB高,所以如果AO ...

  6. [redis读书笔记] 第二部分 单机数据库 数据库实现

    一 数据库基本实现/命令下发的实现 redis.c里,大家能看到redisCommandTable[] 的实现,列出了支持的所有命令.大部分的入参为redisClient *c,当一条REDIS命令下 ...

  7. [redis读书笔记] 第一部分 数据结构与对象 对象特性

    一 类型检查和多态    类型检查,即有的命令是只针对特定类型的,如果类型不对,就会报错,此处的类型,是指的键类型,即robj.type.下面为有类型检查的命令: 对于某一种类型,redis下底层的实 ...

  8. [redis读书笔记] 第一部分 数据结构与对象 对象类型

    - 从前面redis的基本数据结构来看,可以看出,redis都是在基本结构(string)的基础上,封装了一层统计的结构(SDS),这样让对基本结构的访问能够更快更准确,提高可控制度. - redis ...

  9. [redis读书笔记] 第一部分 数据结构与对象 字典

    三 字典 字典是Hash对象的底层实现,比如用HSET创建一个HASH的对象,底层可能就是用一个字典实现的键值对. 字典的实现主要设计下面三个结构: /* * 哈希表节点 */ typedef str ...

随机推荐

  1. 初学io

    IO流: 01.File 创建文件 //创建文件夹 private static void mkdirs() { System.out.println("请您输入创建的文件夹名称:(默认是E ...

  2. CSS-动画巧用translated3d

    VUE2.0单元素或组件的过渡 情景:插件从右向左滑动,巧用translate3d .food position :fixed left : 0 top :0 bottom :48px z-index ...

  3. 小程序radio样式修改

    .city-radio-group-label .city-label-radio {    //label样式   padding: 15rpx 50rpx;   position: relativ ...

  4. 装了anaconda之后如何设置anaconda、python环境变量

    装了anaconda之后如何设置anaconda.python环境变量 1.装了anaconda之后如何设置anaconda环境变量 参考 https://www.cnblogs.com/avivi/ ...

  5. 20164322韩玉婷 -----EXP4 恶意代码分析

    1.实践目标 1.1是监控你自己系统的运行状态,看有没有可疑的程序在运行. 1.2是分析一个恶意软件,就分析Exp2或Exp3中生成后门软件:分析工具尽量使用原生指令或sysinternals,sys ...

  6. 将jar包安装到本地repository中

    mvn install:install-file -Dfile=G:/lcn_springboot2.0/tx-plugins-db-4.1.2.jar -DgroupId=com.codingapi ...

  7. 解决: Homestead 环境下, yarn install --no-bin-links, NPM run dev, 命令报错

    执行以下命令: 1 $ rm -rf node_modules 2 $ yarn config set registry http://registry.cnpmjs.org 3 $ yarn ins ...

  8. 访问Mat某一个像素值

    mat.at<uchar>(row, col): 如果想要用cout打印出来,前面要加上(int),否则打印出来的是空字符:

  9. 使用CMake生成解决方案后构建INSTALL报错

    错误 1 error MSB3073: 命令“setlocal"D:\Program Files\CMake\bin\cmake.exe" -DBUILD_TYPE=Debug - ...

  10. 【模板】字符串匹配的三种做法(Hash、KMP、STL)

    题目描述 如题,给出两个字符串s1和s2,其中s2为s1的子串,求出s2在s1中所有出现的位置. 输入输出格式 输入格式: 第一行为一个字符串,即为s1 第二行为一个字符串,即为s2 输出格式: 1行 ...