Redis-持久化-淘汰机制-IO策略

简介: Redis-持久化-淘汰机制-IO策略

六、Redis

1. redis为什么快

完全基于内存操作

数据结构简单,对数据操作简单

redis是单线程避免了上下文切换带来的性能问题,也不用考虑锁的问题

采用非阻塞的IO多路复用机制

edis不是完全多线程的,在核心的网络模型中是多线程的用来处理并发连接,但是数据的操作都是单线程。Redis坚持单线程是因为Redis的性能瓶颈是网络延迟而不是CPU,多线程对数据读取不会带来性能提升。

2. redis持久化机制

快照持久化RDB

bgsave 调用之后保存快照

save 根据配置保存 save 600 1 如果600秒执行了一条命令就持久化

redis的默认持久化机制,通过父进程fork一个子进程,子进程将redis的数据快照写入一个临时文件,等待持久化完毕后替换上一次的rdb文件。整个过程主进程不进行任何的io操作。持久化策略可以通过save配置单位时间内执行多少次操作触发持久化。所以RDB的优点是保证redis性能最大化,恢复速度数据较快,缺点是可能会丢失两次持久化之间的数据

追加文件持久化AOF

通过appendfsync配置

always 每个命令追加

everysec 每秒追加

no 丢给操作系统

只能使用everysec,always一次只能写入条指令,会引发严重的写入方法,导致固态硬盘寿命降低,no 很吃性能,redis会变慢,everysec基本和不开一样,几乎不影响性能

AOF一直追加会占用大量空间,需要做重写操作,压缩空间,但是重写依旧需要fork子线程,那么RDB持久化的问题在AOF中同样会出现

以日志形式记录每一次的写入和删除操作,策略有每秒同步、每次操作同步、不同步,优点是数据完整性高,缺点是运行效率低,恢复时间长

3. Redis如何实现key的过期删除?

定期删除 :Redis 每隔一段时间从设置过期时间的 key 集合中,随机抽取一些 key ,检查是否过期,如果已经过期做删除处理。

惰性删除 :Redis 在 key 被访问的时候检查 key 是否过期,如果过期则删除。

4. Redis数据类型应用场景

String:可以用来缓存json信息,可以用incr命令实现自增或自减的计数器

Hash:与String一样可以保存json信息

List:可以用来做消息队列,list的pop是原子性操作能一定程度保证线程安全

Set:可以做去重,比如一个用户只能参加一次活动 ;可以做交集求共友

SortSet :有序的。可以实现排行榜

5. Redis并发缓存三大问题

详解缓存雪崩、缓存击穿、缓存穿透问题,一文掌握,干货不断

6. Redis实现发布文章、点赞排序

仅一周内可以点赞,如果长期点赞,取消一个zset即可

需要的数据结构

一个hash存储文章信息 包括点赞

两个zset 一个存储文章发布时间 一个存储分数(每次点赞给一个分数,自定义,利于排序)

一个set存储投票过的用户 保证只能投票一次

发布流程

使用incr计数器创建文章id

sadd将文章发布者id添加到点赞集合,使用expire设置过期时间,一周后自动删除

HMSET存储文章信息到hash中

执行ZADD将文章放到两个zset中

点赞流程

点赞的时候,使用ZSCORE从zset获取发布时间

在一周内就使用SADD将用户添加到set

使用ZINVRBY对文章加分

使用HINCRBY对文章点赞更新+1

取出最高评分和最新发布文章

使用ZREVRANGE可以按照分值大小取出文章id

对每个id执行HGETALL,获取全部信息

分组功能

为每个分组添加一个set,在分组里面的文章id添加到set里面

扩展

ZINTERSTORE可以对两个集合取交集,获取最多点赞和最新发布的文章

如果要实现反对投票可以参考投票减少分值和点赞即可

暂时没有考虑事务问题

7. Redis的扩展数据类型

  • Bitmap:主要用来做二进制数据的统计(数据内容只有0/1状态);
  • HyperLogLog:主要用来统计海量的不重复数据数量;
  • GEO:主要用来保存经纬度数据。

8. 五种基本数据类型的底层实现

String 简单动态字符串

9. Redis事务

redis事务是将多个命令缓存起来,当发送exec命令时,依次执行缓存中的所有命令。redis的事务没有隔离级别,也不保证原子性,更不支持回滚操作。redis事务就是一次性、顺序性、排他性的执行一个队列中的一系列命令。

10. Redis淘汰策略与过期策略

过期策略

定时删除:将设置了TTL的key单独存放到一个字典,通过过期时间去访问是否达到删除时间,这里采用贪心算法,每次随机访问一些key,如果过期就删除,假设每次都遍历全部,那么很吃性能

惰性删除:当我访问key之前先判断是否应该删除。

定时删除会导致有些key应该删了但是没有删,所以使用惰性删除规避。不管是定期采样删除还是惰性删除都不是一种完全精准的删除,就还是会存在key没有被删除掉的场景,所以就需要内存淘汰策略进行补充。

淘汰策略

仅仅列举一些常见的策略

  • 加入键的时候如果过期,从所有key随机删除
  • 加入键的时候如果过期,从过期键从随机删除
  • 过期之后马上删除
  • 删除过期键中最少使用频率的
相关文章
|
6月前
|
NoSQL 安全 关系型数据库
Redis:持久化的两种方式
Redis持久化机制主要包括RDB和AOF两种方式。RDB通过生成数据快照进行持久化,支持手动或自动触发,具有加载速度快、文件紧凑等特点,但无法实时保存数据。AOF则记录每个操作命令,保障数据更安全,支持多种写入策略,并可通过重写机制优化文件大小。两者各有优劣,常结合使用以兼顾性能与数据安全。
|
6月前
|
存储 缓存 NoSQL
工作 10 年!Redis 内存淘汰策略 LRU 和传统 LRU 差异,还傻傻分不清
小富带你深入解析Redis内存淘汰机制:LRU与LFU算法原理、实现方式及核心区别。揭秘Redis为何采用“近似LRU”,LFU如何解决频率老化问题,并结合实际场景教你如何选择合适策略,提升缓存命中率。
867 3
|
6月前
|
存储 缓存 NoSQL
Redis持久化深度解析:数据安全与性能的平衡艺术
Redis持久化解决内存数据易失问题,提供RDB快照与AOF日志两种机制。RDB恢复快、性能高,但可能丢数据;AOF安全性高,最多丢1秒数据,支持多种写回策略,适合不同场景。Redis 4.0+支持混合持久化,兼顾速度与安全。根据业务需求选择合适方案,实现数据可靠与性能平衡。(238字)
|
7月前
|
存储 缓存 人工智能
Redis六大常见命令详解:从set/get到过期策略的全方位解析
本文将通过结构化学习路径,帮助读者实现从命令语法掌握到工程化实践落地的能力跃迁,系统性提升 Redis 技术栈的应用水平。
|
7月前
|
存储 NoSQL 算法
应对Redis中的并发冲突:有效解决策略
以上策略各有优劣:乐观锁和悲观锁控制得当时可以很好地解决并发问题;发布/订阅模式提高了实时响应能力;Lua脚本和Redis事务保证了命令序列的原子性;分布式锁适合跨节点的并发控制;限流措施和持久化配置从系统设计层面减少并发风险;数据分片通过架构上的优化减轻单个Redis节点的负担。正确选择适合自己应用场景的策略,是解决Redis并发冲突的关键。
360 0
|
9月前
|
存储 监控 NoSQL
流量洪峰应对术:Redis持久化策略与内存压测避坑指南
本文深入解析Redis持久化策略与内存优化技巧,涵盖RDB快照机制、AOF重写原理及混合持久化实践。通过实测数据揭示bgsave内存翻倍风险、Hash结构内存节省方案,并提供高并发场景下的主从复制冲突解决策略。结合压测工具链构建与故障恢复演练,总结出生产环境最佳实践清单。
352 9
|
10月前
|
缓存 NoSQL 算法
Redis数据库的键值过期和删除机制
我们需要注意的是,虽然Redis提供了这么多高级的缓存机制,但在使用过程中,必须理解应用的特性,选择合适的缓存策略,才能最大化Redis的性能。因此,在设计和实施应用程序时,理解应用的数据访问模式,以及这些模式如何与Redis的缓存机制相互作用,尤为重要。
314 24
|
9月前
|
消息中间件 监控 NoSQL
利用RabbitMQ与Redis实现消息的延迟传递的策略
这个系统就如同一个无懈可击的邮局,无论天气如何变换,它都能确保每一封信准时送达。通过巧妙地运用RabbitMQ的DLX和Redis的Sorted Sets,我们搭建了一座桥梁,让即时和延迟消息的传递高效且无缝对接。
165 3
|
存储 NoSQL 安全
Redis的两种持久化方式---RDB、AOF
通过本文的介绍,我们详细讲解了Redis的两种主要持久化方式:RDB和AOF。每种方式都有其独特的优缺点和适用场景。在实际应用中,可以根据具体需求选择合适的持久化方式,或者同时启用RDB和AOF,以达到最佳效果。希望本文能帮助您更好地理解和应用Redis的持久化机制,构建高效、可靠的数据存储解决方案。
1198 79
|
NoSQL Redis
Redis的数据淘汰策略有哪些 ?
Redis 提供 8 种数据淘汰策略: 淘汰易失数据(具有过期时间的数据) 1. volatile-lru(least recently used):从已设置过期时间的数据集(server.db[i].expires)中挑选最近最少使用的数据淘汰 2. volatile-lfu(least frequently used):从已设置过期时间的数据集(server.db[i].expires)中挑选最不经常使用的数据淘汰 3. volatile-ttl:从已设置过期时间的数据集(server.db[i].expires)中挑选将要过期的数据淘汰 4. volatile-random:从已设置过期