Redis3-秒杀活动

秒杀

准备工作

我是参照下面这位大佬的i骄傲成下载的

csdn友情链接  

Jmeter模拟多线程的压力测试工具

Redis3-秒杀活动_第1张图片

Redis3-秒杀活动_第2张图片

秒杀代码:

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 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只能用来操作字符串

Redis3-秒杀活动_第3张图片

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

Redis3-秒杀活动_第4张图片redis在停机时 会执行一次RDB

Redis3-秒杀活动_第5张图片

2.2.3配置快照时间间隔

Redis3-秒杀活动_第6张图片2.2.4配置rdb文件名称

Redis3-秒杀活动_第7张图片

2.2.5配置是否压缩

Redis3-秒杀活动_第8张图片2.2.6RDB原理

bgsave(异步持久化)开始时会fork主进程得到子进程,子进程共享主进程的内存数据。完成fork后读取内存数据并写入 RDB 文件。几乎是零阻塞的,但是主进程在fork子进程时不能干其他事

Redis3-秒杀活动_第9张图片2.2.7RDB的缺点

RDB执行间隔时间长,两次RDB之间写入数据有丢失的风险fork子进程、压缩、写出RDB文件都比较耗时

2.3AOF

Redis3-秒杀活动_第10张图片2.3.1配置开启AOF

Redis3-秒杀活动_第11张图片2.3.2配置AOF命令记录频率

Redis3-秒杀活动_第12张图片

2.4. AOF和RDB同时开启,redis听谁的?

AOF和RDB同时开启,系统默认取AOF的数据(数据不会存在丢失)

你可能感兴趣的:(redis,git)