学习【Redis实战篇】这一篇就够了

目录

  • 1. 短信登录
    • 1-1. 技术点
      • redis存储token
      • 拦截器刷新token有效期
    • 1-2. 业务
      • 登录注册
  • 2. 商户查询缓存
    • 1-1. 技术点
      • 缓存更新策略
      • 缓存穿透
      • 缓存雪崩
      • 缓存击穿
    • 1-2. 业务
      • 查询缓存的商铺信息
  • 3. 优惠卷秒杀
    • 3-1. 技术点
      • 全局唯一ID
      • 乐观锁
      • 基于Redis实现分布式锁
      • 基于Redisson实现分布式锁
      • Redisson实现可重入锁的原理
      • Redisson实现锁重试和WatchDog机制的原理
      • Redisson的multiLock
      • Redis消息队列实现异步秒杀
    • 3-2. 业务
      • 超卖问题
      • 一人一单问题
      • 一人一单并发安全问题
      • 调用lua脚本保证查询和删除锁原子性
    • 3-3. 小技巧
      • 解决事务失效的3种方法
  • 4. 达人探店
    • 4-1. 技术点
      • 利用Redis的SortedSet结构记录点赞的用户id,实现点赞排行榜
      • 数据库返回按 list 集合顺序的元素
    • 4-2. 业务
      • 发布文章
      • 文章点赞
      • 点赞排行榜
  • 5. 好友关注
    • 5-1. 技术点
      • 利用 set 求交集获取共同关注好友
      • Feed流推送
    • 5-2. 业务
      • 关注取关
      • 共同关注
      • 关注推送
  • 6. 附近的商户
    • 6-1. 技术点
      • GEO数据结构的使用
    • 6-2. 业务
      • 使用GEO查询附近的商户
  • 7. 用户签到
    • 7-1. 技术点
    • 7-2. 业务
      • 利用位图记录签到
      • 统计连续签到次数
  • 8. UV统计
    • 8-1. 技术点
    • 8-2. 业务
      • 利用 HyperLogLog 统计 UV

1. 短信登录

1-1. 技术点

redis存储token

拦截器刷新token有效期

1-2. 业务

登录注册

2. 商户查询缓存

1-1. 技术点

缓存更新策略

在这里插入图片描述

在这里插入图片描述

缓存穿透

缓存穿透是指客户端请求的数据在缓存中和数据库中都不存在,这样缓存永远不会生效,这些请求都会打到数据库

解决方案:

  • 缓存空对象
  • 布隆过滤器

缓存雪崩

缓存雪崩是指在同一时段大量的缓存key同时失效或者Redis)服务宕机,导致大量请求到达数据库,带来巨大压力。

解决方案:

  • 给不同的Key的TTL添加随机值
  • 利用Redis集群提高服务的可用性
  • 给缓存业务添加降级限流策略
  • 给业务添加多级缓存

缓存击穿

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

解决方案:

  • 互斥锁
    • setnx
  • 逻辑过期

1-2. 业务

查询缓存的商铺信息

3. 优惠卷秒杀

3-1. 技术点

全局唯一ID

在这里插入图片描述

全局唯一D生成策略:

  • UUID
  • Redis自增
  • snowflake算法
  • 数据库自增

Redis自增ID策略:

  • 每天一个key,方便统计订单量
  • ID构造是时间戳+计数器

乐观锁

版本号实现方案:在修改数据的时候,判断版本号是否和之前查询到的版本号一致。

cas实现方案:不再使用版本号,而是用查询出来的数据代替版本号。根据查询出来的数据再来判断是否可以进行修改,如果一致则可以修改。

基于Redis实现分布式锁

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

分布式锁的实现方案:

在这里插入图片描述

基于Redis的分布式锁实现思路:

  • 利用set nx ex获取锁,并设置过期时间,保存线程标示
  • 释放锁时先判断线程标示是否与自己一致,一致则删除锁。(编写lua脚本保证2个操作的原子性)

特性:

  • 利用set nxi满足互斥性
  • 利用set ex保证故障时锁依然能释放,避免死锁,提高安全性
  • 利用Redis集群保证高可用和高并发特性

基于Redisson实现分布式锁

Redisson是一个基于Redis实现的分布式工具,它提供了一系列的分布式服务、分布式数据结构、分布式锁等。

Redisson分布式锁原理:

  • 可重入:利用hash结构记录线程id和重入次数

  • 可重试:利用信号量和发布订阅功能实现等待、唤醒,获取锁失败的重试机制

  • 超时续约:利用watchDog(就是一个定时任务),每隔一段时间(releaseTime / 3),重置锁的超时时间

Redisson实现可重入锁的原理

其实现原理和 JDK 的 ReentrantLock 类似。

实现原理:

1、尝试获取锁时

  • 首先判断该锁是否存在,如果存在,再判断该锁是否是自己的,不是自己的则获取锁失败,如果是自己的,则将该锁的计数 + 1 并重置锁的有效期。利用hash结构记录线程id和可重入次数。
  • 如果锁不存在,则成功获取锁,锁的计数 + 1,设置锁的有效期。

2、尝试释放锁时

  • 首先判断该锁是否是自己的,如果不是自己的,则不用释放。
  • 如果是自己获取的锁,则将该锁的计数 - 1。之后判断锁的计数是否为 0,如果为0,则释放锁,不为0, 则重置锁的有效期。

分别用 lua 脚本来编写上面尝试获取锁和释放锁的语句,保证原子性。

在这里插入图片描述

Redisson实现锁重试和WatchDog机制的原理

锁重试

  • 尝试获取锁时,首先判断锁的 ttl 是否过期,如果过期了,则获取锁成功。如果获取锁时没有设置锁的过期时间,则会开启 WatchDog(一个定时任务,定时刷新锁的过期时间)。
  • 尝试获取锁时,锁还没有过期,则会订阅并等待锁的释放信息。
  • 当释放锁时,会发布释放信息,并取消 WatchDog

WatchDog

  • 一个定时任务,定时刷新锁的过期时间

在这里插入图片描述

Redisson的multiLock

  • 原理:多个独立的Redis节点,必须在所有节点都获取重入锁,才算获取锁成功
  • 缺陷:运维成本高、实现复杂

Redis消息队列实现异步秒杀

消息队列(Message Queue),字面意思就是存放消息的队列。最简单的消息队列模型包括3个角色:

  • 消息队列:存储和管理消息,也被称为消息代理(Message Broker)
  • 生产者:发送消息到消息队列
  • 消费者:从消息队列获取消息并处理消息

Redis提供了三种不同的方式来实现消息队列:

  • list数据结构:基于List结构模拟消息队列
  • PubSub:基本的点对点消息模型
  • Stream数据结构:比较完善的消息队列模型

在这里插入图片描述

基于List的消息队列有哪些优缺点?

优点

  • 利用Redis存储,不受限于JVM内存上限
  • 基于Redis的持久化机制,数据安全性有保证
  • 可以满足消息有序性

缺点:

  • 无法避免消息丢失
  • 只支持单消费者

基于PubSub的消息队列

在这里插入图片描述

基于PubSub的消息队列有哪些优缺点?

优点:

  • 采用发布订阅模型,支持多生产、多消费

缺点:

  • 不支持数据持久化
  • 无法避免消息丢失
  • 消息堆积有上限,超出时数据丢失

在这里插入图片描述

3-2. 业务

超卖问题

在这里插入图片描述

乐观锁实现方案:

  • 版本号,修改数据的时候判断和之前查询的版本号是否一致。
  • CAS法,不再使用版本号,而是用查询出来的数据代替版本号。根据查询出来的数据再来判断是否可以进行修改,如果一致则可以修改。

在这里插入图片描述

一人一单问题

一人一单并发安全问题

在这里插入图片描述

调用lua脚本保证查询和删除锁原子性

调用RedisTemplateexecute方法来执行lua脚本
在这里插入图片描述

3-3. 小技巧

解决事务失效的3种方法

4. 达人探店

4-1. 技术点

利用Redis的SortedSet结构记录点赞的用户id,实现点赞排行榜

数据库返回按 list 集合顺序的元素

在这里插入图片描述

4-2. 业务

发布文章

文章点赞

只允许一人点一次赞

利用Redis的SortedSet结构记录点赞的用户id

点赞排行榜

将用户点赞的时间毫秒值作为 SortedSet 的 score,之后按 score 的顺序返回。

5. 好友关注

5-1. 技术点

利用 set 求交集获取共同关注好友

Feed流推送

Feed流产品有两种常见模式:

  • Timeline:不做内容筛选,简单的按照内容发布时间排序,常用于好友或关注。例如朋友圈

    • 优点:信息全面,不会有缺失。并且实现也相对简单
    • 缺点:信息噪音较多,用户不一定感兴趣,内容获取效率低
  • 智能排序:利用智能算法屏蔽掉违规的、用户不感兴趣的内容。推送用户感兴趣信息来吸引用户

    • 优点:投喂用户感兴趣信息,用户粘度很高,容易沉迷

    • 缺点:如果算法不精准,可能起到反作用

在这里插入图片描述

5-2. 业务

关注取关

共同关注

关注推送

关注推送也叫做Feed流,直译为投喂。为用户持续的提供“沉浸式”的体验,通过无限下拉刷新获取新的信息。

6. 附近的商户

6-1. 技术点

GEO数据结构的使用

6-2. 业务

使用GEO查询附近的商户

7. 用户签到

7-1. 技术点

位图(BitMap)

在这里插入图片描述

7-2. 业务

利用位图记录签到

统计连续签到次数

8. UV统计

8-1. 技术点

  • UV: 全称Unique Visitor,也叫独立访客量,是指通过互联网访问、浏览这个网页的自然人。1天内同一个用户多次访问该网站,只记录1次。
  • PV: 全称Page View,也叫页面访问量或点击量,用户每访问网站的一个页面,记录1次PV,用户多次打开页面,则记录多次PV。往往用来衡量网站的流量。

在这里插入图片描述

8-2. 业务

利用 HyperLogLog 统计 UV

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/577436.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JSes6语法和Json快速入门

对象操作 对象的crud 创建对象:let obj{} 新增属性:ojb.a1 修改属性:ojb.a2 查询属性:obj.a 删除属性:delete obj.a 其他操作 obj[a]1 Object.assign() //深拷贝?浅拷贝 let{ name} user &#x…

常用类(日期时间)

目录 一、JDK 8之前的日期时间API1.1、System类中获取时间戳的方法1.2、Java中两个Date类的使用1.3、SimpleDateFormat的使用1.4、Calendar日历类的使用 二、JDK8中日期时间API的介绍2.1、LocalDate、LocalTime、LocalDateTime的使用2.2、Instant类的使用2.3、DateTimeFormatte…

数据结构——lesson11排序之快速排序

💞💞 前言 hello hello~ ,这里是大耳朵土土垚~💖💖 ,欢迎大家点赞🥳🥳关注💥💥收藏🌹🌹🌹 💥个人主页&#x…

数据结构刷题篇 之 【力扣二叉树基础OJ】详细讲解(含每道题链接及递归图解)

有没有一起拼用银行卡的,取钱的时候我用,存钱的时候你用 1、相同的树 难度等级:⭐ 直达链接:相同的树 2、单值二叉树 难度等级:⭐ 直达链接:单值二叉树 3、对称二叉树 难度等级:⭐⭐ 直达…

原来这就是线程安全(一)

TOC 一:什么是线程不安全?? 先看一段代码: public class Demo1 {public static int count 0;public static void main(String[] args) throws InterruptedException {Thread t1new Thread(()->{for (int i 0; i < 50000; i) {count;}});Thread t2new Thread(()-&g…

【C语言】——指针六:冒泡排序与qsort函数的实现

【C语言】——指针六&#xff1a;冒泡排序与qsort函数 一、冒泡排序1.1、冒泡排序的原理1.2、用代码实现冒泡排序 二、qsort函数2.1、qsort函数的定义2.2、 qosrt函数的使用&#xff08;1&#xff09;比较函数的写法&#xff08;2&#xff09;使用 q s o r t qsort qsort 函数…

C语言编译与链接

前言 我们想一个问题&#xff0c;我们写的C语言代码都是文本信息&#xff0c;电脑能直接执行c语言代码吗&#xff1f;肯定不能啊&#xff0c;计算机能执行的是二进制指令&#xff0c;所以将C语言转化为二进制指令需要一段过程&#xff0c;这篇博客讲一下编译与链接&#xff0c;…

基于AI网关的光伏电站在线监测方案

光伏电站作为利用太阳能的重要方式&#xff0c;凭借其环保、高效和可持续性的优势&#xff0c;在全球范围内得到广泛应用。然而&#xff0c;光伏电站的运营和维护也面临着诸多难点和痛点。在这一背景下&#xff0c;AI智能网关的应用为光伏电站的运营和维护带来了新的突破。 光伏…

数据结构进阶篇 之 【二叉树链序存储】的整体实现讲解

封建迷信我嗤之以鼻&#xff0c;财神殿前我长跪不起 一、二叉树链式结构的实现 1.二叉树的创建 1.1 手动创建 1.2 前序递归创建 2.二叉树的遍历 2.1 前序&#xff0c;中序以及后序遍历概念 2.2 层序遍历概念 2.3 前序打印实现 2.4 中序打印实现 2.4 后序打印实现 2.…

在低成本loT mcu上实现深度神经网络端到端自动部署-深度神经网络、物联网、边缘计算、DNN加速——文末完整资料

目录 前言 DNN 量化神经网络 并行超低功耗计算范式 面向内存的部署 结果 原文与源码下载链接 REFERENCES 前言 在物联网极端边缘的终端节点上部署深度神经网络( Deep Neural Networks&#xff0c;DNNs )是支持普适深度学习增强应用的关键手段。基于低成本MCU的终端节点…

Paper Digest|基于在线聚类的自监督自蒸馏序列推荐模型

论文标题&#xff1a; Leave No One Behind: Online Self-Supervised Self-Distillation for Sequential Recommendation 作者姓名&#xff1a; 韦绍玮、吴郑伟、李欣、吴沁桐、张志强、周俊、顾立宏、顾进杰 组织单位&#xff1a; 蚂蚁集团 录用会议&#xff1a; WWW 2024 …

【Linux】开始学习进程替换吧!

送给大家一句话&#xff1a; 人生中有些事&#xff0c;你不竭尽所能去做&#xff0c;你永远不知道你自己有多出色。—— 尾田荣一郎《海贼王》 开始学习进程替换吧 1 前言2 进程替换2.1 替换函数2.2 替换原理2.3 单进程改为多进程2.4 理解使用exec* 函数int execl (const char …