Redis笔记

 

五种数据类型

  • String

  • List

  • Set

  • Map

  • Zset

List数据结构是双向链表,可以左右插入删除,取出

Map是hashmap的结构

Set也是hashmap的结构,但是value没有值

Zset是在Set的基础上,加上一个可以排序的score字段

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

原文地址:https://www.cnblogs.com/CooperXia-847550730/p/13125575.html