全局唯一ID
自动生成的id有局限性:
id的规律性太明显受表单数据量的限制
全局ID生成器
特点:
唯一性高可用与高性能递增性安全性
使用32位来生成id
缓存穿透
返回一个 “” 回redis
缓存雪崩
描述: 当多个缓存键同时到期,可能导致大量的请求同时访问数据库,从而导致数据库崩溃。解决策略:
随机设置过期时间:给每个缓存键设置一个随机的过期时间,避免多个键同时过期。(本文暂时利用此方法缓解雪崩问题)双层缓存:使用两层缓存,一层过期时间稍长,另一层过期时间稍短。当短的过期时,从长的获取数据,并异步更新长缓存中的数据。预热缓存:在某些键即将过期前,预先从数据库中加载数据到缓存。使用熔断机制:在数据库压力过大时,暂时停止部分或所有请求,等待系统恢复。
缓存击穿
缓存击穿问题也叫热点key问题,就是一个被高并发访问并且缓存重建业务较复杂的key突然失效了,无数的请求访问会在瞬间给数据库带来巨大的冲击
常见的解决方案有两种:
互斥锁逻辑过期
互斥锁与逻辑过期
超卖问题
悲观锁与乐观锁
乐观锁: 不加锁,在更新的时候判断是否有其他线程在修改
CAS法: 先查询库存,更新时在where中加入条件库存是否被改动过,先查询,再更新 跟新的时候判断 version 是否为刚才查到的version 判断是否有人改动
改进 在where中添加条件 id > 0
优点: 性能好缺点: 存在成功率低的问题
Spring框架事务失效,aop事务代理,synchronized锁对象
一人一单
分布式锁
分布式锁: 满足分布式系统或集群模式下多进程可见并且互斥的锁
分布式锁的实现:
基于Redis的分布式锁
误删问题
存在的问题,当业务还未处理完,超过了超时时间,下一个线程获取锁后,又被上一个线程将锁删除
判断锁标示与释放锁不是原子操作
使用lua脚本将 判断锁标识与释放锁 合并为原子操作
锁的标识可以使用 UUID + 线程id
RedisTemplate调用lua脚本的API:
execute(RedisScript
return scriptExecutor.execute(script,keys,args);
}
基于Redis的分布式锁优化
基于setnx实现的分布式锁存在下面的问题:
不可重入不可重试超时释放主从一致性
Redisson
Redisson入门
Redisson可重入锁原理
使用hash存储锁
Key 存 lock名,field 存储标识,value 存储重入次数, 为0 删除锁
获取锁:
释放锁:
Redisson分布式锁原理
可重入: 利用hash结构记录线程id和重入次数可重试: 利用信号量和PubSub功能实现等待、唤醒,获取锁失败的重试机制超时续约: 利用watchDog,每隔一段时间(releaseTime / 3),重置超时时间
Redisson的multiLock
Redis秒杀优化
消息队列
基于List结构模拟消息队列
基于PubSub的消息队列
基于Stream的消息队列
基于Stream的消息队列-XREAD
正常读取模式:
阻塞读取模式:
Stream类型消息队列的XREAD命令特点
消息可回溯一个消息可以被多个消费者读取可以阻塞读取有消息漏镀的风险
基于Stream的消息队列-消费者组
消费者组(Consumer Group): 将多个消费者划分到一个组中,监听同一个队列.
特点:
创建消费者组
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
探店笔记
tb_blog: 探店笔记表,包含笔记的标题,文字,图片等
tb_blog_comments: 其他用户对探店笔记的评价
点赞
共同关注: hset
Feed流
feed流的滚动分页
GEO数据结构
地理位置信息
用户签到
BitMap(位图)
分布式缓存
单点Redis的问题
数据丢失问题 — 实现Redis数据持久化并发能力问题 — 搭建主从集群,实现读写分离故障恢复问题 — 利用Redis哨兵,实现健康检测和自动恢复存储能力问题 — 搭建分片集群,利用插槽机制实现动态扩容
Redis的持久化
RDBAOF
Redis主从
搭建主从架构主从数据同步原理
Redis的哨兵机制
哨兵的作用和原理搭建哨兵集群RedisTemplate的哨兵模式
RedisTemplate的哨兵模式
监听Redis_Sentinal
Redis分片集群
搭建分片集群
散列插槽
集群伸缩
故障转移
数据迁移
RedisTemplate访问分片集群
多级缓存
JVM进程缓存
Lua语法入门
多级缓存
安装OpenRestry
OpenRestry快速入门请求参数处理
查询Tomcat
Redis缓存预热
缓存预热:
查询Redis缓存
Nginx本地缓存
开启nginx本地缓存
缓存同步策略
数据同步策略
安装Canal监听Canal
Redis的最佳实践
Redis键值设计
优雅的key结构
拒绝BigKey
恰当的数据类型
对象存储
总结:
批处理优化
Pipeline
集群下的批处理
服务端优化
持久化配置
慢查询
命令及安全配置
内存配置
集群最佳实践
Redis原理篇
数据结构
动态字符串SDS
IntSet
Dict
Dict的扩容
ZipList
QuickList
SkipList
RedisObject
五种数据结构
String
List
Set
ZSet
网络模型
通信协议
内存策略
相关链接
发表评论