之前码甲哥写了两篇有关线程安全的文章:•你管这叫线程安全?•.NET八股文:线程同步技术解读分布式锁是"线程同步"的延续最近首度应用"分布式锁",现在想想,分布式锁不是孤立的技能点,这其实就是跨主机的线程同步。进程内跨进程跨主机Lock/Monitor、SemaphoreSlimMetux、Semaphore分布式锁用户态线程安全内核态线程安全单机服务器可以通过共享某堆内存来标记上锁/解锁,线程同            
                
         
            
            
            
            一、背景在电商系统中,库存的概念一定是有的,例如配一些商品的库存,做商品秒杀活动等,而由于库存操作频繁且要求原子性操作,所以绝大多数电商系统都用Redis来实现库存的加减,最近公司项目做架构升级,以微服务的形式做分布式部署,对库存的操作也单独封装为一个微服务,这样在高并发情况下,加减库存时,就会出现超卖等问题,这时候就需要对库存操作做分布式锁处理。最近对分布式锁的实现以及性能做了对比分析,今天记录            
                
                    
                        
                                                            
                                                                        
                                                                                        转载
                                                                                    
                            2024-03-03 14:11:50
                            
                                233阅读
                            
                                                                             
                 
                
                                
                     
                                    
                             
         
            
            
            
            项目总结59:Redis分布式锁解决电商订单库存并发问题在电商分布式项目中,需要考虑提交订单时,因为并发的原因导致库存异常的情况。其中一个解决方案是:使用redis锁,因为Redis是单线程的,即线程安全的;在提交订单的时候,先通过Redis锁进行库存判断,如果库存校验通过,则正常提交顶顶那,否则返回失败。具体逻辑如下:1- 用户请求提交订单接口,接口内先通过Redis锁进行库存校验(如果第一次获            
                
                    
                        
                                                            
                                                                        
                                                                                        转载
                                                                                    
                            2023-08-15 19:15:44
                            
                                114阅读
                            
                                                                             
                 
                
                             
         
            
            
            
            1 redis介绍2 什么是NoSQLNoSQL,泛指非关系型的数据库,NoSQL即Not-Only SQL,它可以作为关系型数据库的良好补充。随着互联网web2.0网站的兴起,传统的关系数据库在应付web2.0网站,特别是超大规模和高并发的SNS类型的web2.0纯动态网站已经显得力不从心,暴露了很多难以克服的问题,而非关系型的数据库则由于其本身的特点得到了非常迅速的发展。 NoSQL数据库的产            
                
                    
                        
                                                            
                                                                        
                                                                                        转载
                                                                                    
                            2024-10-22 19:25:06
                            
                                24阅读
                            
                                                                             
                 
                
                                
                     
                                    
                             
         
            
            
            
            前言在上一节内容中,我们已经实现了使用redis分布式锁解决商品“超卖”的问题,本节内容是对redis分布式锁的优化。在上一节的redis分布式锁中,我们的锁有俩个可以优化的问题。第一,锁需要实现可重入,同一个线程不用重复去获取锁;第二,锁没有续期功能,导致业务没有执行完成就已经释放了锁,存在一定的并发访问问题。本案例中通过使用redis的hash数据结构实现可重入锁,使用Timer实现锁的续期功            
                
                    
                        
                                                            
                                                                        
                                                                                        转载
                                                                                    
                            2024-06-29 17:50:53
                            
                                71阅读
                            
                                                                             
                 
                
                                
                     
                                    
                             
         
            
            
            
            Redis实现分布式锁业务场景:不考虑高并发的情况:考虑高并发的情况:用redis的setnx来加锁实现:Redisson实现分布式锁一、引入依赖二、在启动类中创建一个redisson的bean三、业务实现 业务场景:redis中放有某商品的库存数据stock,通过调用系统的deductStock()方法来减库存。
首先在reids中维护一个库存,key:stock,value:300不考虑高并            
                
                    
                        
                                                            
                                                                        
                                                                                        转载
                                                                                    
                            2023-08-02 09:58:49
                            
                                145阅读
                            
                                                                             
                 
                
                             
         
            
            
            
            下面代码兼容了(key 不存在,key不是int类型,num为null)情况,均以扣减失败返回。函数返回值说明:-1 表示扣减失败,大于等于0 表示扣减成功后剩余的数量。public long decrBy(String key, Integer num) {
        if(num == null) {
            return -1;
        }
        St            
                
                    
                        
                                                            
                                                                        
                                                                                        转载
                                                                                    
                            2023-06-13 23:44:24
                            
                                203阅读
                            
                                                                             
                 
                
                             
         
            
            
            
            package spring;
import org.redisson.Redisson;
import org.redisson.api.RScript;
import org.redisson.api.RedissonClient;
import org.redisson.config.Config;
import java.util.ArrayList;
import java.            
                
                    
                        
                                                            
                                                                        
                                                                                        转载
                                                                                    
                            2023-06-29 11:04:40
                            
                                150阅读
                            
                                                                             
                 
                
                             
         
            
            
            
            # 使用Lua脚本在Redis中扣减库存
在处理电商系统中,库存扣减是一个非常常见的操作。而在高并发的情况下,对于库存扣减的操作需要考虑并发安全性和性能。在这种情况下,我们可以使用Redis的Lua脚本来实现原子性的库存扣减操作。
## Redis Lua脚本简介
Lua是一种简洁、轻量级的脚本语言,Redis支持使用Lua脚本来执行一系列操作。通过Lua脚本,我们可以在Redis中实现一些            
                
                    
                        
                                                            
                                                                        
                                                                                        原创
                                                                                    
                            2024-04-17 03:48:05
                            
                                255阅读
                            
                                                                             
                 
                
                             
         
            
            
            
            场景:一家网上商城做商品限量秒杀。1 单机环境下的锁将商品的数量存到Redis中。每个用户抢购前都需要到Redis中查询商品数量(代替mysql数据库。不考虑事务),如果商品数量大于0,则证明商品有库存。然后我们在进行库存扣减和接下来的操作。因为多线程并发问题,我们不得不在get()方法内部使用同步代码块。这样可以保证查询库存和减库存操作的原子性。packagespringbootdemo.dem            
                
                    
                        
                                                            
                                                                        
                                                                                        转载
                                                                                    
                            2023-07-21 14:24:33
                            
                                236阅读
                            
                                                                             
                 
                
                             
         
            
            
            
            背景: 网上看了一大圈基本,网友的意见基本有以下方式: 1.先删缓存、再更新数据库 2.先更新数据库再删缓存 注:高并发下都无法保证数据的一致性,可保证最终一致性,有风险。 3.使用binlog+MQ工具(类似于mysql slave),截获取增量日志,可行但代价太高。由于多了一层,更增加了系统的复杂度和不稳定风险。 现想到如下方案供大家探讨可行性: 一、定义如下表: 1)商品入库时初始库存量为实            
                
                    
                        
                                                            
                                                                        
                                                                                        转载
                                                                                    
                            2023-07-21 02:24:06
                            
                                394阅读
                            
                                                                             
                 
                
                                
                     
                                    
                             
         
            
            
            
            前言:高并发的秒杀活动中,通过查询数据库判断是否还有库存,然后对库存字段进行增减,极易出现库存超出或者库存为负的情况,一般来说有3中解决办法(数据库表加锁,memche缓存,redis队列);我们这里使用redis来解决问题:1、思路:  1)触发开始开团的同时,把库存数量更新到id对应的队列上去(定时更新,或者手动更新)  2)用户请求接口,如果队列长度>0,移除一个队列记录,同时对数据库            
                
                    
                        
                                                            
                                                                        
                                                                                        转载
                                                                                    
                            2023-05-29 22:04:00
                            
                                178阅读
                            
                                                                             
                 
                
                             
         
            
            
            
            目录前言1、减少数据库的压力2、减少redis的压力后记 前言本次的一个场景为秒杀的业务功能中,秒杀,我们都知道并发量是真的高,所以如何去优化这个问题便成了今天的主题(之后还会有限流来提高)。并且此次的使用是可以大大的提高我们的并发量,和加大我们的系统稳定性。首先,我们的一个思路:一、redis预减库存 尽量不使用数据库连接去查询商品数量,而是通过查询redis去查询商品数量二、redis标记商            
                
                    
                        
                                                            
                                                                        
                                                                                        转载
                                                                                    
                            2023-08-04 14:54:49
                            
                                108阅读
                            
                                                                             
                 
                
                                
                     
                                    
                             
         
            
            
            
            分布式锁在分布式环境中,为了保证业务数据的正常访问,防止出现重复请求的问题,会使用分布式锁来阻拦后续请求。我们先写一段有问题的业务代码:public void doSomething(String userId){ User user=getUser(userId); if(user==null){ user.setUserName("xxxxx"); user.setUserId(userId)            
                
                    
                        
                                                            
                                                                        
                                                                                        转载
                                                                                    
                            2023-08-10 17:21:11
                            
                                86阅读
                            
                                                                             
                 
                
                                
                     
                                    
                             
         
            
            
            
            在日常开发中有很多地方都有类似扣减库存的操作,比如电商系统中的商品库存,抽奖系统中的奖品库存等。解决方案使用mysql数据库,使用一个字段来存储库存,每次扣减库存去更新这个字段。还是使用数据库,但是将库存分层多份存到多条记录里面,扣减库存的时候路由一下,这样子增大了并发量,但是还是避免不了大量的去访问数据库来更新库存。将库存放到redis使用redis的incrby特性来扣减库存。分析在上面的第一            
                
                    
                        
                                                            
                                                                        
                                                                                        转载
                                                                                    
                            2023-08-24 13:17:16
                            
                                155阅读
                            
                                                                             
                 
                
                             
         
            
            
            
            lua redis 库存超卖问题的解决方案探讨
在去中心化的库存管理中,因并发处理的不当,导致的“lua redis 库存超卖”问题成为开发者在使用Lua脚本与Redis进行库存管理时的一大挑战。为了更好地解决这一问题,本文汇总了从版本对比到实战案例的整体过程,旨在为开发者提供一个清晰的思路。
## 版本对比
在解决“lua redis 库存超卖”过程中,选用的版本对比显得格外重要。当前版本            
                
         
            
            
            
            背景从并行执行模型到串行执行模型的切换。  
 因我们的某一个商品的库存资源可以认为是有且只有一个的,不管前面的执行过程有多少个线程,多少个用户,在实际扣减或回滚的时候,我们期望它是原子的,内存可见的,有序的执行顺序。  实现案例结构图可能的复杂逻辑 由上图我们不难看出,在扣减库存操作的时候,我们在很大一部分操作需要将并行执行转化为串行执行模型,当有一个sku的时候我们还好做一些(类比,mysql            
                
         
            
            
            
            # 控制库存:使用Redis和Java
## 介绍
在电子商务领域,对库存进行有效的管理是非常重要的。而使用Redis和Java可以有效地控制库存,实现实时库存管理和监控。本文将介绍如何使用Redis和Java来控制库存,并提供相关的代码示例。
## Redis介绍
Redis是一种开源的内存数据库,它提供了高性能的键值存储,并支持多种数据结构。在控制库存的场景中,我们可以使用Redis的            
                
                    
                        
                                                            
                                                                        
                                                                                        原创
                                                                                    
                            2024-04-12 04:10:38
                            
                                32阅读
                            
                                                                             
                 
                
                             
         
            
            
            
            redis管理篇笔记持久化RDB方式AOF方式复制 持久化RDB方式简介 RDB方式的持久化是通过快照(snapshotting)完成的,当符合一定条件时Redis会自动将内存中的所有数据进行快照并存储在硬盘上。进行快照的条件可以由用户在配置文件中自定义,由两个参数构成:时间和改动的键的个数。当在指定的时间内被更改的键的个数大于指定的数值时就会进行快照。RDB是Redis默认采用的持久化方式。配            
                
         
            
            
            
            # 实现 Java Redis 控制库存
## 简介
在实际项目开发中,使用 Redis 来控制库存是一个常见的需求。本文将教会你如何使用 Java 操作 Redis 来控制库存。
### 流程概览
下面是实现“Java Redis 控制库存”的流程概览,可以通过以下步骤来完成:
| 步骤 | 操作 |
| ---- | ---- |
| 1 | 连接 Redis |
| 2 | 初始化库存            
                
                    
                        
                                                            
                                                                        
                                                                                        原创
                                                                                    
                            2024-04-11 03:36:23
                            
                                181阅读