redis杂项

简介: Redis基于内存、IO多路复用,读写高效;虽主为单线程,但支持多线程读写及持久化。常用数据类型如string、hash、list、set、zset适用于多种场景。为提升性能,常搭配本地缓存(如Caffeine)形成二级缓存架构。为保证Redis与MySQL一致性,可采用加锁、MQ或延迟双删策略。Redis支持多种淘汰策略及持久化方式(RDB/AOF),兼顾性能与数据安全。

Redis为什么快

  • 基于内存
  • NIO:IO多路复用
  • Redis是单线程吗?
  • 不是,对于读写线程来说是单线程,但是Redis本身还会做持久化,这些是多线程
  • 另外,新版本Redis已经支持多线程的读写

本地数据库+Redis的缓存,我们一般称之为:一级缓存,除此之外还有二级缓存

  • 本地缓存 + 分布式缓存,如
  • Caffeine/Guava/Ehcache + Redis/Memcached
  • 常用的二级缓存架构:Caffeine+Redis,这种适合非常高的读低频的写
  • 二级缓存本质上就是用两个非关系型的数据库

redis常见的数据类型

redis中的五种数据类型以及应用场景

string:啥都能存,就是最基本的键值对 (key:啊 value :ss)

hash   存储对象信息,购物车(商品,名字,销量)   (大key 小key value)

list:浏览记录,朋友圈   (左边插入,右边弹出)

set:点赞收藏 (去重)(意思就是点赞过就不能再点了,本质数据只存储一次)

zset:排行榜:游戏积分榜(game:rank 中,用户A → 90分用户B → 80)(key member score )

  • 除此之外还有几种高级的数据结构
  • 用来签到的bitmap,做网站点击、访问量统计的hyperloglog,用来做地理坐标检索的geo

怎么保证双写一致性?怎么保证数据一致性?怎么保证Redis和MySQL的一致性?

加锁(强一致性)、MQ(最终一致性)

除了上述方案,还有一个非常经典的解决方案:延迟双删(最终一致性)

  • 强一致性:优先事务(本地 / 分布式),适合金融、支付等核心场景(牺牲性能)。
  • 最终一致性:优先异步补偿 + 过期时间,适合社交、电商等非核心场景(兼顾性能)。
  • Redis 与 MySQL 的一致性:推荐 “Cache Aside + 先更 MySQL 再删 Redis + 延迟双删 + 过期时间”,平衡一致性与性能。

方案二:

一致性要求不高,不做处理

时效性数据,设置过期时间

,一致要求高时效性不那么高的可以使用MQ(异步)

时效性和一致性要求比较高的,使用分布式事务,seata的tcc模式

数据淘汰策略

8种:noeviction :不淘汰任何的key,内存满不允许写入会报错, 默认的

volatile-ttl:对设置ttl的key,比较key的ttl剩余值,ttl越小先被淘汰

allkeys-random:对全体key,随机淘汰

volatile-random :对设置了ttl的key随机淘汰

allkeys-lru:对全体的key 基于lru算法淘汰(最近最少使用)

volatile-lru:对设置ttl的key 基于lru算法淘汰(最近最少使用)

allkeys-lfu:对全体的key 基于lfu算法淘汰(最少使用频率)

volatile-lfu:对设置ttl 的key 基于lfu算法淘汰(最少使用频率)

场景:

有冷热数据区分:优先使用allkeys-lru,确保热点数据留在缓存中(allkeys-lfu不使用的原因:频率不一定代表热点)

Redis持久化策略

RDB(全量)快照文件,把内存中的所有数据记录到磁盘中,主要命令save(主进程执行),bgsave(子进程执行,直接fork 主线程)fork过程中采用copy-on-write,技术,读操作读取共享内存,写操作在副本,最终由子进程写入磁盘

AOF(增量  )追加文件,记录每一次的执行命令,默认关闭

RDB是二进制文件,体积小,恢复比较快,但是会丢失数据

AOF恢复速度慢,丢失数据风险小,可以设置刷盘策略(always(同步,性能影响大)、everysec(最多丢失1秒,常用)、no(操作系统控制)

数据过期策略(Redis)

两种:

一个是惰性删除,当需要对应的key时先去检查key是否过期,过期则删除,只有需要时才检查

定期删除

两种:slow模式 定时任务 执行频率是10hz 每次不超过25ms 可通过修改配置文件进行调整 fast模式 执行频率不固定,两次间隔不超过2毫秒,每次耗时不超过1ms


相关文章
|
4月前
|
架构师 数据库
秒杀的理解
秒杀系统需解决并发读写问题,核心在于减少用户请求数据量、路径和依赖,并确保高可用、一致性与高性能。架构设计需遵循“稳、准、快”原则,保障系统稳定运行、数据准确及响应迅速。专栏将围绕高性能、一致性与高可用展开,探讨数据分离、库存控制与兜底方案等关键技术。
|
4月前
|
消息中间件 存储 缓存
再次了解kafka
Kafka通过offset机制解决消息重复消费问题,支持手动提交偏移量及唯一ID去重。它保证分区内的消息顺序消费,结合集群、副本与重平衡实现高可用。高性能设计包括顺序读写、分区、页缓存、零拷贝等。数据清理依赖保留时间或大小策略,点对点和发布订阅模式则通过消费者组实现。
|
4月前
|
消息中间件 NoSQL Java
延时实现
本节介绍了多种关闭过期订单的实现方案,包括定时任务、JDK延迟队列、Redis过期监听、Redisson延迟队列、RocketMQ延迟消息及RabbitMQ死信队列。各自优缺点明显,适用于不同业务场景,如定时任务适合小数据量,RocketMQ适合高并发解耦场景,而Redisson则使用简单且高效。选择时需综合考虑系统复杂度、数据量及可靠性要求。
|
4月前
|
存储 缓存 Linux
CPU上下文切换的原理及其在系统调用和进程切换中的应用
本内容深入解析了CPU上下文切换的原理及其在系统调用和进程切换中的应用。详细说明了CPU寄存器、程序计数器在任务切换中的作用,以及系统调用与进程上下文切换的区别。同时探讨了上下文切换带来的性能开销,涉及TLB和虚拟内存管理机制,帮助理解操作系统如何高效调度进程。
|
4月前
|
存储 算法 Sentinel
熔断降级
本内容介绍了微服务中熔断降级的实现原理及Sentinel的底层机制。通过OpenFeign集成Sentinel,利用断路器统计异常和慢请求比例,触发熔断并降级,提升系统稳定性。还讲解了Sentinel使用的限流算法,如滑动窗口、令牌桶和漏桶算法,以应对不同场景下的流量控制需求。
|
4月前
|
Docker 容器
初始ollama
Ollama 按需加载模型,不持续运行,闲置时自动卸载,节省内存。模型响应请求时驻留内存,保留时间由 OLLAMA_KEEP_ALIVE 控制。类似 Docker 部署方式,但无单模型启停命令,默认时间内自动停止。可间接通过停止服务或配置多端口实现管理。
|
4月前
|
负载均衡 网络性能优化
了解EMQ
EMQ通过MQTT协议的QoS机制保障消息可靠传输,支持QoS 0、1、2三个等级,分别实现消息最多一次、至少一次和恰好一次传递。对于延迟消息,EMQ X支持通过特殊主题前缀`$delayed/{DelayInterval}`实现延迟发布。点对点通信可通过不带群组的共享订阅(如`$queue/t/1`)实现,结合负载均衡策略如随机、轮询等,确保消息仅由一个订阅者接收;发布订阅模式则通过带群组的共享订阅(如`$share/组名称/t/1`)实现,确保每组一个订阅者收取消息。
|
4月前
|
SQL Java 数据库连接
事务的七种传播行为及其应用场景
本文介绍了事务的七种传播行为及其应用场景,包括 PROPAGATION_REQUIRED、PROPAGATION_SUPPORTS、PROPAGATION_REQUIRES_NEW 等,帮助开发者理解事务管理机制。同时讲解了 Java 中 SQL 操作与对象数据不同步的问题,强调重新查询与手动管理的必要性,并说明 MyBatis 批量操作的最佳实践。
|
4月前
|
SQL JavaScript Java
三层架构理解(实现前后端分离)
本文介绍了三层架构实现前后端分离的流程,从前端Vue发起请求,到后端Spring处理数据,最后返回结果并由前端渲染展示。同时详细解析了Bean重复问题的解决方案,包括使用@Service、@Primary、@Qualifier和@Resource注解进行依赖注入控制。此外还介绍了MyBatis中#{}与${}的区别及使用场景,以及三层架构中各组件的协作方式。
|
4月前
|
XML JSON Java
Spring框架中常见注解的使用规则与最佳实践
本文介绍了Spring框架中常见注解的使用规则与最佳实践,重点对比了URL参数与表单参数的区别,并详细说明了@RequestParam、@PathVariable、@RequestBody等注解的应用场景。同时通过表格和案例分析,帮助开发者正确选择参数绑定方式,避免常见误区,提升代码的可读性与安全性。