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 …...
基于算法竞赛的c++编程(28)结构体的进阶应用
结构体的嵌套与复杂数据组织 在C中,结构体可以嵌套使用,形成更复杂的数据结构。例如,可以通过嵌套结构体描述多层级数据关系: struct Address {string city;string street;int zipCode; };struct Employee {string name;int id;…...
浅谈 React Hooks
React Hooks 是 React 16.8 引入的一组 API,用于在函数组件中使用 state 和其他 React 特性(例如生命周期方法、context 等)。Hooks 通过简洁的函数接口,解决了状态与 UI 的高度解耦,通过函数式编程范式实现更灵活 Rea…...
Spark 之 入门讲解详细版(1)
1、简介 1.1 Spark简介 Spark是加州大学伯克利分校AMP实验室(Algorithms, Machines, and People Lab)开发通用内存并行计算框架。Spark在2013年6月进入Apache成为孵化项目,8个月后成为Apache顶级项目,速度之快足见过人之处&…...
阿里云ACP云计算备考笔记 (5)——弹性伸缩
目录 第一章 概述 第二章 弹性伸缩简介 1、弹性伸缩 2、垂直伸缩 3、优势 4、应用场景 ① 无规律的业务量波动 ② 有规律的业务量波动 ③ 无明显业务量波动 ④ 混合型业务 ⑤ 消息通知 ⑥ 生命周期挂钩 ⑦ 自定义方式 ⑧ 滚的升级 5、使用限制 第三章 主要定义 …...
通过Wrangler CLI在worker中创建数据库和表
官方使用文档:Getting started Cloudflare D1 docs 创建数据库 在命令行中执行完成之后,会在本地和远程创建数据库: npx wranglerlatest d1 create prod-d1-tutorial 在cf中就可以看到数据库: 现在,您的Cloudfla…...
基于uniapp+WebSocket实现聊天对话、消息监听、消息推送、聊天室等功能,多端兼容
基于 UniApp + WebSocket实现多端兼容的实时通讯系统,涵盖WebSocket连接建立、消息收发机制、多端兼容性配置、消息实时监听等功能,适配微信小程序、H5、Android、iOS等终端 目录 技术选型分析WebSocket协议优势UniApp跨平台特性WebSocket 基础实现连接管理消息收发连接…...
Linux简单的操作
ls ls 查看当前目录 ll 查看详细内容 ls -a 查看所有的内容 ls --help 查看方法文档 pwd pwd 查看当前路径 cd cd 转路径 cd .. 转上一级路径 cd 名 转换路径 …...
相机Camera日志分析之三十一:高通Camx HAL十种流程基础分析关键字汇总(后续持续更新中)
【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了:有对最普通的场景进行各个日志注释讲解,但相机场景太多,日志差异也巨大。后面将展示各种场景下的日志。 通过notepad++打开场景下的日志,通过下列分类关键字搜索,即可清晰的分析不同场景的相机运行流程差异…...
GitFlow 工作模式(详解)
今天再学项目的过程中遇到使用gitflow模式管理代码,因此进行学习并且发布关于gitflow的一些思考 Git与GitFlow模式 我们在写代码的时候通常会进行网上保存,无论是github还是gittee,都是一种基于git去保存代码的形式,这样保存代码…...
【LeetCode】3309. 连接二进制表示可形成的最大数值(递归|回溯|位运算)
LeetCode 3309. 连接二进制表示可形成的最大数值(中等) 题目描述解题思路Java代码 题目描述 题目链接:LeetCode 3309. 连接二进制表示可形成的最大数值(中等) 给你一个长度为 3 的整数数组 nums。 现以某种顺序 连接…...
