首页 > 数据库 >Redis应用场景-分布式锁

Redis应用场景-分布式锁

时间:2024-07-26 18:28:01浏览次数:14  
标签:场景 Redis boot num org 分布式 redisson public productid

1.创建springboot项目


2.添加依赖

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.3.5.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.ykq</groupId>
    <artifactId>distinct-lock</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>distinct-lock</name>
    <description>Demo project for Spring Boot</description>
    <properties>
        <java.version>1.8</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>


        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.4.2</version>
        </dependency>


        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>

        <!--①依赖-->
        <dependency>
            <groupId>org.redisson</groupId>
            <artifactId>redisson</artifactId>
            <version>3.24.3</version>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <excludes>
                        <exclude>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok</artifactId>
                        </exclude>
                    </excludes>
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>

3.实体类

@Data
@TableName("tbl_stock")
public class Stock {
    @TableId(type = IdType.AUTO)
    private int productid;
    @TableField("num")
    private int stock;
}

4.dao

@Mapper
public interface StockDao {
    @Select("select num from tbl_stock where productid=#{productid}")
    int findById(Integer productid);

    @Update("update tbl_stock set num=num-1 where productid=#{productid} ")
    void update(Integer productid);
}

5.server

@Service
public class StockService {

    @Autowired
    private StockDao stockDao;
    @Autowired
    private RedissonClient redisson;

    //
    public String decrement(Integer productid) {
        RLock lock = redisson.getLock("product::" + productid);
        lock.lock();
        try {
            //根据id查询商品的库存: 提前预热到redis缓存中
            int num = stockDao.findById(productid);
            if (num > 0) {
                //修改库存---incr---定时器[redis  数据库同步]
                stockDao.update(productid);
                System.out.println("商品编号为:" + productid + "的商品库存剩余:" + (num - 1) + "个");
                return "商品编号为:" + productid + "的商品库存剩余:" + (num - 1) + "个";
            } else {
                System.out.println("商品编号为:" + productid + "的商品库存不足。");
                return "商品编号为:" + productid + "的商品库存不足。";
            }
        }finally {
            lock.unlock();
        }
    }
}

6.controller

@RestController
public class StockController {

    @Autowired
    private StockService stockService;

    //根据商品编号减库存 每次减一个
    @GetMapping("/incr/{productid}")
    public String incr(@PathVariable Integer productid){
         return stockService.decrement(productid);
    }
}

7.config

@Configuration
public class RedissonConfig {

    @Bean
    public RedissonClient redisson(){
        Config config = new Config();
//        //连接的为redis集群
//        config.useClusterServers()
//                // use "rediss://" for SSL connection
//                .addNodeAddress("redis://127.0.0.1:7181","","","")
//        ;
        //连接单机
        config.useSingleServer().setAddress("redis://192.168.31.137:6379");
        RedissonClient redisson = Redisson.create(config);
        return redisson;
    }
}

8.配置

9.使用Apipost测试

11.使用集群测试

12.安装window版的nginx,把配置文件修改为集群模式-nginx.conf

13.安装jmeter进行压测

启动

标签:场景,Redis,boot,num,org,分布式,redisson,public,productid
From: https://blog.csdn.net/R202471/article/details/140685688

相关文章

  • 安徽省大学生网络与分布式系统创新设计大赛-MISC
    最终排名第七,拿到省一图穷匕见去010看到有16进制,提取出来文本太大了,工具解不了上脚本是坐标用脚本画出来解码flag{40fc0a979f759c8892f4dc045e28b820}流下没有技术的眼泪是16进制,两个一组;转换成10进制分析与ascii之间的关系,每个减去128然后转换成ascii字符......
  • 美国站群vps云服务器的应用场景和使用方法
    美国站群VPS云服务器在多站点托管、SEO优化、高可用性与稳定性、成本效益、安全性以及特定行业应用等方面具有广泛的应用场景。美国站群VPS云服务器是一种高性能、高稳定性的虚拟专用服务器解决方案,特别适用于需要托管和管理多个网站或应用的场景。以下是美国站群vps云服务器详细......
  • 分布式系统心跳机制(一)
    本文分享自天翼云开发者社区《分布式系统心跳机制(一)》,作者:白杨分布式系统架构当前大部分分布式系统架构如下图: 有一个中心节点来存储集群元数据和管理work儿节点,中心节点采用主备模式来实现HA。当中心节点主故障后,备节点接管业务成为主节点。我们下面讨论的心跳机制就是基于......
  • Redis知识点总结
    目录1.基本概念2.内存与持久化3.数据结构4.高级功能5.性能优化6.应用场景7.安装与配置1.在Linux系统上通过源码编译安装2.在CentOS上通过包管理器安装3.在MacOS上通过Homebrew安装4.在Windows环境下通过预编译二进制文件安装结论Redis(RemoteDiction......
  • Redis原理与应用
    一为什么使用redis?1.支持高可用,3.0集群2.丰富的数据类型3.完全内存操作,速度快,支持持久化4.存储数据大,单个key和value可以存储到1G二Redis的持久化方式?redis持久化方式有RDB和AOF  ,RDB是方式是每过几秒保存的是redis数据的快照,但是可能会丢数据,AOF 保存的是所有在......
  • 边缘计算PCDN的使用场景及优势
    一、定义PCDN,全称为PrivateContentDeliveryNetwork,即私有内容分发网络。它是一种基于P2P技术和CDN的内容分发加速网络,通过在网络中添加大量的低成本缓存服务器,将用户请求的内容从原始服务器分发到这些缓存服务器,从而实现内容更快、更稳定地传输到终端用户。二、功能PCDN......
  • Redis缓存面试问题解析:如何有效管理缓存失效策略?
    在技术面试中,Redis缓存是一个常见的话题。面试官往往会考察候选人对缓存机制的理解以及在实际场景中的应用能力。本文将探讨一个在Redis缓存面试中经常被问到的问题,并深入解析其背后的概念和解决方案。面试问题:如何管理Redis缓存的失效策略?问题描述:在高并发的web应用中,缓存是提......
  • 面试场景题系列--(2)短 URL 生成器设计:百亿短 URL 怎样做到无冲突?--xunznux
    文章目录面试场景题:短URL生成器设计:百亿短URL怎样做到无冲突?1.需求分析2.短链接生成算法2.1自增法2.2散列函数法2.3预生成法3.部署模型3.1其他部署方案4.设计4.1重定向响应码4.2短URL预生成文件及预加载4.3用户自定义短URL4.4URLBase64编码4.5UR......
  • 面试场景题系列--(1)如果系统的 QPS 突然提升 10 倍该怎么设计?--xunznux
    1.如果系统的QPS突然提升10倍该怎么设计?1.1硬件的扩展+微服务的拆分如果所有的业务包括交易系统、会员信息、库存、商品等等都夹杂在一起,当流量一旦起来之后,单体架构的问题就暴露出来了,机器挂了所有的业务就全部无法使用了。于是,集群架构的架构开始出现,单机无法抗......
  • 掌握Postman中的分布式系统API测试:构建弹性架构的秘诀
    掌握Postman中的分布式系统API测试:构建弹性架构的秘诀在当今的软件开发中,分布式系统变得越来越普遍。这些系统由多个组件分布在不同的服务器或服务上,它们通过网络进行通信。测试分布式系统中的API交互是一个复杂但至关重要的任务。Postman,作为一个强大的API开发工具,提供了......