Redis知识点
2022-01-04 16:45:50 22 举报
Redis知识点
作者其他创作
大纲/内容
概述
什么是Redis
C 语言编写的、存在内存中
可以存储键和五种不同类型的值之间的映射
键的类型只能为字符串
值支持五种数据类型:字符串、列表、集合、散列表、有序集合。
支持事务 、持久化、LUA脚本、LRU驱动事件、多种集群方案。
Redis有哪些优缺点
优点
读写性能优异
支持数据持久化 aof 和rdb
支持事务,操作都是原子的
数据结构丰富
支持主从复制
缺点
基于内存,受物理内存限制
不具备自动容错和恢复,需手动
宕机,主机的部分数据未同步从机,导致数据不一致
难支持在线扩容,复杂
为什么要使用Redis
高性能
第一次访问数据库慢
缓存后,访问直接操作内存,快
高并发
缓存数据库数据到redis,减少访问数据库
为什么要使用Redis 不适用map/guava做缓存
map 或者 guava 实现的是本地缓存,特点是轻量以及快速,生命周期随着 jvm 的销毁而结束,并且在多实例的情况下,每个实例都需要各自保存一份缓存,缓存不具有一致性。
分布式缓存,在多实例的情况下,各实例共用一份缓存数据,缓存具有一致性。缺点是需要保持 redis 或 memcached服务的高可用,整个程序架构上较为复杂。
Redis为什么这么快
数据类型
Redis有哪些数据类型
Redis的应用场景
持久化
什么是redis的持久化
把内存的数据写到磁盘中,防止宕机内存的数据丢失
持久化的机制
两种持久化机制 RDB(默认) 和 AOF 机制
持久化的优缺点
如何选择合适的持久化方式
RDB(Redis Database)(默认)
按照一定的时间将内存的数据以快照的形式保存到硬盘中
生成dump.rdb 通过配置文件save参数来定义快照周期
优点
只有一个文件dump.rdb,方便持久化
容灾性好,一个文件可以保存到安全的磁盘
性能最大化,子线程处理IO持久化
相对于数据集大时,比AOF的启动效率更高
缺点
数据安全低,持久化的间隔期间宕机,导致数据丢失
AOF(Append-only file)
Redis执行的每次命令记录到单独的日志aof 文件
重启Redis会重新将持久化的日志文件恢复数据
优点
数据安全,appendfsync always 每次执行都记录
宕机,可通过redis-check-aof工具解决一致性问题
aof没被rewrite之前,可以删除一些命令
RDB和AOF的区别
AOF文件比RDB更新频率高,优先使用AOF还原数据
AOF比RDB更安全也更大
RDB性能比AOF好
如果2个都配置,优先加载AOF
如何选择RDB和AOF
同时使用RDB和AOF,重启优先加载AOF来恢复原始数据(数据全)
可以接受分钟内的数据丢失,选择RDB
只使用AOF,不推荐,因为RDB可以定时对数据库备份,并且恢复数据集的速度快也可以避免AOF的bug
redis持久化数据和缓存怎么扩容
使用一致性哈希实现动态扩容缩容
必须使用固定的keys-to-nodes映射关系,节点一旦确定不能变化
如果还需要动态化,会需要将之前的数据进行再平衡操作,增加复杂性
过期键的删除策略
定时过期
每个过期时间都需要一个定时器,过期清理
内存友好,占用cpu资源去处理
惰性过期
访问该key,才会判断是否过期,节省cpu,耗内存
极端下会出现大量过期的key,而不会被清除,占用内存
定期过期
每隔一定时间去扫描库中expires字典一定数量的key,清除
Redis中同时使用了惰性过期和定期过期两种过期策略
内存淘汰策略
全局的键空间选择性移除
noeviction 报错
allkeys-lru 移除最近最少使用的key
allkeys-random 随机移除某个key
设置过期时间的键空间选择性移除
volatile-lru 移除最近最少使用的key
volatile-random 随机移除某个key
volatile-ttl 有更早过期时间的key优先移除
线程模型(待完善,写的不是很清楚)
基于Reactor模式开发了网络事件处理器
事务
集群方案
哨兵模式sentinel
集群监控:负责监控master 和slave 进程
消息通知: redis 实例故障,发消息给管理员
故障转移: master 宕机,自动转移slave
配置中心: 转移发生,通知client新的master地址
至少需要3个实例,保证健壮性
哨兵+redis主从部署,不保证数据零丢失,只保证高可用
建议充足测试
cluster模式
原理
Redis Cluster是一种服务端Sharding技术,采用slot的概念,一共16384个槽
每个key通过CRC16校验后对16384取模来决定放置哪个槽
请求发送到任意节点,接收到请求的节点会将查询请求发送到正确的节点上
方案说明
通过哈希的方式,将数据分片,每个节点均分存储一定的哈希槽区间的数据,默认16384
每份数据分片会存储在多个互为主从的多节点上
数据写入先写主节点,再同步到到从节点
同一个分片多节点间的数据不保持一致性
读取数据时,当客户端操作的key没有分配在该节点时,redis会返回转向指令,指向正确的节点
扩容时需要把旧节点的数据迁移一部分到新的节点
端口说明
每个redis要放开2个端口 6379 16379 (6379+10000)
16379用来节点间通信的 gossip协议
主从模式
核心原理
当从库和主库建立MS(Master-Slave)关系后,会向主库发送SYNC命令
主库接收到SYNC命令后会开始再后台保存快照,并将期间接收到的命令保存
当快照完成后,主库会将快照和所有的缓存的写命令发送给从库
从库接收到后,会载入快照并执行存储的缓存命令
当主库每当接收到写命令时会将命令发送至从库,保持数据一致性
缺点
所有的slave节点的数据复制和同步都由主节点来处理,造成master压力大
分区(不太了解)
缓存与数据库一致性
先写缓存,在写数据库,缓存成功,数据库失败(脏读)
分布式锁
缓存异常
缓存雪崩(缓存时间过期失效)
指的是缓存大面积在同一时间失效,导致数据库短时间内无法处理大量请求,导致数据库崩溃
缓存雪崩是不同数据都过期了,很多数据都查不到从而查数据库
解决方案
缓存数据的过期时间设置随机,防止同一时间大量数据过期现象发生
加锁排队
给每个缓存数据增加缓存标记,记录缓存的是否失效,如果缓存标记失效,则更新缓存
缓存穿透(库都没数据)
指缓存和数据库中都没有数据,导致所有的请求都落到数据库上,崩溃
解决方案
接口层增加校验,如用户鉴权校验,例如id<0直接拦截
从缓存获取不到数据,数据库也找不到,可以设置key -null的缓存,并设置一个比较短的过期时间
采用布隆过滤器,将所有可能存在的数据存储到一个bitmap中,不存在的就提前过滤掉
缓存击穿(读缓存又读库)
指缓存中没有,数据库中有,并发用户大,同时读取缓存没读取到数据,又同时读取数据库,引起数据库压力大
缓存击穿指并发查同一条数据
解决方案
设置热点数据永不过期
加互斥锁
缓存预热
系统上线后,将相关的缓存数据直接加载到缓存系统中
解决方案
直接写个缓存刷新页面,上线时手工操作下
数据量不大,可以在项目启动的时候自动加载
定时刷新缓存
0 条评论
下一页