1.下载安装启动redis 网上教程很多 不说了

2. 先创建一个简单的Springcloud项目

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.com.flybeer.demo</groupId><artifactId>cloud-demo</artifactId><packaging>pom</packaging><version>1.0-SNAPSHOT</version><modules><module>redis</module><module>redis2</module></modules><name>Maven</name><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding><java.version>1.8</java.version><spring-cloud.version>Hoxton.SR8</spring-cloud.version><mybatis.starter.version>1.3.2</mybatis.starter.version><mybatis-plus.verion>3.2.0</mybatis-plus.verion><mapper.starter.version>2.0.2</mapper.starter.version><druid.starter.version>1.1.9</druid.starter.version><mysql.version>5.1.6</mysql.version><pageHelper.starter.version>1.2.3</pageHelper.starter.version><yijin.latest.version>1.0.0-SNAPSHOT</yijin.latest.version><fastDFS.client.version>1.26.1-RELEASE</fastDFS.client.version><fastjson.version>1.2.3</fastjson.version><spring-boot-starter-redis.version>1.4.6.RELEASE</spring-boot-starter-redis.version><commons-pool2.version>2.9.0</commons-pool2.version><redis.clients.version>2.9.0</redis.clients.version></properties><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.4.1</version><relativePath/> <!-- lookup parent from repository --></parent><dependencyManagement><dependencies><!-- springCloud --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>${spring-cloud.version}</version><type>pom</type><scope>import</scope></dependency><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>${fastjson.version}</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-redis</artifactId><version>${spring-boot-starter-redis.version}</version></dependency><dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>${redis.clients.version}</version></dependency><!-- spring2.X集成redis所需common-pool2 --><dependency><groupId>org.apache.commons</groupId><artifactId>commons-pool2</artifactId><version>${commons-pool2.version}</version></dependency></dependencies></dependencyManagement><build></build>
</project>

3.创建一个小module

pom文件

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent><artifactId>cloud-demo</artifactId><groupId>com.com.flybeer.demo</groupId><version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion><artifactId>redis</artifactId>
<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId></dependency><!--集成redis--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency><dependency><groupId>org.apache.commons</groupId><artifactId>commons-pool2</artifactId></dependency><dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId></dependency><dependency><groupId>org.redisson</groupId><artifactId>redisson</artifactId><version>3.9.1</version></dependency><dependency><groupId>io.gitlab.wmwtr</groupId><artifactId>spring-boot-devtools</artifactId><version>1.0.0.RELEASE</version><classifier>sources</classifier><type>java-source</type></dependency></dependencies></project>

写yml

server:port: 1011
spring:redis:host: localhostpassword:port: 6379jedis1:pool:max-active: 8max-wait: -1max-idle: 1

创建com.flybeer.config.RedisConfig.java文件 把RedisTemplate<String, Serializable>,RedissonClient两个组件注入到springioc容器中

package com.flybeer.controller;import com.flybeer.unit.RedisUtils;
import com.flybeer.unit.ReturnUnit;import org.redisson.Redisson;
import org.redisson.api.RLock;
import org.redisson.api.RedissonClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.ApplicationContext;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.web.bind.annotation.*;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;import javax.annotation.Resource;
import java.io.Serializable;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.TimeUnit;@RestController
@RequestMapping("redis")
public class Controller {@Autowiredprivate RedisTemplate<String, Serializable> redisTemplate;@Value("${server.port}")private String port;@Autowiredprivate ApplicationContext applicationContext;@Autowiredprivate RedissonClient redissonClient;@GetMapping("/buyGoods")public Map<String,Object> buyGoods(@RequestParam(value = "goodsId") String goodsId){String goodsLock="goodsLock"+goodsId;String value=Thread.currentThread().getName();RLock lock = redissonClient.getLock(goodsLock);lock.lock();Boolean aBoolean = false;/*  do{aBoolean =redisTemplate.opsForValue().setIfAbsent(goodsLock,value,10,TimeUnit.SECONDS);} while (!aBoolean);*/try {Serializable serializable = redisTemplate.opsForValue().get(goodsId);int num = Integer.parseInt(serializable.toString());if(num>0){//每次购买1件 用redis的单词递减1完成Long decrement = redisTemplate.opsForValue().decrement(goodsId);System.out.println("购买成功,库存剩余"+decrement+"件");return ReturnUnit.successReturn("购买成功,库存剩余"+decrement+"件"+port);}else {return ReturnUnit.successReturn("购买失败,库存不足");}}finally {//判断是不是自己家锁 是的话删掉if (lock.isLocked()&&lock.isHeldByCurrentThread()){lock.unlock();}//护士的是手动实现分布式锁 不借用插件 挺麻烦的 想看看 不想看不看/*if (redisTemplate.opsForValue().get(goodsLock).toString().equals(value)){redisTemplate.delete(goodsLock);}*///该方法是使用事务的方式关闭锁,平时不用 但面试可能会问道/*redisTemplate.watch(goodsLock);while (true) {if (redisTemplate.opsForValue().get(goodsLock).equals(value)) {redisTemplate.setEnableTransactionSupport(true);redisTemplate.multi();redisTemplate.delete(goodsLock);List<Object> exec = redisTemplate.exec();if (exec == null) {continue;}}redisTemplate.unwatch();break;}*///利用lua(读音 撸啊)表达式/*Jedis jedis = RedisUtils.getJedisPool();String script="if redis.call(\"get\",KEYS[1]) == ARGV[1]\n" +"then\n" +"    return redis.call(\"del\",KEYS[1])\n" +"else\n" +"    return 0\n" +"end";try {Object eval = jedis.eval(script, Collections.singletonList(goodsLock), Collections.singletonList(value));if ("1".equals(eval.toString())){System.out.println("关闭锁成功");}else {System.out.println("关闭锁失败");}}finally {if(null!=jedis){jedis.close();}}*/}}//初始化一个商品数量 让上面用@PostMapping("/initializeGoods")public Map<String,Object> initializeGoods(@RequestParam(value = "goodsId") String goodsId,@RequestParam(value = "num") int num){Serializable andSet = redisTemplate.opsForValue().getAndSet(goodsId, num);System.out.println(andSet);return ReturnUnit.successReturn("初始化商品成功");}
}

4.复制一份上面的小module端口号改成1012

server:
#只改这里就好port: 1012
spring:redis:host: localhostpassword:port: 6379jedis1:pool:max-active: 8max-wait: -1max-idle: 1

5.配置nginx负载均衡

#user  nobody;worker_processes  1;
events {worker_connections  1024;
}
http {include       mime.types;default_type  application/octet-stream;proxy_buffer_size 128k;proxy_buffers 32 128k;proxy_busy_buffers_size 128k;sendfile        on;keepalive_timeout  65;#主要就配置了这一行upstream org.tonny.balance {server 127.0.0.1:1011 weight=1;server 127.0.0.1:1012 weight=1;}#主要就配置了这一行server {listen       80;server_name  localhost;# 不带数据的请求,包括restful风格的请求#主要就配置了这一行location / {proxy_pass   http://org.tonny.balance;}#主要就配置了这一行# 静态文件,从这里获取location ~* \.(css|gif|png|jpeg|ico|svg)$ {root D:/App/nginx/apache-tomcat-7.0.92_1/webapps/ROOT;}# jsp类型的请求,从这里走location ~ \.jsp$ {proxy_pass   http://org.tonny.balance;}error_page   500 502 503 504  /50x.html;location = /50x.html {root   html;}
}

一共配置了两行
然后用jMetry做测试 结果如下
1012

购买成功,库存剩余90件
购买成功,库存剩余84件
购买成功,库存剩余58件
购买成功,库存剩余57件
购买成功,库存剩余56件
购买成功,库存剩余55件
购买成功,库存剩余54件
购买成功,库存剩余52件
购买成功,库存剩余51件
购买成功,库存剩余50件
购买成功,库存剩余49件
购买成功,库存剩余47件
购买成功,库存剩余46件
购买成功,库存剩余45件
购买成功,库存剩余44件
购买成功,库存剩余43件
购买成功,库存剩余42件
购买成功,库存剩余41件
购买成功,库存剩余40件
购买成功,库存剩余39件
购买成功,库存剩余38件
购买成功,库存剩余37件
购买成功,库存剩余33件
购买成功,库存剩余32件
购买成功,库存剩余30件
购买成功,库存剩余29件
购买成功,库存剩余28件
购买成功,库存剩余27件
购买成功,库存剩余25件
购买成功,库存剩余24件
购买成功,库存剩余23件
购买成功,库存剩余22件
购买成功,库存剩余21件
购买成功,库存剩余20件
购买成功,库存剩余19件
购买成功,库存剩余18件
购买成功,库存剩余17件
购买成功,库存剩余16件
购买成功,库存剩余13件
购买成功,库存剩余12件
购买成功,库存剩余11件
购买成功,库存剩余10件
购买成功,库存剩余9件
购买成功,库存剩余8件
购买成功,库存剩余7件
购买成功,库存剩余6件
购买成功,库存剩余5件
购买成功,库存剩余4件
购买成功,库存剩余3件
1011

购买成功,库存剩余99件
购买成功,库存剩余98件
购买成功,库存剩余97件
购买成功,库存剩余96件
购买成功,库存剩余95件
购买成功,库存剩余94件
购买成功,库存剩余93件
购买成功,库存剩余92件
购买成功,库存剩余91件
购买成功,库存剩余89件
购买成功,库存剩余88件
购买成功,库存剩余87件
购买成功,库存剩余86件
购买成功,库存剩余85件
购买成功,库存剩余83件
购买成功,库存剩余82件
购买成功,库存剩余81件
购买成功,库存剩余80件
购买成功,库存剩余79件
购买成功,库存剩余78件
购买成功,库存剩余77件
购买成功,库存剩余76件
购买成功,库存剩余75件
购买成功,库存剩余74件
购买成功,库存剩余73件
购买成功,库存剩余72件
购买成功,库存剩余71件
购买成功,库存剩余70件
购买成功,库存剩余69件
购买成功,库存剩余68件
购买成功,库存剩余67件
购买成功,库存剩余66件
购买成功,库存剩余65件
购买成功,库存剩余64件
购买成功,库存剩余63件
购买成功,库存剩余62件
购买成功,库存剩余61件
购买成功,库存剩余60件
购买成功,库存剩余59件
购买成功,库存剩余53件
购买成功,库存剩余48件
购买成功,库存剩余36件
购买成功,库存剩余35件
购买成功,库存剩余34件
购买成功,库存剩余31件
购买成功,库存剩余26件
购买成功,库存剩余15件
购买成功,库存剩余14件
购买成功,库存剩余2件
购买成功,库存剩余1件
购买成功,库存剩余0件

redis简单分布式锁实现 超简单的那种相关推荐

  1. redis多服务器共享_基于redis和shedlock实现分布式锁(超简单)

    一.背景 线上部署了两台服务器,通过nginx轮询的方式进行负载均衡.但是这样存在一个问题同一个用户的session共享问题.你或许会说,使用ipHash模式就可以解决session共享的问题,是的确 ...

  2. Redis实现分布式锁

    目录 一.前言 为什么需要分布式锁? 二.基于redis实现分布式锁 为什么redis可以实现分布式锁? 如何实现? 锁的获取 锁的释放 三.如何避免死锁?锁的过期时间如何设置? 避免死锁 锁过期处理 ...

  3. redis做分布式锁可能不那么简单

    在计算机世界里,对于锁大家并不陌生,在现代所有的语言中几乎都提供了语言级别锁的实现,为什么我们的程序有时候会这么依赖锁呢?这个问题还是要从计算机的发展说起,随着计算机硬件的不断升级,多核cpu,多线程 ...

  4. 程序员修神之路--redis做分布式锁可能不那么简单

    点击上方"蓝字"带你去看小星星 菜菜哥,复联四上映了,要不要一起去看看? 又想骗我电影票,对不对? 呵呵,想去看了叫我呀 看来你工作不饱和呀 哪有,这两天我刚基于redis写了一个 ...

  5. redis mysql 解决超卖_Redis 分布式锁解决超卖问题

    Redis 分布式锁解决超卖问题 1,Redis 事物介绍 1. Redis 事物是可以一次执行多个命令, 本质是一组命令的集合. 2. 一个事务中的所有命令都会序列化, 按顺序串行化的执行而不会被其 ...

  6. 深入浅出 超详细 从 线程锁 到 redis 实现分布式锁(篇节 1)

    在 使用 redis 实现分布式锁 之前 我们需要先了解以下几点 什么是分布式锁 要介绍 什么是分布式锁,那首先要提到 与之对应的 的两个锁:线程锁 和 进程锁 1.线程锁 主要 用来 给方法.代码块 ...

  7. 07: redis分布式锁解决超卖问题

    07: redis分布式锁解决超卖问题 参考文章: (1)07: redis分布式锁解决超卖问题 (2)https://www.cnblogs.com/xiaonq/p/12328934.html 备 ...

  8. 深入浅出 超详细 从 线程锁 到 redis 实现分布式锁(篇节 2)

    redis 实现 分布式锁 上节 我们讲了 线程锁 在单体项目中的作用,和 放在 分布式 项目里产生的问题,那接下来我们就来解决 分布式 架构上怎么 保证 数据的一直性 使用 redisTemplat ...

  9. Redis实现分布式锁的深入探究

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 一.分布式锁简介 锁 是一种用来解决多个执行线程 访问共享资源 错 ...

最新文章

  1. linux shell seq 序列生成命令 可用于for循环 简介
  2. kafka-python 停止消费
  3. QMessageBox 使用方法
  4. uoj#188. 【UR #13】Sanrd(Min_25筛)
  5. 作为开发者发布小程序_如何建立个人品牌作为新开发者
  6. Python实现定时自动关闭的tkinter窗口
  7. maven仓库没有fastdfs_client.jar的解决方案
  8. 自学html多久能找到工作,学web前端需要多久? 自学多长时间能找到工作?
  9. java 拦截器的作用?
  10. java免费翻译api接口_多语言翻译api
  11. linux ssh密钥验证失败,连接Linux的服务器时使用SSH密钥认证及解决自动断连问题...
  12. 微信小程序必看api demo源码
  13. python游戏寻路_游戏服务端寻路的思路与实现
  14. unity3d 角色 武器 动画 和 blender 工作流
  15. 服务器安装sata固态硬盘吗,SATA接口固态硬盘安装教程
  16. ServiceNow在中国还有没有模仿者?
  17. 【软件】debussy安装过程记录
  18. LeetCode 881 救生艇
  19. css实现loading图标(2)
  20. oracle ora 3136,关于ORA-3136的处理思路

热门文章

  1. 生产日期当天算一天吗,保质期算当天吗 保质期最后一天算过期吗
  2. 【Unity】Unity内存管理与优化(一)内存域、堆栈、垃圾回收、内存泄漏、内存碎片
  3. 2023电工杯数学建模B题思路
  4. Android加载图片内存溢出问题解决方法
  5. 加载大图片,内存溢出问题
  6. timeit.Timer()与timeit.timeit()
  7. 协处理器CP15操作指令
  8. 【Tushare 大数据社区——解救你的财经数据需求】
  9. win10+CUDA10.1+cudnn7.6+MX250安装过程
  10. xcode登陆appleid报错:连接appleid服务器时出错