redis的特性:
1. 单线程
2. 纯内存访问
3. 支持数据持久化
4. 非阻塞的I/O
redis的应用场景:
一般使用redis做缓存的较多
可以做队列 网站访问统计 分布式session 应用排行榜 以及一些社交关系图
redis的不同版本介绍:
2.8版本```
主从断线重连之后,采取的是部分复制(PSYNC) 只复制断线 之后的数据
redis sentinel stable (哨兵)
3.0版本
redis cluster
3.2版本
GEO
4.0版本
提供模块系统方便第三方拓展
非阻塞del和flushall/flushdb功能
RDB和AOF混合持久化模式
redis cluter兼容NAT和Docker
redis的结构及其内部编码:
基本数据类型:
字符串(string) : 包括整型(int) embstr编码的简单动态字符串 简单动态字符串
列表(list) : 包括链表(linkedlist)和快速列表(quicklist)
哈希(hash): 包括哈希表(hashtable)和压缩表(ziplist)
集合(set): 包括整型集合(intset)和哈希表(hashtable)
有序集合(zset): 包括压缩表(ziplist)和跳跃表(skiplist)
其他数据类型:
bitMap
hyperloglog
GEO
持久化:
持久化:
RDB:
1. 内存快照
2. 恢复速度快,持久化性能高,但是存在数据丢失风险
AOF:
1. 日志文件追加记录
2. 实时持久化,数据安全性高,持久化效率低
复制:
原理: 同步RDB文件, 复制到缓冲区
类型: redis版本在2.8版本之后出现增量数据复制(Psync)和全量数据复制(Sync)
拓扑: 有一下两种方式
星型:主-从(单节点)
主-从(多节点)
树型:主-从(主)-从
高可用:
高可用主要:
redis sentinel (哨兵模式)
redis cluster(集群自带高可用)
keepalived 基本原理是:Keepalive通过脚本检测master的存活,然后通过漂移VIP(Virtual IP)完成主从切换。
分布式:
方案:
集群: redis cluter
中间件分片: twemProxy 和 codisProxy
客户端分片: 业务程序
原理:
客户端分片 : 一次性哈希算法
codis : 虚拟槽分区(1024个槽)
集群内部数据节点独立运行,无需互相通信
redis cluter (集群): Gossip协议-- 集群数据节点内部相互通信
Raft算法 -- 集群内选主
虚拟槽分区(16384个槽)
阻塞
持久化阻塞 :
fork子进程 (RDB持久化 和AOF文件重写)
命令阻塞 :
1. keys *
2. smembers
3. lrange
4. hgetall
内存:
A. 内存消耗:
1. 对象内存
1.存储所有数据
2. 缓冲内存
1.客户端缓冲 : 通过参数client-output-buffer-limit控制
2.复制积压缓冲区 : 根据repl-backlog-size参数控制
3.AOF缓冲区 : 用于在Redis重写AOF文件期间保存的最近写入的命令
3. 内存碎片 : 可采用数据对齐和安全重启等方式规避内存碎片的问题
B.内存回收策略
1. 惰性删除
2. 定时删除
C.内存优化
1. 缩减键值对象的长度
2. 共享对象池
3. 字符串优化
4. 编码优化(使用ziplist编码能节约内存,但是会提高耗时- 空间换时间)
5. 控制键的数量(使用hash结构重构字符串结构)
客户端 :
jedis
redis-py
redigo
辅助功能:
慢查询 : (slowquery)
管道 : (pipeline)
存在问题:
1. 缓冲无底洞
2. 缓冲穿透
3. 缓冲击穿
4. 缓冲雪崩
5. 热点key倾斜
6. 热点key重建
优化:
vm.overcommit_memory =1
vm.swapiness =1
关闭THP特性
调大ulimit
调大TCP Backlog