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. Java网络编程之UDP

    Java网络编程之UDP 一.C/S架构中UDP网络通信流程 ①创建DatagramSocket与DatagramPacket对象 ②建立发送端,接收端 ③建立数据包 ④调用Socket的发送.接收方 ...

  2. 再谈C#装箱和拆箱操作

    1. 使用非泛型集合时引发的装箱和拆箱操作 看下面的一段代码: 1 2 3 4 5 6 7 8 var array = new ArrayList(); array.Add(1); array.Add ...

  3. MySQL之PXC集群搭建

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

  4. 设置普通用户输入sudo,免密进入root账户

    满足给开发用户开权限,赋予sudo权限.又不让其输入密码的方式: 方式一: 开始系统内部的wheel用户组, 在/etc/suoers 中编辑配置文件如下: %wheel ALL=(ALL) NOPA ...

  5. 全网最实用的 Debug调试技巧汇总-Python大佬偷偷使用的神技

    一.思考❓❔ 1.什么是debug? 找茬 找软件的茬 发现程序的缺陷 2.为什么需要debug? 谁都不敢保证,写的代码没有任何问题 高效查找软件异常 一位优秀的开发工程师 20%的时间写代码 80 ...

  6. Java的异常:Error与Exception

    一. 异常机制的概述      异常机制是指当程序出现错误后,程序如何处理.具体来说,异常机制提供了程序退出的安全通道.当出现错误后,程序执行的流程发生改变,程序的控制权转移到异常处理器. 程序错误分 ...

  7. asp.netcore2.1 IIS部署发布

    下载SDK .net core2.1 SDK下载地址:https://www.microsoft.com/net/download 创建Demo项目 打开 powershell 新建项目 dotnet ...

  8. 4.String、StringBuffer、StringBuilder

    一.String类型 String类型是一个引用类型,但是该类被final修饰,属于最终类,不能派生子类. 字符串一旦初始化就不能再被更改,因为String类中存储内容的char[]数组是也被fina ...

  9. MySql(二)_NHibernateHelper管理会话工厂

    1.定义接口的好处: (1) 清楚的看到里面有哪些方法: ( 2 )  可以更换实现类:Nhibernate实现件可以更换: Manger文件夹(另外两个是Model.Mappings文件夹) 首先M ...

  10. Winform中使用FastReport实现简单的自定义PDF导出

    场景 FastReport安装包下载.安装.去除使用限制以及工具箱中添加控件: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/10 ...