1、基本概念

2、信号量类

3、测试类

4、测试日志

基本概念

计数信号量是一种锁,它可以让用户限制一项资源最多能够同时被多少个进程访问,

技术信号量和其他锁的区别:当客户端获取锁失败时,客户端会选择等待;而获取信号量失败时,通常直接退出,并向用户提示“资源繁忙”,由用户决定下一步如何处理。

信号量类

import java.util.UUID;

import redis.clients.jedis.Jedis;
import redis.clients.jedis.Pipeline;
import redis.clients.jedis.Response; public class Semaphore_Lock {
public static String acquire_semaphore(Jedis redis,String sem_name,int limit,long timeout){
String identifier=UUID.randomUUID().toString();
long now=System.currentTimeMillis();
Pipeline pipeline=redis.pipelined();
//清理其他持有者过期信号量
pipeline.zremrangeByScore(sem_name, 0, now-timeout);
pipeline.zadd(sem_name,now,identifier);
Response<Long> rank=pipeline.zrank(sem_name, identifier);
pipeline.syncAndReturnAll();
if((Long)rank.get()<limit){
System.out.println(Thread.currentThread().getName()+" identifier rank :"+rank.get());
return identifier;
}else{
System.out.println(Thread.currentThread().getName()+" identifier rank :"+rank.get()+",too late");
}
redis.zrem(sem_name, identifier);
return null;
}
public static Long release_semaphore(Jedis redis,String sem_name,String identifier){
return redis.zrem(sem_name, identifier);
}
}

测试类

import redis.clients.jedis.Jedis;

public class TestSemaphore_Lock {
public static void main(String[] args) {
System.out.println( " main start");
for (int i = ; i < ; i++) {
Test_Thread_lock threadA = new Test_Thread_lock();
threadA.start();
try {
// Thread.sleep(1);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
} class Test_Thread_lock extends Thread { public void run() {
System.out.println(Thread.currentThread().getName() + " 启动运行");
Jedis redis=JedisUtil.getJedis();
while(true){
if(redis==null){
redis=JedisUtil.getJedis();
System.out.println(Thread.currentThread().getName() + " 获取redis连接失败,等待几秒后,继续尝试获取.conn conn conn");
try {
sleep();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
continue;
}
String indentifier = Semaphore_Lock.acquire_semaphore(redis, "sem_name", , *);
if (indentifier == null) {
System.out.println(Thread.currentThread().getName() + " 获取信号量失败,取消任务. Semaphore Semaphore Semaphore Semaphore");
}else{
System.out.println(Thread.currentThread().getName() + " 执行任务");
try {
sleep();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Semaphore_Lock.release_semaphore(redis,"sem_name", indentifier);
redis.close();
break;
}
}
} }

测试日志

Thread-  identifier rank :,too late
Thread- identifier rank :,too late
Thread- 获取信号量失败,取消任务. Semaphore Semaphore Semaphore Semaphore
Thread- identifier rank :,too late
Thread- 获取信号量失败,取消任务. Semaphore Semaphore Semaphore Semaphore
Thread- identifier rank :,too late
Thread- 获取信号量失败,取消任务. Semaphore Semaphore Semaphore Semaphore
Thread- 获取信号量失败,取消任务. Semaphore Semaphore Semaphore Semaphore
Thread- identifier rank :,too late
Thread- identifier rank :,too late
Thread- identifier rank :,too late
Thread- 获取信号量失败,取消任务. Semaphore Semaphore Semaphore Semaphore
Thread- 获取信号量失败,取消任务. Semaphore Semaphore Semaphore Semaphore
Thread- 获取信号量失败,取消任务. Semaphore Semaphore Semaphore Semaphore
Thread- identifier rank :,too late
Thread- identifier rank :,too late
Thread- identifier rank :,too late
Thread- 获取信号量失败,取消任务. Semaphore Semaphore Semaphore Semaphore
Thread- 获取信号量失败,取消任务. Semaphore Semaphore Semaphore Semaphore
Thread- identifier rank :,too late
Thread- 获取信号量失败,取消任务. Semaphore Semaphore Semaphore Semaphore
Thread- identifier rank :,too late
Thread- 获取信号量失败,取消任务. Semaphore Semaphore Semaphore Semaphore
Thread- identifier rank :,too late
Thread- 获取信号量失败,取消任务. Semaphore Semaphore Semaphore Semaphore
Thread- identifier rank :,too late
Thread- 获取信号量失败,取消任务. Semaphore Semaphore Semaphore Semaphore
Thread- identifier rank :
Thread- 执行任务
Thread- 获取信号量失败,取消任务. Semaphore Semaphore Semaphore Semaphore
Thread- identifier rank :
Thread- 执行任务
Thread- identifier rank :,too late
Thread- 获取信号量失败,取消任务. Semaphore Semaphore Semaphore Semaphore
Thread- identifier rank :,too late
Thread- 获取信号量失败,取消任务. Semaphore Semaphore Semaphore Semaphore
Thread- identifier rank :,too late
Thread- 获取信号量失败,取消任务. Semaphore Semaphore Semaphore Semaphore
Thread- identifier rank :,too late
Thread- 获取信号量失败,取消任务. Semaphore Semaphore Semaphore Semaphore
Thread- identifier rank :,too late
Thread- 获取信号量失败,取消任务. Semaphore Semaphore Semaphore Semaphore
Thread- identifier rank :,too late
Thread- 获取信号量失败,取消任务. Semaphore Semaphore Semaphore Semaphore
Thread- identifier rank :,too late
Thread- 获取信号量失败,取消任务. Semaphore Semaphore Semaphore Semaphore
Thread- identifier rank :,too late
Thread- 获取信号量失败,取消任务. Semaphore Semaphore Semaphore Semaphore
Thread- identifier rank :,too late
Thread- 获取信号量失败,取消任务. Semaphore Semaphore Semaphore Semaphore
Thread- identifier rank :,too late
Thread- 获取信号量失败,取消任务. Semaphore Semaphore Semaphore Semaphore
Thread- identifier rank :,too late
Thread- 获取信号量失败,取消任务. Semaphore Semaphore Semaphore Semaphore
Thread- identifier rank :,too late
Thread- 获取信号量失败,取消任务. Semaphore Semaphore Semaphore Semaphore
Thread- identifier rank :,too late
Thread- 获取信号量失败,取消任务. Semaphore Semaphore Semaphore Semaphore
Thread- identifier rank :,too late
Thread- 获取信号量失败,取消任务. Semaphore Semaphore Semaphore Semaphore
Thread- identifier rank :,too late
Thread- 获取信号量失败,取消任务. Semaphore Semaphore Semaphore Semaphore
Thread- identifier rank :,too late
Thread- 获取信号量失败,取消任务. Semaphore Semaphore Semaphore Semaphore
Thread- identifier rank :,too late
Thread- 获取信号量失败,取消任务. Semaphore Semaphore Semaphore Semaphore
Thread- identifier rank :,too late
Thread- 获取信号量失败,取消任务. Semaphore Semaphore Semaphore Semaphore
Thread- identifier rank :,too late
Thread- 获取信号量失败,取消任务. Semaphore Semaphore Semaphore Semaphore
Thread- identifier rank :,too late
Thread- 获取信号量失败,取消任务. Semaphore Semaphore Semaphore Semaphore
Thread- identifier rank :,too late
Thread- 获取信号量失败,取消任务. Semaphore Semaphore Semaphore Semaphore
Thread- identifier rank :,too late
Thread- 获取信号量失败,取消任务. Semaphore Semaphore Semaphore Semaphore
Thread- identifier rank :,too late
Thread- 获取信号量失败,取消任务. Semaphore Semaphore Semaphore Semaphore
Thread- identifier rank :,too late
Thread- 获取信号量失败,取消任务. Semaphore Semaphore Semaphore Semaphore
Thread- identifier rank :,too late
Thread- 获取信号量失败,取消任务. Semaphore Semaphore Semaphore Semaphore
Thread- identifier rank :,too late
Thread- 获取信号量失败,取消任务. Semaphore Semaphore Semaphore Semaphore
Thread- identifier rank :,too late
Thread- 获取信号量失败,取消任务. Semaphore Semaphore Semaphore Semaphore
Thread- identifier rank :,too late
Thread- 获取信号量失败,取消任务. Semaphore Semaphore Semaphore Semaphore
Thread- identifier rank :,too late
Thread- 获取信号量失败,取消任务. Semaphore Semaphore Semaphore Semaphore
Thread- identifier rank :,too late
Thread- 获取信号量失败,取消任务. Semaphore Semaphore Semaphore Semaphore
Thread- identifier rank :,too late
Thread- 获取信号量失败,取消任务. Semaphore Semaphore Semaphore Semaphore
Thread- identifier rank :,too late
Thread- 获取信号量失败,取消任务. Semaphore Semaphore Semaphore Semaphore
Thread- identifier rank :,too late
Thread- 获取信号量失败,取消任务. Semaphore Semaphore Semaphore Semaphore
Thread- identifier rank :
Thread- 执行任务
Thread- identifier rank :
Thread- 执行任务

redis-计数信号量的更多相关文章

  1. Redis计数信号量

    计数信号量是一种锁,它可以让用户限制一项资源最多能够同时被多少个进程访问,通常用于限定能够同时使用的资源数量.你可以把Redis分布式锁里面创建的锁看作是只能被一个进程访问的信号量. 计数信号量和其他 ...

  2. Redis 实战 —— 08. 实现自动补全、分布式锁和计数信号量

    自动补全 P109 自动补全在日常业务中随处可见,应该算一种最常见最通用的功能.实际业务场景肯定要包括包含子串的情况,其实这在一定程度上转换成了搜索功能,即包含某个子串的串,且优先展示前缀匹配的串.如 ...

  3. [Go] Go的WaitGroup计数信号量

    WaitGroup是一个计数信号量,可以用来记录并维护运行的goroutine,如果WaitGroup的值大于0,Wait方法就会阻塞 调用Done方法来减少WaitGroup的值,并最终释放main ...

  4. freeRTOS中文实用教程3--中断管理之计数信号量

    1.前言 在中断不频繁的系统中,使用二值信号量没有问题,但是中断频繁发生时,则会有中断丢失的问题. 因为中断发生时延迟任务执行,延迟任务执行的过程中,如果又来了两次中断,则只会处理第一次,第二次将会丢 ...

  5. FreeRTOS 任务计数信号量,任务二值信号量,任务事件标志组,任务消息邮箱

    以下基础内容转载自安富莱电子: http://forum.armfly.com/forum.php 本章节为大家讲解 FreeRTOS 计数信号量的另一种实现方式----基于任务通知(Task Not ...

  6. FreeRTOS 计数信号量

    以下转载自安富莱电子: http://forum.armfly.com/forum.php 本章节开始讲解 FreeRTOS 任务间的同步和资源共享机制,计数信号量. FreeRTOS 中计数信号量的 ...

  7. 并发教程--JAVA5中 计数信号量(Counting Semaphore)例子

    并发教程--JAVA5中 计数信号量(COUNTING SEMAPHORE)例子 本文由 TonySpark 翻译自 Javarevisited.转载请参见文章末尾的要求. Java中的计数信息量(C ...

  8. freertos知识点笔记——队列、二值信号量、计数信号量

    队列1.队列queue通常用于任务之间的通信,一个任务写缓存,另一个任务读缓存.队列还会有等待时间,2.阻塞超时时间.如果在发送时队列已满,这个时间即是任务处于阻塞态等待队列空间有效的最长等待时间.如 ...

  9. Semaphore计数信号量

    ExecutorService exec = Executors.newCachedThreadPool(); final Semaphore semp = new Semaphore(5); for ...

  10. 使用redis计数来控制单位时间内对某接口的访问量,防止刷验证码接口之类的

    使用自定义注解的方式,在需要被限制访问频率的方法上加注解即可控制. 看实现方式,基于springboot,aop,redis. 新建Springboot工程,引入redis,aop. 创建注解 pac ...

随机推荐

  1. Leetcode之回溯法专题-52. N皇后 II(N-Queens II)

    Leetcode之回溯法专题-52. N皇后 II(N-Queens II) 与51题的代码80%一样,只不过52要求解的数量,51求具体解,点击进入51 class Solution { int a ...

  2. Jenkins教程(三)添加凭据与流水线拉取Git代码

    前言 本文旨在配置凭据.使用Git仓库中的Jenkinsfile与使用声明式流水线拉取Git代码 使用SVN等其他版本控制工具,请参考使用Pipeline-Syntax生成对应代码块 凭据(crede ...

  3. 通过sql命令建表 和 主外键约束以及其他约束

    create table命令 create table dept ( dept_id int primary key, dept_name ) not null, dept_address ) ) c ...

  4. Delphi - 本地路径的创建、清空本地指定文件夹下的文件

    本地路径的创建 在做下载操作时,我们一般先把文件下载到本地指定的路径下,然后再做其他使用. 为了防止程序出现异常,我们通常需要先判断本地是否存在指定的路径. 以C盘Tmp文件夹为例,我们可以这样做,代 ...

  5. MySQL之PXC集群搭建

    一.PXC 介绍 1.1 PXC 简介 PXC 是一套 MySQL 高可用集群解决方案,与传统的基于主从复制模式的集群架构相比 PXC 最突出特点就是解决了诟病已久的数据复制延迟问题,基本上可以达到实 ...

  6. 简单粗暴详细讲解javascript实现函数柯里化

    函数柯里化(黑人问号脸)???Currying(黑人问号脸)???妥妥的中式翻译既视感:下面来一起看看究竟什么是函数柯里化: 维基百科的解释是:把接收多个参数的函数变换成接收一个单一参数(最初函数的第 ...

  7. Spring.Net是怎么在MVC中实现注入的(原理)

    本文将介绍Spring.Net(不仅仅是Spring.Net,其实所有的IoC容器要向控制器中进行注入,原理都是差不多的)在MVC控制器中依赖注入的实现原理,本文并没有关于在MVC使用Spring怎么 ...

  8. 51NOD 大数加法以及python写法

    练练 大数加法一般为小学生式的"竖式计算"要特别注意的是借位与进位的问题(先给看c++写法,我怕先看了python写法,会看不下去c++写法)这题还有要注意的是 1.同符号的话,直 ...

  9. WordCount--统计输入文件的字符数、行数、单词数(java)--初级功能

    码云地址: https://gitee.com/YuRenDaZ/WordCount 个人PSP表格: PSP2.1 PSP阶段 预估耗时 (分钟) 实际耗时 (分钟) Planning 计划 180 ...

  10. Vue兄弟组件通信

    Vue兄弟组件通信之借助中央事件总线 下载链接:https://www.yinxiangit.com 其实要实现兄弟组件通信,就算是通过父子组件通信的方式也是可以达到的,如 子 ——>父——&g ...