Redis
2022-02-16 11:48:57 24 举报
AI智能生成
知识脑图
作者其他创作
大纲/内容
3.持久化
RDB
内存快照
恢复速度快,持久化性能高.但是存在数据丢失风险
AOF
日志文件追加记录
实时持久化,数据安全性更高.持久化效率低
4.复制
原理
同步RDB文件
复制缓冲区
类型
部分复制(Psync,2.8版本之后)
全量复制(Sync)
拓扑
星型
主 - 从(单节点)
主 - 从(多节点)
树型
主 - 从(主) - 从
6.分布式
方案
集群
Redis Cluster
中间件分片
TwemProxy
CodisProxy
客户端分片
业务程序
原理
客户端分片
一致性哈希算法
Codis
虚拟槽分区(1024个槽)
集群内部数据节点独立运作,无需相互通信
Redis Cluster
Gossip协议 -- 集群数据节点内部相互通信
Raft算法 -- 集群内选主
虚拟槽分区(16384个槽)
8.内存
内存消耗
对象内存
存储着所有数据
缓冲内存
客户端缓冲
通过参数client-output-buffer-limit控制
复制积压缓冲区
根据repl-backlog-size参数控制
AOF缓冲区
用于在Redis重写AOF文件期间保存最近的写入命令
内存碎片
可采用数据对齐和安全重启等方式规避内存碎片的问题
内存回收策略
惰性删除
定时任务删除
内存优化
缩减键值对象的长度
共享对象池
字符串优化
编码优化(使用ziplist编码能节约内存但会提高耗时-空间换时间)
控制键的数量(如使用hash结构重构字符串结构)
10.辅助功能
慢查询(slowquery)
管道(pipeline)
12.性能调优
vm.overcommit_memory=1
vm.swapiness=1
关闭THP特性
echo never > /sys/kernel/mm/transparent_hugepage/enabled
调大ulimit
调大TCP Backlog
Redis参数调优
appendfsync
no-appendfsync-on-rewrite
auto-aof-rewrite-percentage
auto-aof-rewrite-min-size
hash-max-ziplist-entries
hash-max-ziplist-value
list-max-ziplist-size
set-max-intset-entries
zset-max-ziplist-entries
zset-max-ziplist-value
hll-sparse-max-bytes
client-output-buffer-limit
14.常用命令
key
del {key}
删除key
dump {key}
返回key对应data序列化结果
expire {key} {seconds}
设置过期时间, 单位秒
keys {pattern}
查找所有符合给定模式( pattern)的 key
move {key} {db}
将当前数据库的 key 移动到给定的数据库 db 当中,集群下只有db0
ttl {key}
以秒为单位,返回给定 key 的剩余生存时间(TTL, time to live)。
randomkey
从当前数据库中随机返回一个 key
rename {key} {newkey}
修改 key 的名称
type {key}
返回 key 所储存的值的类型
data
string
set {key} {value}
get {key}
setex {key} {sec} {value}
hash
list
set
sort set
1.特性及应用场景
特性
单线程
纯内存访问
支持数据持久化
非阻塞IO(epoll)
应用场景
缓存
队列
网站访问统计
分布式Session
应用排行榜
社交关系图
版本新特性
2.8
主从断线重连后采取部分复制(Psync)
Redis Sentinel Stable
3.0
Redis Cluster
3.2
GEO
4.0
提供模块系统方便第三方拓展
非阻塞del和flushall/flushdb功能
RDB和AOF混合持久化模式
Redis Cluster兼容NAT和Docker
5.0
新数据类型Stream(借鉴了Kafka的设计,消息可持久化)
新Redis模块API:Timers and Cluster API
RDB现在存储LFU和LRU信息
集群管理器从Ruby(redis-trib.rb)改成C重写
新sorted set命令:ZPOPMIN/MAX和阻塞变量
主动碎片整理
增强HyperLogLog实现
内存统计报告更直观
Jemalloc升级到5.1版
2.数据结构及内部编码
其他数据类型
Bitmap
Hyperloglog
GEO
redis 核心对象 redisObject
数据类型(type)
字符串(String)
整型(int)
embstr编码的简单动态字符串
简单动态字符串
二进制安全,意思是 Redis 的 String 类型可以包含任何数据,比如 jpg 图片或者序列化的对象
最大能存储 512M
哈希(Hash)
哈希表(Hashtable)
压缩表(Ziplist)
列表(List)
链表(Linkedlist)
快速列表(Quicklist)
简单的字符串列表,按照插入顺序排序。可以添加一个元素到列表的头部(左边)或者尾部(右边) 常用命令:lpush、rpush、lpop、rpop、lrange(获取列表片段)等
实现是一个双向链表,既可以支持反向查找和遍历,更方便操作,不过带来了额外的内存开销。
集合(Set)
整型集合(intset)
哈希表(Hashtable)
通过 hashtable 实现的。Set 中的元素是没有顺序的,而且是没有重复的
有序集合(Zset)
压缩表(Ziplist)
跳跃表(Skiplist)
编码(encoding)
raw
int
ht
zipmap
linkedlist
ziplist
intset
数据指针(ptr)
虚拟内存(vm)
其他
5.高可用
Redis Sentinel
Redis Cluster(集群自带高可用)
Keepalived
7.阻塞
持久化阻塞
Fork子进程
RDB持久化
AOF文件重写
fork操作发生在rdb和aof重写时,redis主线程调用fork操作产生共享内存的子进程,由子进程完成持久化文件重写工作,若fork操作本身耗时过长,则必会导致主线程阻塞;可执行info stats命令获取到latest_fork_usec指标,表示redis最近一次fork操作耗时,若超过1s,则需要做出优化调整
子主题
命令阻塞
keys *
smembers
lrange
hgetall
外部因素
CPU竞争
内存交换
网络
11.缓存问题隐患
缓存无底洞
键值数据库或者缓存系统,由于通常采用hash函数将key映射到对应的实例,造成key的分布与业务无关,但是由于数据量、访问量的需求,需要使用分布式后(无论是客户端一致性哈性、redis-cluster、codis),批量操作比如批量获取多个key(例如redis的mget操作),通常需要从不同实例获取key值,相比于单机批量操作只涉及到一次网络操作,分布式批量操作会涉及到多次网络io
解决
思路
(1) 命令本身的效率:例如sql优化,命令优化
(2) 网络次数:减少通信次数
(3) 降低接入成本:长连/连接池,NIO等。
(4) IO访问合并:O(n)到O(1)过程:批量接口(mget),
(2) 网络次数:减少通信次数
(3) 降低接入成本:长连/连接池,NIO等。
(4) IO访问合并:O(n)到O(1)过程:批量接口(mget),
串行mget
将Mget操作(n个key)拆分为逐次执行N次get操作, 很明显这种操作时间复杂度较高,它的操作时间=n次网络时间+n次命令时间,网络次数是n,很显然这种方案不是最优的,但是足够简单
串行IO
将Mget操作(n个key),利用已知的hash函数算出key对应的节点,这样就可以得到一个这样的关系:Map<node, somekeys>,也就是每个节点对应的一些keys它的操作时间=node次网络时间+n次命令时间,网络次数是node的个数
并行IO
将串行IO的获取步骤使用多线程执行,网络次数虽然还是nodes.size(),但网络时间变为o(1),但是这种方案会增加编程的复杂度。
hash-tag
集群支持hash tags功能,即可以把一类key定位到同一个slot
缓存穿透
频繁查询一个不存在的数据,由于缓存不命中,每次都要查询持久层。从而失去缓存的意义
解决
用一个bitmap和n个hash函数做布隆过滤器过滤没有在缓存的键
持久层查询不到就缓存空结果,有效时间为数分钟
缓存雪崩
缓存大量失效的时候,引发大量查询数据库
解决
使用锁,单机用synchronized,lock等,分布式用分布式锁
缓存过期时间不设置,而是设置在key对应的value里。如果检测到存的时间超过过期时间则异步更新缓存
在value设置一个比过期时间t0小的过期时间值t1,当t1过期的时候,延长t1并做更新缓存操作
集群热点key
大存储或者高QPS的key集中在集群中的某些节点,导致集群性能容量等分布不均,不能达到理想效果
存储倾斜
应避免使用大key,把key设计拆分打散
redis集群部署和扩缩容处理,保证数据槽位分配平均
QPS倾斜
收集数据,打散热点key到不同节点
将数据从redis加载到服务内存中 (影响服务性能)
13.监控
info
redis-stat
redislive
redis-cli monitor
redis-cli --latency
Codis Dashboard
Zabbix
Grafana
0 条评论
下一页
为你推荐
查看更多