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