五种数据类型
-
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没有,所以打到数据库上
解决方案: