秒杀
准备工作
我是参照下面这位大佬的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";@PostMappingpublic void begin(String num){//redis 存放商品的数量Jedis jedis = new Jedis("192.168.37.22", 6379);jedis.auth("111");jedis.select(10);jedis.set(goods,num);}@GetMappingpublic 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或不为0if (StringUtils.isBlank(s)){System.out.println("秒杀还没有开始");}else {//监听数据jedis.watch(goods);//值>0int i = Integer.parseInt(s);if (i>0){//组装事务Transaction multi = jedis.multi();//减少数量multi.decr(goods);multi.sadd("userlist", UUID.randomUUID().toString());//ExecList<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的数据(数据不会存在丢失)