054 redisson
文章目录
- 使用Redisson演示可重入锁
- 读写锁
- 信号量
- 闭锁
- 获取三级分类redisson分布式锁
package com.xd.cubemall.product.config;import org.redisson.Redisson;
import org.redisson.api.RedissonClient;
import org.redisson.config.Config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class MyRedissonConfig {/*** 注册RedissonClient对象*/@Bean(destroyMethod="shutdown")RedissonClient redissonClient(){Config config = new Config();config.useSingleServer().setAddress("redis://127.0.0.1:6379");RedissonClient redissonClient = Redisson.create(config);return redissonClient;}}
使用Redisson演示可重入锁
/*** 使用Redisson演示可重入锁* @return*/@ResponseBody@GetMapping("/hello")public String hello(){//获取一把锁RLock lock = redissonClient.getLock("my-lock");//加锁lock.lock();try{System.out.println("加锁成功,执行业务。。。" + Thread.currentThread().getId());Thread.sleep(10000);} catch (Exception e) {e.printStackTrace();} finally {//解锁System.out.println("解锁。。。" + Thread.currentThread().getId());lock.unlock();}return "hello";}
读写锁
@GetMapping("/write")@ResponseBodypublic String writeValue(){//获取一把锁RReadWriteLock lock = redissonClient.getReadWriteLock("rw-lock");// 加 写锁String s = "";RLock writeLock = lock.writeLock();try{//1.改数据加 写锁,读数据加 读锁writeLock.lock();System.out.println("写锁加锁成功..." + Thread.currentThread().getId());s = UUID.randomUUID().toString();Thread.sleep(15000);redisTemplate.opsForValue().set("writeValue",s);} catch (Exception e) {e.printStackTrace();} finally {// 释放锁writeLock.unlock();System.out.println("写锁。。释放。。"+Thread.currentThread().getId());}return s;}@GetMapping("/read")@ResponseBodypublic String readValue(){RReadWriteLock lock = redissonClient.getReadWriteLock("rw-lock");String s = "";//加 读锁RLock readLock = lock.readLock();readLock.lock();try {System.out.println("读锁...加锁成功..."+Thread.currentThread().getId());s = redisTemplate.opsForValue().get("writeValue");} catch (Exception e) {e.printStackTrace();} finally {readLock.unlock();System.out.println("读锁。。释放。。。"+Thread.currentThread().getId());}return s;}
信号量
@GetMapping("/park")@ResponseBodypublic String park() throws InterruptedException {RSemaphore semaphore = redissonClient.getSemaphore("park");//当车位减少为0时,还想获取车位,必须要等go()调用时,释放一个车位,才能进行执行semaphore.acquire();//占有一个车位return "ok";}@GetMapping("/go")@ResponseBodypublic String go() {RSemaphore semaphore = redissonClient.getSemaphore("park");semaphore.release();return "ok";}
闭锁
@ResponseBody@GetMapping("/lockDoor")public String lockDoor() throws InterruptedException {RCountDownLatch door = redissonClient.getCountDownLatch("door");door.trySetCount(5);door.await();//等待其他闭锁都完成return "关门了";}@ResponseBody@GetMapping("/gogogo/{id}")public String gogogo(@PathVariable("id") Long id) {RCountDownLatch door = redissonClient.getCountDownLatch("door");door.countDown();//计数-1return id + "桌的人都走了。。。";}
获取三级分类redisson分布式锁
@Autowiredprivate RedissonClient redissonClient;/*** 获取三级分类(redisson分布式锁)* @return*/public List<CategoryVo> getCategoryJsonFromWithRedissonLock() {String uuid = UUID.randomUUID().toString();//1.占分布式RLock lock = redissonClient.getLock("CategoryJson-lock");lock.lock();List<CategoryVo> dataFromDb = null;try {dataFromDb = getDataFromDb();} finally {lock.unlock();}return dataFromDb;}
相关文章:
054 redisson
文章目录 使用Redisson演示可重入锁读写锁信号量闭锁获取三级分类redisson分布式锁 package com.xd.cubemall.product.config;import org.redisson.Redisson; import org.redisson.api.RedissonClient; import org.redisson.config.Config; import org.springframework.context…...
【数据结构】(12) 反射、枚举、lambda 表达式
一、反射 1、反射机制定义及作用 反射是允许程序在运行时检查和操作类、方法、属性等的机制,能够动态地获取信息、调用方法等。换句话说,在编写程序时,不需要知道要操作的类的具体信息,而是在程序运行时获取和使用。 2、反射机制…...
java实现二维码图片生成和编解码
java实现二维码图片生成和编解码 在wutool中,封装了二维码工具类,基于google的zxing库,实现二维码图片生成、编码和解码。 关于wutool wutool是一个java代码片段收集库,针对特定场景提供轻量解决方案,只要按需选择代…...
Java基础常见的面试题(易错!!)
面试题一:为什么 Java 不支持多继承 Java 不支持多继承主要是为避免 “菱形继承问题”(又称 “钻石问题”),即一个子类从多个父类继承到同名方法或属性时,编译器无法确定该调用哪个父类的成员。同时,多继承…...
hugging face---transformers包
一、前言 不同于计算机视觉的百花齐放,不同网络适用不同情况,NLP则由Transformer一统天下。transformer是2017年提出的一种基于自注意力机制的神经网络架构,transformers库是hugging face社区创造的一个py库,通过该库可以实现统一…...
网络安全防护指南:筑牢网络安全防线(510)
一、网络安全的基本概念 (一)网络的定义 网络是指由计算机或者其他信息终端及相关设备组成的按照一定的规则和程序对信息收集、存储、传输、交换、处理的系统。在当今数字化时代,网络已经成为人们生活和工作中不可或缺的一部分。它连接了世…...
微信小程序实现拉卡拉支付
功能需求:拉卡拉支付(通过跳转拉卡拉平台进行支付),他人支付(通过链接进行平台跳转支付) 1.支付操作 //支付 const onCanStartPay async (obj) > {uni.showLoading({mask: true})// 支付接口获取需要传…...
git从本地其他设备上fetch分支
在 Git 中,如果你想从本地其他设备上获取分支,可以通过以下几种方式实现。不过,需要注意的是,Git 本身是分布式版本控制系统,通常我们是从远程仓库(如 GitHub、GitLab 等)拉取分支,而…...
【干货教程】Windows电脑本地部署运行DeepSeek R1大模型(基于Ollama和Chatbox)
文章目录 一、环境准备二、安装Ollama2.1 访问Ollama官方网站2.2 下载适用于Windows的安装包2.3 安装Ollama安装包2.4 指定Ollama安装目录2.5 指定Ollama的大模型的存储目录 三、选择DeepSeek R1模型四、下载并运行DeepSeek R1模型五、常见问题解答六、使用Chatbox进行交互6.1 …...
基于 SSM框架 的 “捷邻小程序” 系统的设计与实现
大家好,今天要和大家聊的是一款基于 SSM框架 的 “捷邻小程序” 系统的设计与实现。项目源码以及部署相关事宜请联系我,文末附上联系方式。 项目简介 基于 SSM框架 的 “捷邻小程序” 系统设计与实现的主要使用者分为 管理员 和 用户,没有授…...
基于Springboot医院预约挂号小程序系统【附源码】
基于Springboot医院预约挂号小程序系统 效果如下: 小程序主页面 帖子页面 医生账号页面 留言内容页面 管理员主页面 用户管理页面 我的挂号页面 医生管理页面 研究背景 随着信息技术的飞速发展和互联网医疗的兴起,传统的医疗服务模式正面临着深刻的变…...
基于AVue的二次封装:快速构建后台管理系统的CRUD方案
基于AVue的二次封装:快速构建后台管理系统的CRUD方案 在开发后台管理系统时,表格是常见的组件之一。然而,使用原生的Element Plus实现CRUD(增删改查)功能往往需要编写大量重复代码,过程繁琐。即使借助类似…...
【含开题报告+文档+PPT+源码】基于springboot加vue 前后端分离的校园新闻审核发布管理系统
开题报告 本研究旨在设计并实现一套基于SpringBoot后端框架结合Vue前端技术的校园新闻发布系统,该系统面向学生用户群体提供了全面的功能服务。学生用户通过身份验证登录后,能够便捷高效地获取校园内的各类新闻资讯,实时了解校内动态。系统不…...
Qt 是一个跨平台的 C++ 应用程序框架
Qt 是一个跨平台的 C++ 应用程序框架,广泛用于开发图形用户界面(GUI)应用程序,也可以用于开发非 GUI 程序,如命令行工具和控制台应用程序。Qt 提供了丰富的类库和工具,支持多种操作系统,包括 Windows、macOS、Linux 等。 主要特点: 跨平台:Qt 支持多种操作系统,开发…...
2025年SCI一区智能优化算法:真菌生长优化算法(Fungal Growth Optimizer,FGO),提供MATLAB代码
一. 真菌生长优化算法(FGO) 真菌生长优化算法(Fungal Growth Optimizer,FGO)是一种新型的自然启发式元启发式算法,其灵感来源于自然界中真菌的生长行为。该算法通过模拟真菌的菌丝尖端生长、分支和孢子萌发…...
解决Spring Boot中Druid连接池“discard long time none received connection“警告
在使用Spring Boot结合Druid连接池时,开发者可能会遇到"discard long time none received connection"的警告信息。虽然这通常不会影响应用程序的正常运行,但这些警告信息可能会让人感到困扰。本文将探讨这个问题的原因,并提供几种…...
stm32常见的存储器应用
常用 STM32 存储器芯片介绍和应用 STM32 微控制器通常与多种存储器芯片一起工作,以下是几种常见的存储器类型及其应用: 1. 闪存(Flash Memory) STM32 内部的 闪存 是一种非易失性存储器,广泛用于存储程序代码和常驻…...
如何使用3D高斯分布进行环境建模
使用3D高斯分布来实现建模,主要是通过高斯分布的概率特性来描述空间中每个点的几何位置和不确定性。具体来说,3D高斯分布被用来表示点云数据中的每一个点或体素(voxel)的空间分布和不确定性,而不是单纯地存储每个点的坐…...
三级分类bug解决
文章目录 前端后端 前端 <!DOCTYPE html> <html xmlns:th"http://www.thymeleaf.org" lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0&q…...
AxiosError: Network Error
不知怎么的,项目还在开发阶段,之前还好好的,玩儿了两天再一打开发现页面无法显示数据了,报错如下: 我以为是后端出问题了,但是后端控制台无报错,又用postman测试了一下,可以获取到数…...
Xftp 7免费版隐藏功能大揭秘:从图像预览到OpenSSH证书认证,不止是传文件
Xftp 7进阶实战:解锁专业用户都在用的高效文件管理技巧 每次在服务器间来回传输日志文件时,我总忍不住想起第一次用Xftp 7的场景——那时我只把它当作普通FTP工具,直到偶然发现它的图像预览功能,才意识到自己错过了多少效率神器。…...
VS2019下OpenCV C++环境配置保姆级教程(附4.4.0版本动态库文件清单)
VS2019与OpenCV C环境配置:从避坑到精通的完整指南 在计算机视觉开发领域,OpenCV无疑是最受欢迎的库之一。然而对于刚接触C开发的初学者来说,配置开发环境往往成为第一道门槛。本文将深入剖析VS2019下OpenCV C环境配置的关键细节,…...
训练时train loss和val loss的‘爱恨情仇’:从曲线看懂模型到底在干嘛(附调参实战)
训练时train loss和val loss的‘爱恨情仇’:从曲线看懂模型到底在干嘛(附调参实战) 盯着训练日志里两条纠缠不清的loss曲线,是不是像在看一场情感大戏?train loss像热情似火的追求者,val loss则像若即若离的…...
AVR智能充电器PID控制程序(基于ATmega16/ATmega328)
一、系统硬件架构 1. 硬件连接方案 AVR ATmega16 ├── ADC0 (PC0) → 电池电压采样(分压电阻) ├── ADC1 (PC1) → 充电电流采样(分流电阻运放) ├── OC1A (PB1) → PWM输出 → MOSFET驱动 → 充电控制 ├── INT0 (PD2) →…...
SQL注入攻击与防御实战:手把手教你挖漏洞
三、防御方案。1.参数化查询:用Prepared Statements,用户输入当数据处理。PHP用PDO,Java用PreparedStatement。2.输入验证:白名单过滤危险字符单引号、分号等。3.使用ORM框架:Laravel、Hibernate等内置防注入。4.最小权…...
3分钟完成Windows和Office激活:KMS_VL_ALL_AIO智能激活工具终极指南
3分钟完成Windows和Office激活:KMS_VL_ALL_AIO智能激活工具终极指南 【免费下载链接】KMS_VL_ALL_AIO Smart Activation Script 项目地址: https://gitcode.com/gh_mirrors/km/KMS_VL_ALL_AIO 还在为Windows系统频繁弹出激活提示而烦恼吗?Office文…...
手把手教你用STM32标准库的SPI DMA,给1.3寸ST7789屏做一次“性能手术”
手把手教你用STM32标准库的SPI DMA,给1.3寸ST7789屏做一次“性能手术” 当你的嵌入式系统需要实时显示动态波形或流畅动画时,1.3寸ST7789屏幕的刷新率可能成为瓶颈。传统SPI驱动方式就像让CPU亲自搬运每一块砖头,而DMA技术则是请来一支专业的…...
HomeAssistant自动化进阶:让德业除湿机联动天气传感器,实现真正的智能除湿
HomeAssistant自动化进阶:德业除湿机与天气传感器的智能联动实战 最近在调试德业除湿机时发现,单纯依赖室外湿度作为触发条件存在明显缺陷——室内外湿度差异可能高达20%,且温度、人员活动等因素都会影响实际需求。本文将分享如何通过HomeAss…...
手把手教你用Keil MDK5和STM32F103ZET6给LVGL v7.1.0安个家(附DMA加速技巧)
STM32F103ZET6实战:Keil MDK5环境下的LVGL v7.1.0移植与DMA加速全解析 当一块800480的LCD屏幕遇上仅有64KB RAM的STM32F103ZET6,图形界面开发似乎成了不可能的任务。这正是LVGL(Light and Versatile Graphics Library)展现魔力的…...
告别NRZ,拥抱PAM-4:PCIe 6.0信号编码大升级,对硬件工程师意味着什么?
PCIe 6.0信号编码革命:硬件工程师的实战生存指南 当64GT/s的数据洪流撞上传统NRZ编码的物理极限,PAM-4就像一道闪电劈开了高速互连的迷雾。这不是简单的技术迭代,而是一场颠覆信号完整性认知的范式转移——每个电压电平间距压缩到1/3&#x…...
