学习【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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

2024年智能版控费系统方案卓健易控

2024年智能版控费系统方案卓健易控 详细可咨询:19138173009 设备智能卓健易控ZJ-V8.0控费方案在科学和技术不断发展的背景下,逐渐实现了更新和迭代。现如今,感应技术、生物识别技术、智能图像识别技术、过程记录技术、监管控制技术等方面的…

halcon例程学习——ball.hdev

dev_update_window (off) dev_close_window () dev_open_window (0, 0, 728, 512, black, WindowID) read_image (Bond, die/die_03) dev_display (Bond) set_display_font (WindowID, 14, mono, true, false) *自带的 提示继续 disp_continue_message (WindowID, black, true)…

多个微信这样高效管理

随着微信成为企业商务沟通的主要平台,一些业务咨询量较大的行业,如教育培训、旅游、美容及医疗等,通过微信开展营销活动和客户服务过程中,经常面临多微信管理难题。 在这种情况下,采用微信线上业务模式,需…

Spring-IoC-属性注入的注解实现

1、创建对象的注解 Component 用于声明Bean对象的注解,在类上添加该注解后,表示将该类创建对象的权限交给Spring容器。可以直接将这些类直接创建,使用的时候可以直接用。 注解的value属性用于指定bean的id值,value可以省略&…

牛客JZ21-调整数组顺序使奇数位于偶数前面

目录 问题描述示例具体思路思路一 代码实现 问题描述 输入一个长度为 n 整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前面部分,所有的偶数位于数组的后面部分,并保证奇数和奇数,偶数和偶数…

12.Java语言的发展

JAVA语言的诞生是具有一定戏剧性的,可以说是命运多舛,差点凉凉,差点GG,差点嗝屁。 在1990年的时候Sun(Stanford University Network:斯坦福大学网络)公司成立了一个由 James Gosling 领导的Gree…

【unity】unity安装及路线图

学习路线图 二、有关unity的下载 由于unity公司是在国外,所以.com版(https://developer.unity.cn/)不一定稳定,学习时推荐从.cn国内版(https://developer.unity.cn/)前往下载,但是后期仍需回…

通过dockerfile制作代码编译maven3.8.8+jdk17 基础镜像

一、背景: paas平台维护过程中有一个流水线的工作需要支持运维,最近有研发提出新的需求要制作一个代码编译的基础镜像出来,代码编译的基础镜像需求如下: maven版本:3.8.8版本 jdk版本:17版本,小…

C++中的STL简介与string类

目录 STL简介 STL的版本 STL的六大组件 string类 标准库中的string类 string类的常用接口 string类对象对容量的操作 size()函数与length()函数 capacity()函数 capacity的扩容方式 reserve()函数 resize()函数 string类对象的操作 push_back()函数 append()函数 operator()函数…

Redis与数据库的一致性

Redis与数据库的数据一致性 在使用Redis作为应用缓存来提高数据的读性能时,经常会遇到Redis与数据库的数据一致性问题。简单来说,就是同一份数据同时存在于Redis和数据库,如何在数据更新的时候,保证两边数据的一致性。首先&#…

用Blender给MetaHuman不同胖瘦身体模型做插值,计算过度模型

用Blender给MetaHuman不同胖瘦身体模型做插值,计算过度模型 本篇文章所有想法和代码均为ChatGPT所写 需求:MetaHuman的身体有瘦、标准、胖三个体型,想要通过三个体型插值计算出符合用户体型的更多模型 建议:chatGPT建议用Blender&…

Mysql数据库:主从复制与读写分离

目录 前言 一、Mysql主从复制概述 1、Mysql主从复制概念 2、Mysql主从复制功能和使用场景 2.1 功能(为何使用主从复制) 2.2 适用场景(何时使用主从复制) 3、Mysql复制的类型 3.1 基于SQL语句的复制(Statement默…

【原生小程序-增加友盟统计】

1.project.config.json中 //最外面的 {"packNpmManually": true,"packNpmRelationList": [{"packageJsonPath": "./package.json","miniprogramNpmDistDir": "./"}] }2.在终端中输入npm init -y 3.再输入命令np…

整理git上的模板框架

vite-vue3.0-ts-pinia-uni-app 技术栈的app框架 功能:基于 uni-app,一端发布多端通用,目前已经适配 H5、微信小程序、QQ小程序、Ios App、Android App。 taro3vue3tsnutuipinia taro3 框架小程序跨端平台 vue3.0-element-vite-qiankun 后台…

HarmonyOS实战开发-如何构建多种样式弹窗

介绍 本篇Codelab将介绍如何使用弹窗功能,实现四种类型弹窗。分别是:警告弹窗、自定义弹窗、日期滑动选择器弹窗、文本滑动选择器弹窗。需要完成以下功能: 点击左上角返回按钮展示警告弹窗。点击出生日期展示日期滑动选择器弹窗。点击性别展…

【动态规划】Leetcode 62. 不同路径I 63. 不同路径II

【动态规划】Leetcode 62. 不同路径I 63. 不同路径II Leetcode 62. 不同路径ILeetcode 63. 不同路径II ---------------🎈🎈62. 不同路径I 题目链接🎈🎈------------------- ---------------🎈🎈63. 不同路…

【YOLOv5改进系列(7)】高效涨点----使用yolov8中的C2F模块替换yolov5中的C3模块

文章目录 🚀🚀🚀前言一、1️⃣ C3模块和C2F模块详解1.1 🎓 C3模块1.2 ✨BottleNeck模块1.3 ⭐️C2F模块 二、2️⃣添加C2f和C2F_Bottleneck模块代码三、3️⃣新建yolov5s_C2F.yaml文件四、4️⃣修改yolo.py中的parse_model函数五…

Collction的三种遍历

目录 集合体系结构 迭代器遍历: 增强for遍历: Lambda表达式遍历 集合体系结构 List 系列集合 : 添加元素是有序的、可重复的,有索引的; 有序的:存和取的顺序是一样的; Set 系列集合 &#…

综合实验1

一、配置IP地址 [AR1]int g0/0/0 [AR1-GigabitEthernet0/0/0]ip add 192.168.1.254 24 [AR1-GigabitEthernet0/0/0]int se4/0/0 [AR1-Serial4/0/0]ip add 15.1.1.1 24 [AR1-Serial4/0/0] [AR2]int g0/0/0 [AR2-GigabitEthernet0/0/0]ip add 192.168.2.254 24 [AR2-Giga…

Sui与Revolut合作,加速Sui区块链教育和采用

作为全球一体化金融平台,Revolut与Sui合作推出了最新的加密货币学习课程。Revolut拥有全球超过4,000万用户,提供一系列数字银行产品和服务,包括购买和出售加密货币,其中包括SUI。 Revolut的学习计划为其用户提供有关Sui的教育&am…