Redis的一些问题,解决并发的
项目通布隆过滤器:
布隆过滤器:
布隆过滤器是一种空间效率非常高的数据结构,用于快速判断一个元素是否可能存在于一个集合中。它由一个位数组(通常是长度为 m 的比特数组)和 k 个不同的哈希函数组成。当一个元素被加入集合时,通过 k 个哈希函数将该元素映射到位数组中的 k 个位置,并将这些位置的比特值设为 1。当需要查询一个元素是否在集合中时,同样通过 k 个哈希函数计算出位数组中的 k 个位置,并检查这些位置的比特值是否都为 1,如果有一个不为 1,则可以确定该元素肯定不在集合中,如果都为 1,则该元素可能存在于集合中。布隆过滤器具有以下特点:快速:查询一个元素的时间复杂度是 O(k),其中 k 是哈希函数的数量,通常很小。
空间效率高:相比于存储所有元素的集合,布隆过滤器需要的存储空间很小。
可能出现误判:当一个元素可能存在于集合中时,布隆过滤器会返回 "可能存在",但实际上可能并不存在;而当一个元素肯定不存在于集合中时,布隆过滤器会返回 "不存在",不存在误判。
布隆过滤器常用于缓存、数据库查询优化、网络爬虫的URL去重等场景,但需要注意的是,布隆过滤器一旦创建后,无法删除或修改其中的元素,因为删除或修改元素会影响其他元素的判断结果。
布隆过滤器和空值返回是两种常用的技术,用于缓解Redis的穿透问题。布隆过滤器可以用于快速检查某个键是否存在于Redis中,从而在缓存层面过滤掉一些不存在于Redis中的查询请求;而空值返回则是指在查询Redis中不存在的键时,直接返回一个空值,而不是去查询数据库,从而减少数据库压力。
基于布隆过滤器的缓解穿透问题:
在查询Redis之前,先使用布隆过滤器检查查询的键是否可能存在于Redis中。
如果布隆过滤器认为键不存在于Redis中,则直接返回一个预先设定的空值,而不进行实际的Redis查询。
如果布隆过滤器认为键可能存在于Redis中,则继续向Redis发起查询请求。
如果Redis返回的确实是空值,则在布隆过滤器中将该键标记为不存在,以便下一次查询时可以直接返回空值。
基于Redis构造分布式锁缓解优惠券秒杀问题:
使用Redis的SETNX命令来实现分布式锁,即尝试设置一个特定的键,如果该键不存在,则设置成功并获得锁,否则设置失败表示锁已被其他客户端获取。
在秒杀开始时,客户端请求获取优惠券时,先尝试获取分布式锁。
获取锁成功后,执行秒杀操作,即将优惠券数量减一,并将优惠券分发给用户。
执行完秒杀操作后,释放锁。
如果获取锁失败,则表示已经有其他客户端正在执行秒杀操作,当前客户端需要等待或放弃秒杀。
通过以上两种方法,可以在Redis中缓解穿透问题和秒杀问题,提高系统的稳定性和性能。
使用Redis+lua脚本构造分布式锁,缓解高并发缓解下的优惠卷超卖问题。
下面是一个使用Redis和Lua脚本构造分布式锁来缓解高并发下优惠券超卖问题的示例:
首先,在Redis中设置一个键来表示优惠券的库存数量。
当用户请求优惠券时,通过Lua脚本来进行原子性操作:
获取当前库存数量。
如果库存数量大于0,则将库存数量减1,并返回成功。
如果库存数量已经为0,则返回失败。
如果Lua脚本执行成功,则用户可以获得优惠券;否则,说明优惠券已经售罄。
以下是一个Java代码示例:
java
import redis.clients.jedis.Jedis;
public class CouponService {
private static final String COUPON_KEY = “coupon_stock”;
private static final String LOCK_KEY = “coupon_lock”;
private static final String SCRIPT = "if redis.call(‘GET’, KEYS[1]) > ‘0’ then " +
"redis.call(‘DECR’, KEYS[1]) " +
"return 1 " +
"else " +
"return 0 " +
“end”;
public static void main(String[] args) {// 连接Redis数据库Jedis jedis = new Jedis("localhost");// 初始化优惠券库存jedis.set(COUPON_KEY, "100");// 模拟多个用户请求优惠券for (int i = 0; i < 150; i++) {new Thread(() -> {// 加锁String lock = jedis.set(LOCK_KEY, "LOCK", "NX", "EX", 5);if ("OK".equals(lock)) {// 执行Lua脚本Object result = jedis.eval(SCRIPT, 1, COUPON_KEY);if (result instanceof Long && (Long) result == 1) {System.out.println("Success: User " + Thread.currentThread().getId() + " got the coupon.");} else {System.out.println("Failed: Coupon sold out for user " + Thread.currentThread().getId());}// 释放锁jedis.del(LOCK_KEY);} else {System.out.println("Failed to acquire lock for user " + Thread.currentThread().getId());}}).start();}// 等待所有线程执行完毕try {Thread.sleep(6000);} catch (InterruptedException e) {e.printStackTrace();}// 打印最终库存数量System.out.println("Final coupon stock: " + jedis.get(COUPON_KEY));// 关闭Redis连接jedis.close();
}
}
在这个示例中,我们通过Redis的SET命令来尝试获取分布式锁,确保Lua脚本的原子性执行。如果获取锁成功,就执行Lua脚本,如果库存数量大于0,则将库存数量减1,并返回成功;否则返回失败。如果获取锁失败,则说明有其他线程正在执行优惠券领取操作,当前用户需要重试或放弃领取。
这样可以保证在高并发下,多个用户同时请求优惠券时,只有一个用户能够成功领取,避免了优惠券超卖问题。
相关文章:
Redis的一些问题,解决并发的
项目通布隆过滤器: 布隆过滤器: 布隆过滤器是一种空间效率非常高的数据结构,用于快速判断一个元素是否可能存在于一个集合中。它由一个位数组(通常是长度为 m 的比特数组)和 k 个不同的哈希函数组成。当一个元素被加入…...
郭炜老师mooc第十一章数据分析和展示(numpy,pandas, matplotlib)
多维数组库numpy numpy创建数组的常用函数 # numpy数组import numpy as np #以后numpy简写为np print(np.array([1,2,3])) #>>[1 2 3] print(np.arange(1,9,2)) #>>[1 3 5 7] 不包括9 print(np.linspace(1,10,4)) #>>[ 1. 4. 7. 10.] # linespace(x,y,n)&…...
Redis主从架构和管道Lua(一)
Redis主从架构 架构 Redis主从工作原理 如果为master配置了一个slave,不管这个slave是否是第一次连接上Master,它都会发送一个PSYNC命令给master请求复制数据。master受到PSYNC命令,会在后台进行数据持久化通过bgsave生成最新的 RDB快照文件,持久化期间…...
GTH手册学习注解
CPLL的动态配置 终于看到有这个复位功能了 QPLL SWITCHing需要复位 器件级RESET没发现有管脚引出来 两种复位方式,对应全复位和器件级复位 对应的复位功能管脚 改那个2分频的寄存器说明段,复位是自动发生的?说明可能起效了,但是分…...
html5cssjs代码 002 50以内的加法算式
html5&css&js代码 002 一些基本概念 50以内的加法算式 一、代码二、解释 50以内的加法算式。 一、代码 <!DOCTYPE html> <html lang"en"> <head><title>50以内的加法算式</title><meta charset"UTF-8"><m…...
[React 进阶系列] React Context 案例学习:使用 TS 及 HOC 封装 Context
[React 进阶系列] React Context 案例学习:使用 TS 及 HOC 封装 Context 具体 context 的实现在这里:[React 进阶系列] React Context 案例学习:子组件内更新父组件的状态。 根据项目经验是这样的,自从换了 TS 之后,…...
网络编程:网络编程基础
一、网络发展 1.TCP/IP两个协议阶段 TCP/IP协议已分成了两个不同的协议: 用来检测网络传输中差错的传输控制协议TCP 专门负责对不同网络进行2互联的互联网协议IP 2.网络体系结构 OSI体系口诀:物链网输会示用 2.1网络体系结构概念 每一层都有自己独…...
力扣热题100_矩阵_73_矩阵置零
文章目录 题目链接解题思路解题代码 题目链接 73.矩阵置零 给定一个 m x n 的矩阵,如果一个元素为 0 ,则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。 示例 1: 输入:matrix [[1,1,1],[1,0,1],[1,1,1]] 输出&…...
C++程序设计-第四/五章 函数和类和对象【期末复习|考研复习】
前言 总结整理不易,希望大家点赞收藏。 给大家整理了一下C程序设计中的重点概念,以供大家期末复习和考研复习的时候使用。 C程序设计系列文章传送门: 第一章 面向对象基础 第四/五章 函数和类和对象 第六/七/八章 运算符重载/包含与继承/虚函…...
C#快速入门基础
本篇文章从最基础的C#编程开始学习,经过非常优秀的面向对象编程思想和方法的学习,为C#编程打下基础。 第 01 章 C#开发环境之VS使用和.NET平台基础 1.1 Visual Studio 开发环境 1.1.1 硬件环境 i5CPUi5CPU(建议 4核 4线程或以上 ࿰…...
UnityShader常用算法笔记(颜色叠加混合、RGB-HSV-HSL的转换、重映射、UV序列帧动画采样等,持续更新中)
一.颜色叠加混合 1.Blend混合 // 正常,透明度混合 Normal Blend SrcAlpha OneMinusSrcAlpha //柔和叠加 Soft Additive Blend OneMinusDstColor One //正片叠底 相乘 Multiply Blend DstColor Zero //两倍叠加 相加 2x Multiply Blend DstColor SrcColor //变暗…...
Vue3调用钉钉api,内嵌H5微应用单点登录对接
钉钉内嵌H5微应用单点登录对接 https://open.dingtalk.com/document/isvapp/obtain-the-userid-of-a-user-by-using-the-log-free 前端需要的代码 1、安装 dingtalk-jsapi npm install dingtalk-jsapi2、在所需页面引入 import * as dd from dingtalk-jsapi; // 引入钉钉a…...
UE5 局域网联机,寻找会话失败。
目录 参考资料: 尝试解决办法 1.1在【项目名.Build.cs】脚本中添加该行,添加后关闭编辑器,重新生成解决方案。编辑 2.检查是否在同一个C类子网 参考资料: 1.Cant find session in LAN - Programming & Scripting / Mul…...
Windows系统安装MongoDB并结合内网穿透实现公网访问本地数据库
文章目录 前言1. 安装数据库2. 内网穿透2.1 安装cpolar内网穿透2.2 创建隧道映射2.3 测试随机公网地址远程连接 3. 配置固定TCP端口地址3.1 保留一个固定的公网TCP端口地址3.2 配置固定公网TCP端口地址3.3 测试固定地址公网远程访问 前言 MongoDB是一个基于分布式文件存储的数…...
Hadoop伪分布式配置--没有DataNode或NameNode
一、原因分析 重复格式化NameNode 二、解决方法 1、输入格式化NameNode命令,找到data和name存放位置 ./bin/hdfs namenode -format 2、删除data或name(没有哪个删哪个) sudo rm -rf data 3、重新格式化NameNode 4、重新启动即可。...
柚见第十期(后端队伍接口详细设计)
创建队伍 用户可以 创建 一个队伍,设置队伍的人数、队伍名称(标题)、描述、超时时间 P0 队长、剩余的人数 聊天? 公开 或 private 或加密 信息流中不展示已过期的队伍 请求参数是否为空?是否登录,未登录不…...
【李沐论文精读】GPT、GPT-2和GPT-3论文精读
论文: GPT:Improving Language Understanding by Generative Pre-Training GTP-2:Language Models are Unsupervised Multitask Learners GPT-3:Language Models are Few-Shot Learners 参考:GPT、GPT-2、GPT-3论文精读…...
新版Android Studio火烈鸟 在新建项目工程时 无法选java的语言模板解决方法
前言 最近下载最新版androidstudio时 发现不能勾选java语言模板了 如果快速点击下一步 新建项目 默认是kotlin语言模板 这可能和google主推kt语言有关 勾选1 如图所示 如果勾选 No Activity 这个模板 是可以选java语言模板的 但是里面没有默认的Activity 勾选2 和以前的用法…...
github(不是git啊)操作记录(踩坑)
专栏介绍与文章目录-CSDN博客 github是程序员绕不开的东西。 网站打不开? 向雇主或有关部门申请合法信道连接互联网。 明明账号密码都对却登录失败? 向雇主或有关部门申请合法信道连接互联网。 重置密码失败? 向雇主或有关部门申请合法信道…...
【SpringCloud微服务实战01】Eureka 注册中心
前言 在 Eureka 架构中,微服务角色有两类: EurekaServer :服务端,注册中心 记录服务信息 心跳监控 EurekaClient :客户端 Provider :服务提供者,例如案例中的 user-service …...
业务系统对接大模型的基础方案:架构设计与关键步骤
业务系统对接大模型:架构设计与关键步骤 在当今数字化转型的浪潮中,大语言模型(LLM)已成为企业提升业务效率和创新能力的关键技术之一。将大模型集成到业务系统中,不仅可以优化用户体验,还能为业务决策提供…...
【根据当天日期输出明天的日期(需对闰年做判定)。】2022-5-15
缘由根据当天日期输出明天的日期(需对闰年做判定)。日期类型结构体如下: struct data{ int year; int month; int day;};-编程语言-CSDN问答 struct mdata{ int year; int month; int day; }mdata; int 天数(int year, int month) {switch (month){case 1: case 3:…...
visual studio 2022更改主题为深色
visual studio 2022更改主题为深色 点击visual studio 上方的 工具-> 选项 在选项窗口中,选择 环境 -> 常规 ,将其中的颜色主题改成深色 点击确定,更改完成...
STM32F4基本定时器使用和原理详解
STM32F4基本定时器使用和原理详解 前言如何确定定时器挂载在哪条时钟线上配置及使用方法参数配置PrescalerCounter ModeCounter Periodauto-reload preloadTrigger Event Selection 中断配置生成的代码及使用方法初始化代码基本定时器触发DCA或者ADC的代码讲解中断代码定时启动…...
Python爬虫(二):爬虫完整流程
爬虫完整流程详解(7大核心步骤实战技巧) 一、爬虫完整工作流程 以下是爬虫开发的完整流程,我将结合具体技术点和实战经验展开说明: 1. 目标分析与前期准备 网站技术分析: 使用浏览器开发者工具(F12&…...
Java 加密常用的各种算法及其选择
在数字化时代,数据安全至关重要,Java 作为广泛应用的编程语言,提供了丰富的加密算法来保障数据的保密性、完整性和真实性。了解这些常用加密算法及其适用场景,有助于开发者在不同的业务需求中做出正确的选择。 一、对称加密算法…...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...
Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信
文章目录 Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信前言一、网络通信基础概念二、服务端与客户端的完整流程图解三、每一步的详细讲解和代码示例1. 创建Socket(服务端和客户端都要)2. 绑定本地地址和端口&#x…...
算法:模拟
1.替换所有的问号 1576. 替换所有的问号 - 力扣(LeetCode) 遍历字符串:通过外层循环逐一检查每个字符。遇到 ? 时处理: 内层循环遍历小写字母(a 到 z)。对每个字母检查是否满足: 与…...
面向无人机海岸带生态系统监测的语义分割基准数据集
描述:海岸带生态系统的监测是维护生态平衡和可持续发展的重要任务。语义分割技术在遥感影像中的应用为海岸带生态系统的精准监测提供了有效手段。然而,目前该领域仍面临一个挑战,即缺乏公开的专门面向海岸带生态系统的语义分割基准数据集。受…...
