• 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

  • 相关阅读:
    GitHub上如何创建组织?
    windows中使用Git如何解决文件冲突?
    GitHub上如何删除代码仓库?
    并发编程模型和访问控制
    大数据征信的应用和启示:ZestFinance的基于大数据的信用评估技术
    Hadoop的Python框架指南
    Redis+Django(Session,Cookie、Cache)的用户系统
    如何使你的Ajax应用内容可让搜索引擎爬行
    Web运营手记
    全屏slider--swiper
  • 原文地址:https://www.cnblogs.com/CooperXia-847550730/p/13125575.html
Copyright © 2020-2023  润新知