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


相关文章
|
15天前
|
架构师 数据库
秒杀的理解
秒杀系统需解决并发读写问题,核心在于减少用户请求数据量、路径和依赖,并确保高可用、一致性与高性能。架构设计需遵循“稳、准、快”原则,保障系统稳定运行、数据准确及响应迅速。专栏将围绕高性能、一致性与高可用展开,探讨数据分离、库存控制与兜底方案等关键技术。
|
15天前
|
存储 算法 Sentinel
熔断降级
本内容介绍了微服务中熔断降级的实现原理及Sentinel的底层机制。通过OpenFeign集成Sentinel,利用断路器统计异常和慢请求比例,触发熔断并降级,提升系统稳定性。还讲解了Sentinel使用的限流算法,如滑动窗口、令牌桶和漏桶算法,以应对不同场景下的流量控制需求。
|
16天前
|
安全 Java 开发者
杂项2
本文介绍了Java编程中的多个实用知识点,涵盖集合操作、循环控制、Map遍历、类型安全、多线程等内容。包括不可变列表、集合添加判断、死循环登录验证、Map键值对遍历方式、链式调用的潜在问题、泛型类型擦除处理、增强for循环应用、列表合并与去重方法、输入流读取机制、asList的使用特点以及多线程Callable和FutureTask的协作执行流程,适用于Java开发者提升编码技巧和理解底层机制。
|
16天前
|
Java
初识线程
在 Java 多线程编程中,线程对象名与线程名称是两个不同概念。对象名是代码中引用线程对象的变量名,如 `t1`,而线程名称是线程实例在 JVM 中的标识,可通过 `setName()` 或构造函数设置。若不显式设置,Java 会分配默认名称如 `Thread-0`。通过 `Thread.currentThread().getName()` 可获取当前执行线程的名称。
|
16天前
|
SQL C++
sql了解1
本文介绍了SQL中主键自增的特性,删除记录后自增序号的处理方式,以及DML操作(插入、更新、删除)的基本语法和示例。同时区分了DML与DQL的不同用途,并通过代码示例展示了如何正确使用`SELECT`语句查询数据。
|
16天前
|
SQL 数据库
sql了解2
本文介绍了SQL中多表连接查询的核心概念,包括内连接(取交集)、左外连接和右外连接(交集+单表全集)的用法及结果特征。同时讲解了子查询的不同形式(标量、列、行、子表),以及IN和BETWEEN操作符的区别和应用场景。此外,还说明了一对多关系中以“一”或“多”表为主对查询结果条数的影响,并通过示例展示了如何正确使用连接条件和子查询。
|
16天前
|
存储 JavaScript 前端开发
初始前端1
本文介绍了 Vue 组合式开发中使用 `ref` 实现响应式数据的方法,强调不依赖 `this`。内容包括创建 `.vue` 文件的模板结构、使用 `ref` 定义响应式变量(如 `count2.value`)与非响应式变量(如 `count3`)的区别,以及如何在模板中绑定数据。同时通过表格对比了 `ref` 在 JavaScript 和模板中的使用方式,指出在 JS 中需用 `.value` 操作数据,而在模板中可直接访问。最后以生活化的类比解释 `ref` 的作用,帮助开发者更好地理解响应式原理。
|
16天前
|
存储 前端开发 JavaScript
初始前端3
本文介绍了前端开发中的表单交互设计与数据绑定技巧,包括按钮点击事件处理、表单模型与实例的创建及使用、单向与双向数据绑定的区别与应用,以及表格数据展示等内容,适用于 Vue 框架下的 Element UI 组件实践。
|
16天前
|
Docker 容器
初始ollama
Ollama 按需加载模型,不持续运行,闲置时自动卸载,节省内存。模型响应请求时驻留内存,保留时间由 OLLAMA_KEEP_ALIVE 控制。类似 Docker 部署方式,但无单模型启停命令,默认时间内自动停止。可间接通过停止服务或配置多端口实现管理。
|
16天前
|
SQL Java 数据库连接
了解ORM
MyBatis与MyBatis-Plus区别在于:MyBatis是半自动ORM框架,需手动编写SQL,适合复杂查询场景;而MyBatis-Plus是其增强工具,提供零SQL的CRUD操作,简化开发流程,适用于简单增删改查场景,提升开发效率。