Stringjava
Listredis
Set数据库
Mapapi
Zset缓存
List数据结构是双向链表,能够左右插入删除,取出服务器
Map是hashmap的结构数据结构
Set也是hashmap的结构,可是value没有值框架
Zset是在Set的基础上,加上一个能够排序的score字段socket
Jedis是对Redis的官方JAVA封装,提供了全部api和操做分布式
RedisTemple是对Jedis的高级封装,提供了不少特性,例如链接池管理
快照的方式持久化,将redis数据保存成二进制的文件
能够直接保存也能够后台保存,直接持久化会致使其余服务被阻塞
后台保存会fork一个子进程,保存RDB
优缺点:
存储效率高、适合备份、恢复数据块
没法实时持久化,内容占用高
增量文件的方式持久化,将写命令所有记录在AOF文件中,记录数据库的改变
能够每次命令、每秒、或者系统控制
对AOF中的指令进行压缩,去除重复、无效、统一数据的屡次操做等
AOF会fork一个子进程将AOF缓冲区的内容写入AOF文件
AO重写也会fork一个子进程,将AOF从新缓冲区的内容写入AOF文件,代替原来的AOF文件
优缺点:
丢失的数据不多、
AOF文件存储大、灾难恢复慢
和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没有,因此打到数据库上
解决方案: