Redis
2025-03-28 14:44:30 7 举报
AI智能生成
Redis(Remote Dictionary Server)是一个开源的使用ANSI C语言编写的高性能键值存储数据库,支持丰富的数据结构,包括字符串(strings)、列表(lists)、集合(sets)、排序集合(sorted sets)、哈希表(hashes)、位图(bitmaps)、超日志(hyperloglogs)和地理空间索引(geospatial indexes)。其特性包括数据的持久化存储、复制、以及高可用性保障。Redis因其在内存中的存储而具有极高的读写性能,它既可以用作数据库,也可以作为缓存系统或消息队列。其以灵活易用、功能全面而闻名,适用于构建高并发的应用程序,是现代应用架构中的关键组件之一,为各种规模的企业级解决方案提供了关键的速度和功能性支撑。
作者其他创作
大纲/内容
redis读写操作步骤
读取
1:缓存命中则直接返回,2:如果未命中查询数据库,将数据放入到缓存中,并设置过期时间,然后返回
写入
先操作数据库,再更新redis缓存,要保证数据库与redis的一致性
持久化
RDB
原理:在指定时间,将内存数据以快照形式存储,在回复数据的时候将RDB文件内容读取到内存就可
优缺点:恢复比较快,但是数据有差异
AOF
原理:redis之执行完每一次的写入操作时将命令追加到文件中,redis重启时,将该日志文件中的命令执行,以恢复数据
优缺点:速度较慢,数据完整性比较高
集群模式
哨兵模式
什么是哨兵模式:
是一个高可用的解决方案,是由多个哨兵节点和多个redis节点组成
主要作用:
监控 :哨兵节点持续监控主节点和从节点的运行状态
自动故障转移:当主节点发生故障,哨兵会选取一个新的主节点,并将从节点指定到主节点
通知: :当哨兵节点或redis实例发生故障的时候,会通知管理员
主从复制
全量复制
原理:1:从向主发送请求同步数据命令(sunc) 2:主接到命令后执行bgsave命令,生成RDB文件发送给从,,从执行文件还原数据。 3:命令传播::主新生成的数据在缓冲区生成命令发给从进行执行恢复
缺点:慢,浪费资源,
场景:新增从节点的时候,或者redis重启的时候
增量复制
原理:主从节点重新连接后,主节点将断开后写入的命令给从节点。利用缓存区的偏移量来完成的
优缺点:快
场景:主从节点短暂断开后重新连接的时候
分布式锁
应用场景
创建同一笔交易的时候,如果redis中没有该锁,则在redis中添加锁,并设置相应的过期时间。
分布式锁特征
互斥性: 只能有一个客户端能持有锁
锁超时释放: 在创建锁的时候添加了过期时间,到点释放,防止死锁
可重入性: 一个线程获取了锁之后,可以对其再次加锁
安全性: 锁只能被持有的客户端删除
高可用,高性能: 加锁,开锁都需要开销尽可能降低,同时保证了高可用
如何避免死锁
设置合理的过期时间,到期后会自动释放锁
在finally中释放锁,将业务逻辑写入try代码块中,无论是否有异常都会释放锁
延续锁时间,在业务执行过程中定期延长锁时间
redis数据结构是<key,value>。key是string类型,value有以下几种
String
用法:存j.set(key,value),取get(key)
场景:分布式锁,计数器
List
用法:存j.lpush(key,value,value,...);取j.range(key,开始下标,结束下标
场景:消息队列,生产者将任务添加到列表头部,消费者从列表尾部取出任务
Set
用法:存sadd(key,value,value...),取smembers(key),
场景:
ZSet
子主题
场景:排行榜,热点排序
Hash
用法:存:hset
场景:用户数据,数据字典
缓存/淘汰策略
内存淘汰
内存不足时将部分数据删除,等再次查询时更新入缓存。
超时删除
key设置了失效时间,到期后会自动删除
自动更新
当数据库变更时自动更新redis缓存,并设置失效时间
三大缓存问题
缓存穿透
穿透场景
同一数据进行恶意攻击:查询的数据在redis和数据库中都不存在,则redis中的key永远不生效,就会持续像数据库发送多次请求,导致数据库压力变大
怎么处理
1:缓存空对象,查询数据库为空时,将空缓存在redis中,设置过期时间,有效防止缓存穿透,缺点:短时数据不一致
2:做好校验,防止垃圾数据查询
3:加强id的复杂性,避免被猜测到id规律
添加布隆过滤器:筛选掉不存在的key
缓存雪崩
雪崩场景
同一时间大量key失效或者redis服务宕机,大量数据访问数据库,导致的数据库压力变大
怎么处理
1:给不同的key设置不同的过期时间。
2:利用redis集群提高服务可用性,
缓存击穿
击穿场景
热点key,且重建业务比较复杂的key突然失效,无数请求会访问数据库,导致数据库压力变大
怎么处理
1:添加互斥锁。优缺点:没有额外内存消耗,简单。。但是线程要等待,性能受影响,可能会有死锁
2:逻辑过期设置为永不过期
互斥锁
1:互斥锁【多次请求尝试重建,添加互斥锁,有一个尝试重建,其他的就不进行重建:1:线程一查询缓存未命中,2:首先获取互斥锁,3:然后查询数据库重建缓存数据,4:然后写入缓存,5:释放锁。然后在线程一未释放互斥锁之前,线程二去查询缓存未命中,然后去获取互斥锁失败,进行休眠,后续再去重新查询缓存。 但是如果同时间段大量查询线程涌入等待,性能就会比较差】
0 条评论
下一页