Redis 常见数据结构以及使用场景?
String – : 标题、内容等 SET key value GET key、DEL key
list 链表,易于数据元素的插入和删除,但链表的随机访问困难
Hash 是 key,field,value (数组+链表),适合存储对象 系统中对象数据的存储。
Set 是一种无序集合,不可重复
应用场景: 需要存放的数据不能重复以及需要获取多个数据源交集和并集等场景
zset score 需要对数据根据某个权重进行排序的场景。 ZADD key score value1
为什么使用 Redis快的原因
1速度快,因为数据存在内存中
2 使用I/O多路复用模型 非阻塞IO
3采用单线程模型 省去线程切换、锁竞争的开销
4高效的数据结构
5合理的数据编码
Redis 持久化机制 RDB 和AOF 区别?
附加问题:都开启优先加载AOF
RDB ---快照持久化机制, 速度快 占用空间小加载快 存储慢,恢复快
- 适合快速备份和恢复大量数据。
缺点: 不实时:无法做到数据实时持久化,会丢失最近一次快照后的数据。
- 适用于对数据实时性要求不高、恢复速度要求高的场景,如定期备份和数据恢复。
- 适用于读多写少的场景,如缓存系统。
AOF以日志方式 将每个写操作记录到文件中,
优点:
- 数据安全性高:可以实时保存数据,减少数据丢失风险。
- 可读性:AOF是文本格式,便于读取和修改。
缺点:
- 文件体积大 ,恢复速度较慢。 写入效率稍低
适用场景:
- 适用于对数据安全性要求高的场景,如在线交易、实时监控等。
- 适用于写操作频繁且不易产生较多读操作的场景,如订单处理、实时数据收集等。
可以使用RDB进行定期备份,同时使用AOF来确保数据的实时性和安全性。
Redis 可以用来做什么?
1分布式锁 分布式环境下防止资源竞争 当key不存在的时候加锁,并设置过期时间
1)setnx命令加锁
set if not exists 我们会用到Redis的命令setnx,setnx的含义就是只有锁不存在的情况下才会设置成功。
2)设置锁的有效时间,防止死锁 expire
2缓存对于查询频繁的数据使用缓存
3排行榜
4分布式计数器
5存取token进一步管理用户
6限流
7延迟阻塞队列zest redission
如何保存** Redis数据与DB一致?
o 方案 1:同步双写,即更新完 DB 后立即同步更新 redis
o 方案 2:异步监听,即通过 Canal 监听 MySQL 变化的表,同步更新数据到 Redis
o 方案 3:MQ 异步, 即更新完 数据库 后生产消息到 消息队列,消息队列消费者更新数据到Redi
延时双删:在更新MySQL数据前后,删除Redis中的缓存数据,从而减少数据不一致的窗口期。 Binlog订阅:实时订阅MySQL的Binlog日志,自动更新Redis,确保数据的近实时一致性。
Redis的缓存雪崩、缓存穿透、缓存击穿
雪崩 大量频繁请求 不存在的数据 布隆过滤器 优化过期时间、异步构建缓存
设置过期标识更新缓存:设置一个缓存过期的提前量,当这个提前量过期时会触发另外的线程
去更新实际的key的缓存
进行实时监控:当发现redis命中率急速降低时,可以排查访问对象,设置访问黑名单
击穿 数据库中有,如果同一时间访问量过大会使数据崩掉
1.预先设置热点数据,在redis高峰访问之前,把一些热点数据提前存入到redis里,延长过期时间。
2.实时调整:监控redis,实时调整热门数据的过期时常。
加分布式锁,一条数据访问数据库
缓存穿透:缓存和数据库中都没有的数据,可用户还是源源不断的发起请求,导致每次请求都会到数据库,从而压垮数据库。
不存在数据设置短过期时间
对于某个查询为空的数据,可以将这个空结果进行Redis缓存,但是设置很短的过期时间,比如30s,可以根据实际业务设定。注意一定不要影响正常业务
业务层校验
用户发过来的请求,根据请求参数进行校验,对于明显错误的参数,直接拦截返回。
比如,请求参数为主键自增id,那么对于请求小于0的id参数,明显不符合,可以直接返回错误请求。
缓存降级是指 缓存过期、缓存击穿、缓存雪崩或缓存服务器挂掉的情况下,不去访问数据库,直接返回默认数据或访问服务的内存数据。
有些服务偶尔因为网络抖动或者服务正在上线而超时,可以自动降级
有些服务在一段时间内成功率有波动(如在 95~100%之间),可以自动降级或人工降级,并发送告警;
比如可用率低于 90%,或者数据库连接池被打爆了,或者访问量突然猛增到系统能承受的最大阀值,此时可以根据情况自动降级或者人工降级;
比如因为特殊原因数据错误了,此时需要紧急人工降级
布隆过滤器原理
作用 过滤非法key 布隆过滤器 底层用的是位数组,不仅节省空间,性能也嘎嘎猛,而且占用内存不会随着使用变大
Redis三种集群模式:主从模式、哨兵模式和Cluster模式
特性/配置 | Redis 主从复制 | Redis 哨兵 | Redis 集群 |
主要目的 | 数据备份与读写分离 | 高可用性和故障自动切换 | 高并发和数据分散处理 |
架构 | 一个主节点和多个从节点 | 监控主从结构并自动切换 | 多个主节点,数据分片 |
数据复制 | 主节点到从节点 | 监控并管理主从复制 | 每个主节点管理自己的数据集 |
故障转移机制 | 手动或哨兵自动切换 | 自动故障转移 | 自动处理节点故障 |
可伸缩性 | 有限,依赖主节点 | 为主从结构增加高可用性 | 高,因为数据分布式处理 |
使用场景 | 数据备份和读扩展 | 关键应用的高可用性 | 大规模应用的高性能需求 |
设置复杂度 | 相对简单 | 中等,需配置哨兵 | 复杂,需规划数据分区 |
哨兵模式 哨兵 用于监控主节点的状态,当主节点宕机之后会进行投票重新选出主节点。
集群采用了多主多从,按照一定的规则进行分片,将数据分别存储,一定程度上解决了哨兵模式下单机存储有限的问题。
redis集群模式(主从、哨兵、cluster)及数据同步过程
数据同步过程分全量同步和增量同步两部分。
主从模式:部署多台redis,读写分离,主节点负责写,从节点负责读。 l
哨兵模式:基于主从模式,读写分离,加入了sentinel哨兵对master及master下面的slave进行监控,有故障是可自动替换master及故障恢复,
集群模式:Redis分布式存储,对key经过hash算法后存储到不同的master中,来解决扩容问题
哨兵和集群的区别
Redis哨兵模式采用主从架构,Redis集群采用分片架构
哨兵有一个主节点和多个从节点,主节责写,从节点负
Redis哨兵模式通过哨兵节点实现故障转移, 一旦发现了主节点宕机,新的主节点可以很快地被选举出来,保证高可用性;
Redis集群 要考虑数据的分布、节点的负载均衡和故障转移等问题。
Redis哨兵模式适用于简单的主从复制场景,对于少量的节点和数据负载是足够的;
而Redis集群适用于大规模的数据存储和高并发访问,可以实现数据的分片和水平扩展。
Redis集群cluster:增加删除(伸缩)节点操作步骤
1.增加master节点
1.命令:old_ip只要是集群中的任意一个ip即可
redis-cli -a [password] --cluster add-node [new_ip] [old_ip]
2.例子
redis-cli -a 123456 --cluster add-node 127.0.0.1:7004 127.0.0.1:7001
添加分配散列槽 redis-cli -a [password] --cluster reshard [new_ip]
2.增加slave节点
1,命令
redis-cli -a [password] --cluster add-node [old_host:old_port] -a [password] --cluster-slave [old_id]
2.最快捷的方式(当然你首先要查看主节点的id)
redis-cli -a 123456 --cluster add-node 127.0.0.1:7004 127.0.0.1:7001 -a 123456 --cluster-slave 145b99ca42e4ddf2ad7fc43bdbc410ed0729e818
3.删除节点 redis-cli -a password -p 7004 cluster nodes redis-cli -a password --cluster reshard host:prot