Redis
2022-05-20 15:50:23 42 举报
AI智能生成
登录查看完整内容
Redis知识点汇总
作者其他创作
大纲/内容
基于内存运行,性能高效
支持分布式,理论上可以无限扩展
key-value存储系统
开源的使用ANSI C语言编写、遵守BSD协议、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API
特性
C/S通讯模型
单进程单线程模型
丰富的数据类型
操作具有原子性
持久化
高并发读写
特点
缓存系统(“热点”数据:高频读、低频写)、计数器、消息队列系统、排行榜、社交网络和实时系统
应用场景
介绍
value最大大小512M
String
Hash
理论上2^32
List
无序集合,理论上2^32元素
Set
一种有序集合类型,理论上2^32元素
ZSet
自定义类型
数据类型
redis支持丰富的数据类型memcache支持简单数据类型,需要客户端自己处理复杂对象
持久性
redis使用的是单线程模型,保证了数据按顺序提交。memcache需要使用cas保证数据一致性。
数据一致性
与Memcache区别
save,阻塞
bgsave,默认
自定义
默认的持久化方式,默认的文件名为dump.rdb。
RDB文件紧凑,全量备份,非常适合用于进行备份和灾难恢复
生成RDB文件的时候,redis主进程会fork()一个子进程来处理所有保存工作,主进程不需要进行任何磁盘IO操作
RDB 在恢复大数据集时的速度比 AOF 的恢复速度要快
优点
快照持久化期间修改的数据不会被保存,可能丢失数据
缺点
RDB
不丢失数据,IO开销大
always
1秒钟可能丢失数据
eveysec
不同步,不可控
no
追加到AOF日志文件中
增量备份
AOF可以更好的保护数据不丢失
AOF日志文件没有任何磁盘寻址的开销,写入性能非常高,文件不容易破损
AOF日志文件即使过大的时候,出现后台重写操作,也不会影响客户端的读写。
AOF日志文件的命令通过非常可读的方式进行记录,这个特性非常适合做灾难性的误删除的紧急恢复
对于同一份数据来说,AOF日志文件通常比RDB数据快照文件更大
AOF开启后,支持的写QPS会比RDB支持的写QPS低,因为AOF一般会配置成每秒fsync一次日志文件,当然,每秒一次fsync,性能也还是很高的
AOF
持久化机制
缓存服务器挂了
可以在时间上加一个随机值,分散过期时间点
高峰期缓存局部失效
热点缓存失效
原因
事前:redis 高可用,主从+哨兵,redis cluster,避免全盘崩溃。
事中:本地 ehcache 缓存 + hystrix 限流&降级,避免 MySQL 被打死
事后:redis 持久化,一旦重启,自动从磁盘上加载数据,快速恢复缓存数据。
解决
缓存雪崩
用户大量并发请求的数据(key)对应的数据在redis和数据库中都不存在,导致尽管数据不存在但还是每次都会进行查DB
从DB中查询出来数据为空,也进行空数据的缓存,避免DB数据为空也每次都进行数据库查询;
缓存穿透
原因:热点Key过期失效,高并发请求直接访问数据库
设置key永远不过期,或者重新设置key过期时间
当从缓存拿到的数据为null,重新从数据库加载数据的过程上锁
缓存击穿
缓存预热就是系统上线后,将相关的缓存数据直接加载到缓存系统
缓存预热
缓存降级,是为保证核心服务可用,使部分关键数据自动降级,同时也可避免缓存雪崩。
缓存降级
缓存更新,是指根据需要定期或触发清理过期或不需要的缓存。
缓存更新
常见问题
当读/写一个已经过期的key时,会触发惰性删除策略,直接删除掉这个过期key
被动删除
由于惰性删除策略无法保证冷数据被及时删掉,所以Redis会定期主动淘汰一批已过期的key
主动删除
当前已用内存超过maxmemory限定时,触发主动清理策略
过期键删除策略
信息修改频率不高,读取频率非常高。一般数据更新前至少读取两次,缓存才有意义。这个是最基本的策略,如果缓存还没有起作用就失效了,那就没有太大价值了
热数据
对于冷数据而言,大部分数据可能还没有再次访问到就已经被挤出内存,不仅占用内存,而且价值不大
冷数据
热数据、冷数据
配置文件中配置示例:maxmemory-policy volatile-lru
noeviction:不删除,报异常
allkeys-lru:优先删除最近最少使用
allkeys-random:随机删除
volatile-lru:在设置了超时时间的key中优先删除最近最少使用的 key
volatile-random:在设置了超时时间的key中随机删除一部分 key
volatile-ttl:在设置了超时时间的key中优先删除剩余时间短的key
策略
限定 Redis 占用的内存,Redis 会根据自身数据淘汰策略,留下热数据到内存。所以,计算一下 50W 数据大约占用的内存,然后设置一下 Redis 内存限制即可,并将淘汰策略为volatile-lru或者allkeys-lru
如何保证redis中10w数据都是热点数据
淘汰清理策略
Redis中,单条命令是原子性执行的,但事务不保证原子性,且没有回滚。事务中任意命令执行失败,其余的命令仍会被执行。
编译错误,可回滚。运行时错误,正确命令正常执行
MUlti [一系列操作命令] EXEC
事务
参照:http://note.youdao.com/s/A6AUWbA0
搭建
node1:0-5000
node2:5001-10000
node3:10001-16383
插槽(slot):0-16383
cluster,集群管理器
存取的key到达的时候,redis会根据crc16的算法得出一个结果,然后把结果对 16384 求余数,这样每个 key 都会对应一个编号在 0-16383 之间的哈希槽,通过这个值,去找到对应的插槽所对应的节点
数据存放原理
master,slave
数据的复制是单向的,只能由主节点到从节点。
主从复制
故障恢复
可以由主节点提供写服务,由从节点提供读服务
负载均衡
高可用
作用
主从
最大节点数:16384(槽位限制,理论上可无限扩展)
不能选择数据库,默认使用db0
过期 key 被清理
最大内存不足,导致 Redis 自动清理部分 key 以节省空间
主库故障后自动重启,从库自动同步
单独的主备方案,网络不稳定触发哨兵的自动切换主从节点,切换期间会有数据丢失
写丢失
集群
redisObject对象
缩减键值对象
字符串优化
编码优化
控制key的数量
内存优化
jedis
redisson
java
Redis
0 条评论
回复 删除
下一页