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