秒杀
准备工作
我是参照下面这位大佬的i骄傲成下载的
csdn友情链接
Jmeter模拟多线程的压力测试工具
秒杀代码:
package com.aaa.controller;
import io.netty.util.internal.StringUtil;
import org.apache.commons.lang.StringUtils;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.Transaction;
import java.util.List;
import java.util.UUID;
/**
* @ fileName:SecKillController
* @ description:
* @ author:zyf
* @ createTime:2024/1/24 15:28
* @ version:1.0.0
*/
@RestController
@RequestMapping("/seckill")
public class SecKillController {
private String goods = "iphone15proMax";
@PostMapping
public void begin(String num){
//redis 存放商品的数量
Jedis jedis = new Jedis("192.168.37.22", 6379);
jedis.auth("111");
jedis.select(10);
jedis.set(goods,num);
}
@GetMapping
public void seckill(){
//进行秒杀
Jedis jedis = new Jedis("192.168.37.22", 6379);
jedis.auth("111");
jedis.select(10);
// 1.获取商品数量
String s = jedis.get(goods);
// 2.如果数量不为null或不为0
if (StringUtils.isBlank(s)){
System.out.println("秒杀还没有开始");
}else {
//监听数据
jedis.watch(goods);
//值>0
int i = Integer.parseInt(s);
if (i>0){
//组装事务
Transaction multi = jedis.multi();
//减少数量
multi.decr(goods);
multi.sadd("userlist", UUID.randomUUID().toString());
//Exec
List<Object> exec = multi.exec();
if (exec.size()==0||exec==null)
{
System.out.println("秒杀活动已经结束");
}else {
System.out.println("秒杀成功!!!!");
}
}
else {
System.out.println("秒杀活动已经结束");
}
}
// 3.数量有值 如果大于0,商品库存较少
// 4.如果不是秒杀活动结束
}
}
两个错误
a.开启使用后仍使用jedis
b.使用set来存储十个人的id ,set只能用来操作字符串
2.Redis持久化
2.1单节点redis的问题
数据丢失问题,
故障恢复问题
一旦宕机则会丢失数据,以及无法修复
并发能力问题,存储能力
单节点,无法处理并发 内存存储 存储能力差
2.2 RDB存储
2.2.1简介:
RDB全称Redis Database Backup file(Redis数据备份文件),也被叫做Redis数据快照。简单来说就是把内存中的所有数据都记录到磁盘中。当Redis实例故障重启后,从磁盘读取Snapshot快照文件,恢复数据。快照文件称为RDB文件,默认是保存在当前运行目录。
2.2.2save与bgsave
redis在停机时 会执行一次RDB
2.2.3配置快照时间间隔
2.2.4配置rdb文件名称
2.2.5配置是否压缩
2.2.6RDB原理
bgsave(异步持久化)开始时会fork主进程得到子进程,子进程共享主进程的内存数据。完成fork后读取内存数据并写入 RDB 文件。几乎是零阻塞的,但是主进程在fork子进程时不能干其他事
2.2.7RDB的缺点
RDB执行间隔时间长,两次RDB之间写入数据有丢失的风险fork子进程、压缩、写出RDB文件都比较耗时
2.3AOF
2.3.1配置开启AOF
2.3.2配置AOF命令记录频率
2.4. AOF和RDB同时开启,redis听谁的?
AOF和RDB同时开启,系统默认取AOF的数据(数据不会存在丢失)