# Java-study4-seckilling **Repository Path**: weiranyi/java-study4-seckilling ## Basic Information - **Project Name**: Java-study4-seckilling - **Description**: 秒杀功能实现,围绕解决超卖以及库存遗留问题,使用了lua脚本;手机验证码redis实现 - **Primary Language**: Unknown - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2022-10-03 - **Last Updated**: 2022-10-03 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README - 秒杀功能实现 - SecKill1:发现超卖问题 - SecKill2:解决超卖问题,发现库存遗留问题 - SecKill3:通过lua脚本解决库存遗留问题,同时超卖问题也不存在 - 安装并发工具 ```bash [root@localhost ~]# yum -y install httpd-tools ``` - 命令: - -n: 请求的总数 - -c:同一时刻并发请求数 - -t:限制 - -s: 超时 - -p:指定文件 POST请求 - -U:指定文件 PUt请求 - -T:内容类型,application/x-www-form-urlencoded - -K:保持连接 ```bash # 在root目录下准备文件postfile,内容: prodid=0101& ab -n 1000 -c 100 -k -p ~/postfile -T application/x-www-form-urlencoded http://192.168.128.1:8080/Seckill/doseckill ``` - 知识笔记: - lua脚本具有原子性理解:一个Redis实例有一个Lua解释器,当解释器执行当前脚本时,其他lua脚本无法执行 - redis集群上存在多个实例,那么LUA解释器就存在多个,怎么确保原子性呢? - 因为Redis要求单个Lua脚本操作的key必须在同一个节点上,Cluster会将数据自动分布到不同的节点(虚拟的16384个slot) - 如果解释器执行一半失败了会发生什么事情? - lua若执行某个脚本失败,之前的数据会生效 - Redis Cluster(集群模式) - Redis3.0后出现,采用无中心结构,每个节点保存数据和整个集群状态,每个节点都和其他节点连接 - 官方要求至少6个节点,保证三主三从 - 各个节点采用gossip协议交换节点元数据信息 - 数据分散存储到各个节点上 - 不同于主从每个节点保存全量数据(数据存储一致,保证高可用),集群可以将多台比较弱的集群捆绑为大型集群应用,每个主 节点存储一部分数据,每个主节点后挂载与其实时同步的从属节点,以提供可用性支撑。集群模式突破原有单台redis的极限。 - 集群模式数据分散方式:集群模式采用Hash Slot(哈希槽)分配,集群预先分配16384个槽,初始化集群时平均规划给每一台 Redis Master;每个哈希槽都可以承载多个k-v数据; - 算法:crc16("test_key")%16384=3000 - 例子:master1(0~5460) master1(5461~10922) master1(10923~16383)