Redis笔记

 

五种数据类型

  • Stringjava

  • Listredis

  • Set数据库

  • Mapapi

  • Zset缓存

List数据结构是双向链表,能够左右插入删除,取出服务器

Map是hashmap的结构数据结构

Set也是hashmap的结构,可是value没有值框架

Zset是在Set的基础上,加上一个能够排序的score字段socket

Jedis和RedisTemple

Jedis是对Redis的官方JAVA封装,提供了全部api和操做分布式

RedisTemple是对Jedis的高级封装,提供了不少特性,例如链接池管理

Redis持久化

RDB

快照的方式持久化,将redis数据保存成二进制的文件

能够直接保存也能够后台保存,直接持久化会致使其余服务被阻塞

后台保存会fork一个子进程,保存RDB

优缺点:

存储效率高、适合备份、恢复数据块

没法实时持久化,内容占用高

AOF

增量文件的方式持久化,将写命令所有记录在AOF文件中,记录数据库的改变

能够每次命令、每秒、或者系统控制

AOF重写

对AOF中的指令进行压缩,去除重复、无效、统一数据的屡次操做等

 

AOF会fork一个子进程将AOF缓冲区的内容写入AOF文件

AO重写也会fork一个子进程,将AOF从新缓冲区的内容写入AOF文件,代替原来的AOF文件

优缺点:

丢失的数据不多、

AOF文件存储大、灾难恢复慢

Redis事务

和java的sychnized和锁很像

一个是对操做加同步代码块,一个是对资源加锁

数据淘汰策略

数据删除策略和逐出策略

删除策略:是数据过时之后,如何处理

逐出策略:是内存不够之后,如何删除数据得到空间

删除策略

定时删除:过时了就删除

惰性删除:过时了不删除,下次使用的时候再删除

按期删除:定一个时间,例如十秒钟删除一次过时的数据

定时CUP占用高,惰性内存占用高

按期是一种折中,删除每次都是轮训每一个数据库,而后随机扫描一段时间,若是过时数据多与必定的比值,就再来一次

逐出策略

  • 从有有效期的数据中删除4

    LRU LFU TTL RANDOM

  • 从全部数据中删除3

    LRU LFU RANDOM

  • 不删除1

高级数据类型

bitmaps hyperloglog GEO

  • bitmaps就是一个记录比特位的数据类型,能够用来统计二值数据

  • hyperloglog 基数类型,用来作基数统计的,能够用最大12k的空间,统计无限多的值

  • GEO地理位置数据

主从复制

设置master和slave的方式:命令、配置、和框架

主从复制分为三个阶段

  • 全量复制

  • 增量复制

  • 命令传递

创建链接的过程

slave将本身的ip和port发送给master,创建socket并保存链接

随后可能还有受权验证的过程,master保存slave的port

全量复制和增量复制

第一次复制的时候

slave发送同步命令,初始runid为?,offset为-1

master开始bgsave,保存一个RDB文件,而且经过socket返回slave,同时返回runid和offset

slave接受完RDB后,清空数据库,经过RDB恢复

以上是全量复制的过程,后面是增量复制

slave告知master本身全量复制完成,发送runid和offset

master把复制缓冲区的AOF文件发送给slave

slave执行bgwriteaof 恢复数据

完成增量复制

命令传递

slave发送offset

master判断是offset否在缓冲中,不在就全量复制,在的话就把offset以后的内容发给slave

runid不对也会全量复制

哨兵

哨兵是一个分布式系统,用来监控主从的正常运行和发现故障以及故障转移

哨兵也是一台redis服务器,只是不提供数据服务

工做阶段:

  • 监控

  • 通知

  • 故障转移

监控

第一台sentinel,首先获取master的信息,而后获取slave的信息

后面的sentinel,获取master、前面sentinel和slave的信息

通知

sentinel们不断的监控全部的redis服务器,发送hello信息

故障转移

当一太sentinel发现有redis服务器发现故障的时候,告知全部sentinel,这台服务器主观下线

其余sentinel也去hello这台服务器,超过半数认为这台服务器下线了,就客观下线

而后投票找一个负责人:每一个sentinel发信息给其余,每一个sentinel将第一个收到的信息做为票,得票最高为负责人

负责人通知全部redis服务器,有服务器下线了,而且从slave中选一个新的主

原则:在线,响应快,与master断开最久、offset优先等原则

集群

redis集群和主从区别,主从其实是作冗余和备份,集群是将大任务分化,对外保持一致

cluster集群,rb脚本

内存存储:将keyhash而后取模16384,分红不一样的槽,每一个reids服务器存储一部分的槽,不论是新增仍是删除,都是操做存储的槽的数量

通信设计:请求来了一台redis,命中就返回,不命中告知key所在服务器是哪一台

 

企业级问题

预热

服务上线以前,将一些数据预加载到redis中,防止一上线,大量热点请求涌入

解决方案:

平常记录热点数据、创建数据留存队列,kafka和strom、开启脚本按期预热、CDN加速

主从同时预热

血崩

同时,大量key过时

解决方案:

内存逐出策略切换、数据分类拆分过时时间、设置永久key、加锁

击穿

热点key过时,大量请求打到数据库上

解决方案:

永久key,二级缓存、按需加大过时时间、加锁

穿透

黑客攻击,大量无效的请求,key没有,因此打到数据库上

解决方案:

前台验证、后台验证、布隆过滤器、白名单、key加密、缓存null

相关文章
相关标签/搜索