Redis

全局唯一ID

自动生成的id有局限性:

  • id的规律性太明显
  • 受表单数据量的限制

全局ID生成器

特点:

  • 唯一性
  • 高可用与高性能
  • 递增性
  • 安全性

使用32位来生成id

image-20231115175802437

缓存穿透

返回一个 “” 回redis

缓存雪崩

  1. 描述: 当多个缓存键同时到期,可能导致大量的请求同时访问数据库,从而导致数据库崩溃。
  2. 解决策略:
    1. 随机设置过期时间给每个缓存键设置一个随机的过期时间,避免多个键同时过期。(本文暂时利用此方法缓解雪崩问题)
    2. 双层缓存:使用两层缓存,一层过期时间稍长,另一层过期时间稍短。当短的过期时,从长的获取数据,并异步更新长缓存中的数据。
    3. 预热缓存:在某些键即将过期前,预先从数据库中加载数据到缓存。
    4. 使用熔断机制:在数据库压力过大时,暂时停止部分或所有请求,等待系统恢复。

缓存击穿

缓存击穿问题也叫热点key问题,就是一个被高并发访问并且缓存重建业务较复杂的key突然失效了,无数的请求访问会在瞬间给数据库带来巨大的冲击

常见的解决方案有两种:

  • 互斥锁
  • 逻辑过期

互斥锁与逻辑过期

image-20231111231420235

超卖问题

image-20231116002853739

image-20231116003121081

悲观锁与乐观锁

乐观锁: 不加锁,在更新的时候判断是否有其他线程在修改

CAS法: 先查询库存,更新时在where中加入条件库存是否被改动过,先查询,再更新 跟新的时候判断 version 是否为刚才查到的version 判断是否有人改动

改进 在where中添加条件 id > 0

  • 优点: 性能好
  • 缺点: 存在成功率低的问题

Spring框架事务失效,aop事务代理,synchronized锁对象

一人一单

image-20231116013054225

分布式锁

分布式锁: 满足分布式系统或集群模式下多进程可见并且互斥的锁

image-20231116142725284

分布式锁的实现:

image-20231116150346644

基于Redis的分布式锁

image-20231116152440360

误删问题

存在的问题,当业务还未处理完,超过了超时时间,下一个线程获取锁后,又被上一个线程将锁删除

image-20231116155430032

判断锁标示与释放锁不是原子操作

image-20231116160544682

使用lua脚本将 判断锁标识与释放锁 合并为原子操作

锁的标识可以使用 UUID + 线程id

RedisTemplate调用lua脚本的API:

execute(RedisScript<T> script, List<K> keys,Object... args){
  return scriptExecutor.execute(script,keys,args);
}

image-20231116230519969

基于Redis的分布式锁优化

基于setnx实现的分布式锁存在下面的问题:

  1. 不可重入
  2. 不可重试
  3. 超时释放
  4. 主从一致性

image-20231118182258804

Redisson

image-20231118182438845

Redisson入门

image-20231118183129541

image-20231118184149047

Redisson可重入锁原理

使用hash存储锁

Key 存 lock名,field 存储标识,value 存储重入次数, 为0 删除锁

获取锁:

image-20231118190059431

释放锁:

image-20231118190149513

image-20231118193159457

Redisson分布式锁原理

  • 可重入: 利用hash结构记录线程id和重入次数
  • 可重试: 利用信号量和PubSub功能实现等待、唤醒,获取锁失败的重试机制
  • 超时续约: 利用watchDog,每隔一段时间(releaseTime / 3),重置超时时间

Redisson的multiLock

image-20231118231416338

Redis秒杀优化

消息队列

image-20231119002640354

image-20231121171950171

基于List结构模拟消息队列

image-20231121172720603

image-20231121172702413

基于PubSub的消息队列

image-20231121173050913

image-20231121174014912

基于Stream的消息队列

image-20231121182224903

基于Stream的消息队列-XREAD

正常读取模式:

image-20231121182432973

阻塞读取模式:

image-20231121182642724

Stream类型消息队列的XREAD命令特点

  • 消息可回溯
  • 一个消息可以被多个消费者读取
  • 可以阻塞读取
  • 有消息漏镀的风险

基于Stream的消息队列-消费者组

消费者组(Consumer Group): 将多个消费者划分到一个组中,监听同一个队列.

特点:

image-20231113224438595

创建消费者组

XGROUP CREATE key groupName ID [MKSTERM]

  • key: 队列名称
  • groupName: 消费者组名称
  • ID: 起始ID标示, $ 代表队列中的最后一个消息, 0 则代表队列中第一个消息
  • MKSTERM: 队列不存在时自动创建队列
# 删除指定的消费者组
XGROUP DESTORY key groupName

# 给指定的消费者组添加消费者
XGROUP CREATECONSUMER key groupname consumername

# 删除消费者组中的指定消费者
XGROUP DELCONSUMER key groupname consumername

image-20231121183906053

image-20231121190925744

image-20231121191315150

image-20231121191920697

image-20231121192545448

探店笔记

tb_blog: 探店笔记表,包含笔记的标题,文字,图片等

tb_blog_comments: 其他用户对探店笔记的评价

点赞

共同关注: hset

Feed流

image-20231124183022165

feed流的滚动分页

GEO数据结构

地理位置信息

用户签到

BitMap(位图)

分布式缓存

单点Redis的问题

  1. 数据丢失问题 — 实现Redis数据持久化
  2. 并发能力问题 — 搭建主从集群,实现读写分离
  3. 故障恢复问题 — 利用Redis哨兵,实现健康检测和自动恢复
  4. 存储能力问题 — 搭建分片集群,利用插槽机制实现动态扩容

Redis的持久化

  • RDB
  • AOF

image-20231127150351591

Redis主从

  • 搭建主从架构
  • 主从数据同步原理

image-20231127180022570

image-20231127185852491

image-20231127185823734

image-20231127191319209

image-20231127191722166

image-20231127191806904

Redis的哨兵机制

  • 哨兵的作用和原理
  • 搭建哨兵集群
  • RedisTemplate的哨兵模式

image-20231127200421013

image-20231127193244626

image-20231127193320898

image-20231127193426425

image-20231127200319291

RedisTemplate的哨兵模式

监听Redis_Sentinal

Redis分片集群

  • 搭建分片集群

image-20231127232231157

  • 散列插槽

image-20231128183530067

  • 集群伸缩

image-20231128223620053

  • 故障转移

image-20231128224648039

数据迁移

image-20231128225320065

  • RedisTemplate访问分片集群

image-20231128225459698

多级缓存

image-20231129000135261

image-20231129180918165

JVM进程缓存

image-20231129181634693

image-20231129182925548

image-20231129183039301

image-20231129183111886

Lua语法入门

image-20231129190800037

image-20231129194444381

image-20231129194525341

image-20231129200242969

image-20231129223120481

多级缓存

  • 安装OpenRestry

image-20231129223928152

  • OpenRestry快速入门
  • 请求参数处理

image-20231129232642734

  • 查询Tomcat

image-20231130002929755

image-20231130003219334

image-20231130003837076

image-20231130130952668

  • Redis缓存预热

image-20231130132308218

缓存预热:

image-20231130132326766

image-20231130132347076

image-20231130184916652

  • 查询Redis缓存

image-20231130132700736

image-20231130134001479

  • Nginx本地缓存

开启nginx本地缓存

image-20231130184400383

image-20231130184517281

缓存同步策略

  • 数据同步策略

image-20231130193453324

image-20231130193352405

image-20231130193413009

image-20231130194446728

image-20231130194457027

  • 安装Canal
  • 监听Canal

image-20231130195229172

image-20231130195440905

image-20231130195914167

image-20231130225858730

Redis的最佳实践

Redis键值设计

  • 优雅的key结构

image-20231130231518835

  • 拒绝BigKey

image-20231201001504858

image-20231130232446985

image-20231201001546630

image-20231201001611771

  • 恰当的数据类型

对象存储

image-20231201002121632

image-20231201002838415

image-20231201002944183

image-20231201002742249

总结:

image-20231201003026509

批处理优化

image-20231201132633542

image-20231201132702923

image-20231201123152996

  • Pipeline

image-20231201124037248

  • 集群下的批处理

image-20231201135938041

image-20231201135150054

服务端优化

  • 持久化配置

image-20231201210640765

  • 慢查询

image-20231201211823769

image-20231201211941643

image-20231201223756937

  • 命令及安全配置

image-20231201225352885

image-20231201225404601

  • 内存配置

image-20231201225917632

image-20231201232057776

image-20231201231044092

集群最佳实践

image-20231202010400931

image-20231202011518145

image-20231202005713311

Redis原理篇

数据结构

动态字符串SDS

image-20231202155437670

image-20231202161124666

image-20231202161406668

image-20231202161516538

IntSet

image-20231202164744302

image-20231202171841580

image-20231202171921901

Dict

image-20231202173044701

image-20231202174554173

image-20231202174621145

image-20231202174107853

Dict的扩容

image-20231202175358072

image-20231202181710770

image-20231202184237409

image-20231202183741553

ZipList

image-20231202231605537

image-20231202231749745

image-20231202185839131

image-20231202191326728

image-20231202225333802

image-20231202230617092

image-20231202230651019

QuickList

image-20231203011419405

image-20231203011537685

image-20231203012651014

image-20231203012927291

image-20231203013014209

image-20231203013051720

SkipList

image-20231203014057801

image-20231203184553612

image-20231203184723275

image-20231203184840940

RedisObject

image-20231203190243155

image-20231203190343941

image-20231203190437679

五种数据结构

String

image-20231203191602688

image-20231203190900221

image-20231203191541963

image-20231203191431827

List

image-20231203192245988

image-20231203193506926

image-20231203193540752

Set

image-20231203194542539

ZSet

image-20231203201815020

网络模型

通信协议

内存策略

  • 20
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值