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



