11、Redis_事务_秒杀案例

news2024/11/25 20:15:51

文章目录

  • 11、Redis_事务_秒杀案例
    • 11.1 解决计数器和人员记录的事务操作
    • 11.2 Redis事务--秒杀并发模拟
      • 11.2.1 联网
      • 11.2.2 无网络
      • 11.2.3 测试及结果
        • 11.2.3.1 通过ab测试
        • 11.2.3.2 超卖
    • 11.3 超卖问题
    • 11.4 利用乐观锁淘汰用户,解决超卖问题。
    • 11.5 继续增加并发测试
      • 11.5.1 连接有限制
      • 11.5.2 已经秒光,可是还有库存
      • 11.5.3 连接超时,通过连接池解决
      • 11.5.4 连接池
    • 11.6 解决库存遗留问题
      • 11.6.1 LUA脚本
      • 11.6.2 LUA脚本在Redis中的优势
    • 11.7 Redis_事务_秒杀案例_代码
      • 11.7.1 项目结构
      • 11.7.2 第一版:简单版
      • 11.7.3 第二版:加事务-乐观锁(解决超卖),但出现遗留库存和连接超时
      • 11.7.4 第三版:连接池解决超时问题
      • 11.7.5 第四版:解决库存依赖问题,LUA脚本


Redis 6 入门到精通-讲师:王泽

世态炎凉,世界并不善良

11、Redis_事务_秒杀案例

11.1 解决计数器和人员记录的事务操作

在这里插入图片描述
视频使用的是javaWeb,我为了省事,使用StringBoot

Service层

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;

@Service
public class Seckill_redis {

    @Autowired
    private RedisTemplate redisTemplate;

    // 秒杀过程
    public boolean doSecKill(String uid, String prodid) {
        // 1.uid和prodid非空判断
        if (uid == null || prodid == null) {
            return false;
        }
        // 2.连接redis,就是用spring的RedisTemplate
        // 3.拼接key
        // 3.1库存key
        String kcKey = "sk:" + prodid + ":qt";
        // 3.2秒杀成功用户的key
        String userKey = "sk:" + prodid + ":user";
        // 4.获取库存,如果库存null,秒杀还没有开始,这里redis存的就是数字,不是字符串
        Integer kc = (Integer) redisTemplate.opsForValue().get(kcKey);
        if (kc == null) {
            System.out.println("秒杀还没有开始,请稍后");
            return false;
        }

        // 5.判断用户是否做重复秒杀操作
        if (redisTemplate.opsForSet().isMember(userKey, uid)) {
            System.out.println("已经秒杀成功,不能在重复秒杀");
            return false;
        }
        // 6.判断商品的数量,库存数量小于1,秒杀结束
        if (kc <= 0) {
            System.out.println("秒杀已经结束了");
            return false;
        }
        // 7.秒杀过程
        // 7.1 库存-1
        redisTemplate.opsForValue().decrement(kcKey);
        // 7.2 把秒杀成功用户添加清单里面
        redisTemplate.opsForSet().add(userKey,uid);
        System.out.println("秒杀陈功");
        return true;
    }
}

Controller层

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import pers.tianyu.redis_springboot.service.Seckill_redis;

import java.util.Random;
import java.util.UUID;

@RestController
@RequestMapping("/rediTest")
public class RedisTest {

    @Autowired
    private Seckill_redis seckill_redis;

    // 秒杀
    @RequestMapping("/doSecKill")
    public boolean doSecKill(@RequestParam("prodid") String prodid) {
        String userid = new Random().nextInt(5000) + "";
        return seckill_redis.doSecKill(userid,prodid);
    }
}

没有做前台页面,使用浏览器直接访问,url传值。
http://localhost:8080/rediTest/doSecKill?prodid=0101
在这里插入图片描述
在这里插入图片描述

连续秒杀,查看redis

127.0.0.1:6379> keys *
1) "sk:0101:user"
2) "sk:0101:qt"
127.0.0.1:6379> get sk:0101:qt
"0"
127.0.0.1:6379> smembers sk:0101:user
 1) "\"2579\""
 2) "\"2438\""
 3) "\"3398\""
 4) "\"2307\""
 5) "\"4449\""
 6) "\"3773\""
 7) "\"4191\""
 8) "\"2542\""
 9) "\"3628\""
10) "\"389\""

11.2 Redis事务–秒杀并发模拟

使用工具ab模拟测试
CentOS6 默认安装
CentOS7需要手动安装

11.2.1 联网

yum install httpd-tools

[root@centos7-101 ~]# yum install httpd-tools
已加载插件:fastestmirror, langpacks
Determining fastest mirrors
 * base: mirrors.bfsu.edu.cn
 * extras: mirrors.bfsu.edu.cn
 * updates: mirrors.bfsu.edu.cn
base                                                      | 3.6 kB  00:00:00     
extras                                                    | 2.9 kB  00:00:00     
updates                                                   | 2.9 kB  00:00:00     
正在解决依赖关系
--> 正在检查事务
---> 软件包 httpd-tools.x86_64.0.2.4.6-97.el7.centos.5 将被 安装
--> 正在处理依赖关系 libaprutil-1.so.0()(64bit),它被软件包 httpd-tools-2.4.6-97.el7.centos.5.x86_64 需要
--> 正在处理依赖关系 libapr-1.so.0()(64bit),它被软件包 httpd-tools-2.4.6-97.el7.centos.5.x86_64 需要
--> 正在检查事务
---> 软件包 apr.x86_64.0.1.4.8-7.el7 将被 安装
---> 软件包 apr-util.x86_64.0.1.5.2-6.el7 将被 安装
--> 解决依赖关系完成

依赖关系解决

=================================================================================
 Package           架构         版本                         源             大小
=================================================================================
正在安装:
 httpd-tools       x86_64       2.4.6-97.el7.centos.5        updates        94 k
为依赖而安装:
 apr               x86_64       1.4.8-7.el7                  base          104 k
 apr-util          x86_64       1.5.2-6.el7                  base           92 k

事务概要
=================================================================================
安装  1 软件包 (+2 依赖软件包)

总下载量:290 k
安装大小:584 k
Is this ok [y/d/N]: y
Downloading packages:
(1/3): apr-1.4.8-7.el7.x86_64.rpm                         | 104 kB  00:00:00     
(2/3): apr-util-1.5.2-6.el7.x86_64.rpm                    |  92 kB  00:00:00     
(3/3): httpd-tools-2.4.6-97.el7.centos.5.x86_64.rpm       |  94 kB  00:00:00     
---------------------------------------------------------------------------------
总计                                                260 kB/s | 290 kB  00:01     
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
  正在安装    : apr-1.4.8-7.el7.x86_64                                       1/3 
  正在安装    : apr-util-1.5.2-6.el7.x86_64                                  2/3 
  正在安装    : httpd-tools-2.4.6-97.el7.centos.5.x86_64                     3/3 
  验证中      : apr-1.4.8-7.el7.x86_64                                       1/3 
  验证中      : httpd-tools-2.4.6-97.el7.centos.5.x86_64                     2/3 
  验证中      : apr-util-1.5.2-6.el7.x86_64                                  3/3 

已安装:
  httpd-tools.x86_64 0:2.4.6-97.el7.centos.5                                     

作为依赖被安装:
  apr.x86_64 0:1.4.8-7.el7             apr-util.x86_64 0:1.5.2-6.el7            

完毕!

查看工具

[root@centos7-101 ~]# ab --help
ab: wrong number of arguments
Usage: ab [options] [http[s]://]hostname[:port]/path
Options are:
    # 当前的请求次数
    -n requests     Number of requests to perform
    # 当前的并发次数
    -c concurrency  Number of multiple requests to make at a time
    -t timelimit    Seconds to max. to spend on benchmarking
                    This implies -n 50000
    -s timeout      Seconds to max. wait for each response
                    Default is 30 seconds
    -b windowsize   Size of TCP send/receive buffer, in bytes
    -B address      Address to bind to when making outgoing connections
    # 使用post提交,里面有参数,将参数放在一个postfile文件中,进行提交
    -p postfile     File containing data to POST. Remember also to set -T
    -u putfile      File containing data to PUT. Remember also to set -T
    # 如果提交使用post或put,需要设置数据类型为'application/x-www-form-urlencoded'
    -T content-type Content-type header to use for POST/PUT data, eg.
                    'application/x-www-form-urlencoded'
                    Default is 'text/plain'
    -v verbosity    How much troubleshooting info to print
    -w              Print out results in HTML tables
    -i              Use HEAD instead of GET
    -x attributes   String to insert as table attributes
    -y attributes   String to insert as tr attributes
    -z attributes   String to insert as td or th attributes
    -C attribute    Add cookie, eg. 'Apache=1234'. (repeatable)
    -H attribute    Add Arbitrary header line, eg. 'Accept-Encoding: gzip'
                    Inserted after all normal header lines. (repeatable)
    -A attribute    Add Basic WWW Authentication, the attributes
                    are a colon separated username and password.
    -P attribute    Add Basic Proxy Authentication, the attributes
                    are a colon separated username and password.
    -X proxy:port   Proxyserver and port number to use
    -V              Print version number and exit
    -k              Use HTTP KeepAlive feature
    -d              Do not show percentiles served table.
    -S              Do not show confidence estimators and warnings.
    -q              Do not show progress when doing more than 150 requests
    -g filename     Output collected data to gnuplot format file.
    -e filename     Output CSV file with percentages served
    -r              Don't exit on socket receive errors.
    -h              Display usage information (this message)
    -Z ciphersuite  Specify SSL/TLS cipher suite (See openssl ciphers)
    -f protocol     Specify SSL/TLS protocol
                    (SSL3, TLS1, TLS1.1, TLS1.2 or ALL)

11.2.2 无网络

(1) 进入cd /run/media/root/CentOS 7 x86_64/Packages(路径跟centos6不同)
(2) 顺序安装
apr-1.4.8-3.el7.x86_64.rpm
apr-util-1.5.2-6.el7.x86_64.rpm
httpd-tools-2.4.6-67.el7.centos.x86_64.rpm

11.2.3 测试及结果

11.2.3.1 通过ab测试

-n:请求次数。

-c:当前的并发次数。

-T:如果使用pust或put提交,要设置参数类型。

-p:设置一个文件,文件内放的参数就是post提交的参数。

vim postfile 模拟表单提交参数,以&符号结尾;存放当前目录。
内容:prodid=0101&

ab -n 1000 -c 100 -p ~/postfile -T application/x-www-form-urlencoded http://192.168.0.110:8080/rediTest/doSecKill
注意:如果访问ip地址或者端口号写错了,会出现apr_socket_recv: Connection refused (111)

将项目运行,redis数据还原。

11.2.3.2 超卖

在这里插入图片描述

127.0.0.1:6379> smembers sk:0101:user
 1) "\"3502\""
 2) "\"916\""
 3) "\"3528\""
 4) "\"1546\""
 5) "\"4475\""
 6) "\"3519\""
 7) "\"3078\""
 8) "\"833\""
 9) "\"941\""
10) "\"3422\""
11) "\"3473\""
12) "\"971\""
13) "\"103\""
14) "\"1108\""
15) "\"4012\""
16) "\"1190\""
17) "\"4368\""
18) "\"4997\""
19) "\"1101\""
20) "\"4205\""
21) "\"508\""
22) "\"648\""
23) "\"1978\""
24) "\"282\""
25) "\"4356\""
26) "\"1916\""
27) "\"3859\""
28) "\"4140\""
29) "\"2764\""
30) "\"933\""
31) "\"963\""
32) "\"2966\""
33) "\"4778\""
34) "\"3599\""
35) "\"3988\""
36) "\"3197\""
37) "\"2303\""
38) "\"2616\""
39) "\"3480\""
40) "\"4748\""
41) "\"2374\""
42) "\"2503\""
43) "\"4448\""
44) "\"360\""
45) "\"4077\""
46) "\"2537\""
47) "\"94\""
48) "\"4038\""
49) "\"3575\""
50) "\"741\""
51) "\"3309\""
52) "\"44\""
53) "\"376\""
54) "\"915\""
55) "\"1993\""
56) "\"636\""
57) "\"3319\""
58) "\"4324\""
59) "\"3856\""
60) "\"3462\""
61) "\"1238\""
62) "\"834\""
63) "\"3129\""
64) "\"4625\""
65) "\"1668\""
66) "\"1864\""
67) "\"4707\""
68) "\"3866\""
69) "\"4514\""
70) "\"3914\""
71) "\"2900\""
72) "\"867\""
73) "\"1267\""
74) "\"2535\""
75) "\"3024\""
76) "\"919\""
77) "\"1086\""
78) "\"389\""
79) "\"3898\""
80) "\"594\""
81) "\"2430\""
82) "\"484\""
83) "\"2192\""
84) "\"4715\""
85) "\"4313\""
86) "\"3600\""
87) "\"3275\""
88) "\"1184\""
89) "\"1742\""
90) "\"1195\""
91) "\"4737\""
92) "\"3685\""
93) "\"140\""
94) "\"4487\""
95) "\"1707\""
96) "\"3775\""
97) "\"3831\""
98) "\"158\""
99) "\"4429\""
127.0.0.1:6379> get sk:0101:qt
"-91"

11.3 超卖问题

在这里插入图片描述

11.4 利用乐观锁淘汰用户,解决超卖问题。

在这里插入图片描述


//增加乐观锁
jedis.watch(qtkey);
 
//3.判断库存
String qtkeystr = jedis.get(qtkey);
if(qtkeystr==null || "".equals(qtkeystr.trim())) {
System.out.println("未初始化库存");
jedis.close();
return false ;
}
 
int qt = Integer.parseInt(qtkeystr);
if(qt<=0) {
System.err.println("已经秒光");
jedis.close();
return false;
}
 
//增加事务
Transaction multi = jedis.multi();
 
//4.减少库存
//jedis.decr(qtkey);
multi.decr(qtkey);
 
//5.加人
//jedis.sadd(usrkey, uid);
multi.sadd(usrkey, uid);
 
//执行事务
List<Object> list = multi.exec();
 
//判断事务提交是否失败
if(list==null || list.size()==0) {
System.out.println("秒杀失败");
jedis.close();
return false;
}
System.err.println("秒杀成功");
jedis.close();	 

在这里插入图片描述
在这里插入图片描述

11.5 继续增加并发测试

11.5.1 连接有限制

ab -n 2000 -c 300 -p ~/postfile -T application/x-www-form-urlencoded http://192.168.0.101:8080/rediTest/doSecKill

增加-r参数,-r Don’t exit on socket receive errors.
ab -n 2000 -c 300 -p ~/postfile -T application/x-www-form-urlencoded http://192.168.0.101:8080/rediTest/doSecKill
在这里插入图片描述

11.5.2 已经秒光,可是还有库存

ab -n 2000 -c 300 -p ~/postfile -T application/x-www-form-urlencoded http://192.168.0.101:8080/rediTest/doSecKill

已经秒光,可是还有库存。

原因,就是乐观锁导致很多请求都失败。

先点的没秒到,后点的可能秒到了。

在这里插入图片描述

11.5.3 连接超时,通过连接池解决

在这里插入图片描述

11.5.4 连接池

节省每次连接redis服务带来的消耗,把连接好的实例反复利用。
通过参数管理连接的行为
代码见项目中

  • 链接池参数
    • MaxTotal:控制一个pool可分配多少个jedis实例,通过pool.getResource()来获取;如果赋值为-1,则表示不限制;如果pool已经分配了MaxTotal个jedis实例,则此时pool的状态为exhausted。
    • maxIdle:控制一个pool最多有多少个状态为idle(空闲)的jedis实例;
    • MaxWaitMillis:表示当borrow一个jedis实例时,最大的等待毫秒数,如果超过等待时间,则直接抛JedisConnectionException;
    • testOnBorrow:获得一个jedis实例的时候是否检查连接可用性(ping());如果为true,则得到的jedis实例均是可用的;

连接池工具类

public class JedisPoolUtil {
    private static volatile JedisPool jedisPool = null;

    private JedisPoolUtil(){
    }

    public static JedisPool getJedisPoolInstance(){
        if (null == jedisPool){
            synchronized (JedisPoolUtil.class){
                if (null == jedisPool){
                    JedisPoolConfig poolConfig = new JedisPoolConfig();
                    poolConfig.setMaxTotal(200);
                    poolConfig.ssetMaxIdle(32);
                    poolConfig.setMaxWaitMillis(100*1000);
                    poolConfig.setBlockWhenExhausted(true);
                    poolConfig.setTestOnBorrow(true);
                    jedisPool = new JedisPool(poolConfig,"192.168.0.101",6379,60000);
                }
            }
        }
        return jedisPool;
    }

    public static void release(JedisPool jedisPool, Jedis jedis){
        if (null != jedis){
            jedisPool.returnResource(jedis);
        }
    }
}

11.6 解决库存遗留问题

11.6.1 LUA脚本

在这里插入图片描述

Lua 是一个小巧的脚本语言,Lua脚本可以很容易的被C/C++ 代码调用,也可以反过来调用C/C++的函数,Lua并没有提供强大的库,一个完整的Lua解释器不过200k,所以Lua不适合作为开发独立应用程序的语言,而是作为嵌入式脚本语言。
很多应用程序、游戏使用LUA作为自己的嵌入式脚本语言,以此来实现可配置性、可扩展性。
这其中包括魔兽争霸地图、魔兽世界、博德之门、愤怒的小鸟等众多游戏插件或外挂。
w3cschool教程

11.6.2 LUA脚本在Redis中的优势

将复杂的或者多步的redis操作,写为一个脚本,一次提交给redis执行,减少反复连接redis的次数。提升性能。

LUA脚本是类似redis事务,有一定的原子性,不会被其他命令插队,可以完成一些redis事务性的操作。

但是注意redis的lua脚本功能,只有在Redis 2.6以上的版本才可以使用。

利用lua脚本淘汰用户,解决超卖问题。

redis 2.6版本以后,通过lua脚本解决争抢问题,实际上是redis 利用其单线程的特性,用任务队列的方式解决多任务并发问题。
在这里插入图片描述

11.7 Redis_事务_秒杀案例_代码

11.7.1 项目结构

在这里插入图片描述

11.7.2 第一版:简单版

老师点10次,正常秒杀。

同学一起点试一试,秒杀也是正常的。

这是因为还达不到并发的效果。

使用工具ab模拟并发测试,会出现超卖情况。

查看库存会出现负数。

11.7.3 第二版:加事务-乐观锁(解决超卖),但出现遗留库存和连接超时

11.7.4 第三版:连接池解决超时问题

// 通过连接池得到jedis对象
JedisPool jedisPoolInstance = JedisPoolUtil.getJedisPoolInstance();
Jedis jedis = jedisPoolInstance.getResource();

11.7.5 第四版:解决库存依赖问题,LUA脚本

local userid=KEYS[1]; 
local prodid=KEYS[2];
local qtkey="sk:"..prodid..":qt";
local usersKey="sk:"..prodid.":usr'; 
local userExists=redis.call("sismember",usersKey,userid);
if tonumber(userExists)==1 then 
  return 2;
end
local num= redis.call("get" ,qtkey);
if tonumber(num)<=0 then 
  return 0; 
else 
  redis.call("decr",qtkey);
  redis.call("sadd",usersKey,userid);
end
return 1;

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

发布一个简单的npm包简单流程(图文并茂,你必懂)

目录 前言&#xff1a; 1.发布前的代码基本配置 A.创建文件夹 B.npm init/npm init -y初始化项目 C.配置package.json文件 D.创建index.js文件 E.创建README.md文件 F.最基本的目录结构 2.账号注册 3.登录npm账号 A.使用cmd进行登录 B.使用nrm工具 C.成功登录 4.发…

1、浮动(float)

提示&#xff1a;我们一般网页上下用标准流&#xff0c;左右用浮动来写 1.1传统网页布局三种方式 网页布局本质——用css来摆放盒子&#xff0c;把盒子摆放到相应位置。css提供了三种传统布局简单方式&#xff0c;说就是盒子如何进行排列顺序&#xff1a; 普通流&#xff08;或…

面试蚂蚁(P7)竟被MySQL难倒,奋发图强后二次面试入职蚂蚁金服

爱因斯坦说过“耐心和恒心总会得到报酬的”&#xff0c;我也一直把这句话当做自己的座右铭&#xff0c;这句箴言在今年也彻底在“我”身上实现了。 每一个程序员都拥有一座大厂梦&#xff0c;我也不例外&#xff0c;去年面试蚂蚁金服&#xff0c;竟然被MySQL问倒了&#xff0c…

【Flask框架】——16 Jinja2模板

文章目录Jinja2模板一、Jinja2模板介绍1.模板传参2.语法二、表达式三、控制语句1.条件判断语句2.for循环语句&#xff1a;四、过滤器1.什么是过滤器2.字符串的过滤器3.数值过滤器4.列表相关过滤器5.字典相关过滤器6.自定义过滤器五、测试器1.Jinja2中内置的测试器2.自定义测试器…

配置NTP时间同步之Linux

一&#xff1a;NTP是网络时间同步协议&#xff0c;就是用来同步网络中各个计算机的时间的协议。 二&#xff1a;NTP服务端配置 1.检查系统是否安装了NTP包&#xff08;Linux一般自带NTP4.2&#xff09;&#xff0c;没有安装我们直接使用yum命令在线安装&#xff1a; yum inst…

Spring Boot整合Swagger3.0及Knife4j

一、什么是 Swagger Swagger是一组围绕 OpenAPI 规范构建的开源工具&#xff0c;可帮助您设计、构建、记录和使用 REST API。主要的 Swagger 工具包括&#xff1a; Swagger Editor – 基于浏览器的编辑器&#xff0c;您可以在其中编写 OpenAPI 规范。 Swagger UI – 将 OpenA…

非零基础自学Golang 第7章 函数 7.8 知识拓展

非零基础自学Golang 文章目录非零基础自学Golang第7章 函数7.8 知识拓展7.8.1 函数参数传递的本质7.8.2 Go内置函数第7章 函数 7.8 知识拓展 7.8.1 函数参数传递的本质 在讲述参数传递前&#xff0c;我们首先要了解两个基本概念&#xff1a;值传递和引用传递。 值传递&…

API接口DTO测试数据构造的一个方式

自动化测试中&#xff0c;经常需要构造请求参数&#xff0c;例如JSON格式的参数&#xff0c;简单的好说&#xff0c;可以手工修改或是用 Postman、Jmeter 等工具结合简单的代码进行处理&#xff0c; 但当数据传输对象&#xff08;DTO&#xff09;很复杂&#xff0c;部分字段依赖…

同样是项目经理,为啥就干不过他?

早上好&#xff0c;我是老原。 很多人和我抱怨说&#xff0c;做工作太难了&#xff0c;领导针对我&#xff0c;同样都是项目经理&#xff0c;就老是挑我的刺&#xff0c;找我的麻烦。 其实在我看来&#xff0c;工作其实没有那么难&#xff0c;80%的工作问题&#xff0c;都是沟…

C#语言实例源码系列-虚拟键盘

专栏分享点击跳转>Unity3D特效百例点击跳转>案例项目实战源码点击跳转>游戏脚本-辅助自动化点击跳转>Android控件全解手册 &#x1f449;关于作者 众所周知&#xff0c;人生是一个漫长的流程&#xff0c;不断克服困难&#xff0c;不断反思前进的过程。在这个过程中…

guitar pro8吉他谱软件好用吗?2023GTP全新功能解析

我们常见的GTP格式吉他谱就是用这款软件制作出来的曲谱&#xff0c;也只能用这款软件打开查看。看介绍感觉还不错&#xff0c;原生支持Apple的芯片了。这也是一款能陪着我们一起进步&#xff0c;提升自己的软件。我们在练习吉他等乐器的过程中&#xff0c;音阶与和弦的熟练掌握…

ffmpeg-AVBuffer、AVBufferRef、引用计数机制

目录 引用计数 定义 优点 AVBuffer AVBufferRef av_buffer_create av_buffer_ref av_buffer_unref 参考&#xff1a; 引用计数 定义 引用计数是一种内存管理的方式&#xff0c;当一份内存可能被多个对象使用&#xff0c;可以通过引用计数的方式实现内存复用。 优点 …

深入理解Maven的各项配置

深入理解Maven的各项配置1. Introduction1.1 Big Data -- Postgres2. Install2.1 Maven Install2.2 Config Setting.xml2.3 Local Package Install Maven3. Project4.AwakeningMaven Document: https://maven.apache.org/. Maven Download: https://maven.apache.org/download.…

基于微信小程序的好物分享系统ssm框架-计算机毕业设计

项目介绍 我国经济迅速发展&#xff0c;人们对手机的需求越来越大&#xff0c;各种手机软件也都在被广泛应用&#xff0c;但是对于手机进行数据信息管理&#xff0c;对于手机的各种软件也是备受用户的喜爱&#xff0c;好物分享系统小程序被用户普遍使用&#xff0c;为方便用户…

【技术应用】mybatis数据库操作(insert、update、delete)返回值为0的场景

【技术应用】mybatis数据库操作insert、update、delete返回值为0的场景一、前言二、数据库异常处理三、insert操作返回值为: 0四、update操作返回值为: 0五、delete操作返回值为: 0六、总结一、前言 最近在review项目组成员代码时&#xff0c;发现代码中有很多mybatis执行数据…

涉及准考证相关需要关注的一系列问题,涉及防疫、考点信息、计算器等内容

12月14日起可以打印准考证&#xff01;这是一件操作并不复杂的工作&#xff0c;但打印下来以后可能会遇到一些细节问题&#xff0c;对此我们梳理出来供大家参考&#xff0c;有则改之&#xff0c;无则更好&#xff01; 1.有关省份个人健康申报表等如何填写&#xff1f;如您报考点…

web网页设计期末课程大作业:美食餐饮文化主题网站设计——美食汇5页HTML+CSS+JavaScript

&#x1f380; 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业…

事业编招聘:南方科技大学附属实验学校2022年·面向应届毕业生招聘在编教师公告

南方科技大学是在中国高等教育改革发展背景下创建的一所高起点公办创新型大学&#xff0c;2022年2月14日&#xff0c;教育部等三部委公布第二轮“双一流”建设高校及建设学科名单&#xff0c;南方科技大学入选“双一流”建设高校名单。 南方科技大学附属实验学校&#xff0c;地…

部署了一个个人博客(好歹服务器不是闲着了)

界面前台界面展示&#xff08;给到浏览用户&#xff09;后台界面展示&#xff08;简单介绍&#xff09;技术说明前台界面展示&#xff08;给到浏览用户&#xff09; 肯定首先将界面展示一下。声明一下这个不是我原创的界面&#xff0c;当然这个是可以改造的。这个在安全上还有…

血氧仪的分类与价格区别

有没有发现最近血氧仪、额温枪、壁挂式测温仪又开始火了&#xff1f;并且市场活跃度越来越高。而作为我们血氧仪方案提供商或者生产企业来说&#xff0c;您是不是和优优一样会时常听到客户发出如下反馈&#xff1a; “我刚问了另外一家&#xff0c;和你这个样子差不多的&#…