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