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. HDU 6040

    题意略. 思路:题目就是在询问你m次,第k小是哪个数.首先我们可以想到直接排序后,即可O(1)来查找询问.但是题目中n的范围给的是1e7, 无法承受nlogn的复杂度.从而想到另外一种求静态第k小的方 ...

  2. P2564 [SCOI2009]生日礼物 贪心

    https://www.luogu.org/problemnew/show/P2564) 题意 有n个珠子,包括k中颜色,找出长度最小的一个区间,使得这个区间中包含所有的颜色. 思路 把n个珠子按照位 ...

  3. P2805 [NOI2009]植物大战僵尸 + 最大权闭合子图 X 拓扑排序

    传送门:https://www.luogu.org/problemnew/show/P2805 题意 有一个n * m的地图,你可以操纵僵尸从地图的右边向左边走,走的一些地方是有能量值的,有些地方会被 ...

  4. Codeforces Technocup 2017 - Elimination Round 2 D. Sea Battle(贪心)

    题目链接 http://codeforces.com/contest/729/problem/D 题意:给你一个1*n的区域有a艘船,每艘船宽b,已经开了k枪都没打到,问你最少再开几枪至少能打到一艘船 ...

  5. MyCat数据库的基础配置及使用

    一.为什么需要分布式数据据库 随着计算机和信息技术的迅猛发展,行业应用系统的规模迅速扩大,行业应用所产生的数据量呈爆炸式增长,动辄达到数百TB甚至数百PB的规模,已远远超出传统计算技术和信息系统的处理 ...

  6. Go语言标准库之fmt

    fmt标准库是我们在学习Go语言过程中接触最早最频繁的一个了,本文介绍了fmtb包的一些常用函数. fmt fmt包实现了类似C语言printf和scanf的格式化I/O.主要分为向外输出内容和获取输 ...

  7. java中多线程执行时,为何调用的是start()方法而不是run()方法

    Thead类中start()方法和run()方法的区别 1,start()用来启动一个线程,当调用start()方法时,系统才会开启一个线程,通过Thead类中start()方法来启动的线程处于就绪状 ...

  8. Windows服务器远程桌面不能复制粘贴的解决方法

    今天使用windows 2008服务器,实然就不能从本地复制内容和粘贴内容了,从网上找了下原因,最终解决了.一般本地和服务器不能复制粘贴分两种情况: 情况一:复制粘贴功能原本可以用,突然失灵了. 解决 ...

  9. FreeSql 新手上路系列教程已发布在 cnblogs

    FreeSql 是一个功能强大的对象关系映射程序(O/RM),支持 .NETCore 2.1+ 或 .NETFramework 4.5+(QQ群:4336577) FreeSql采用MIT开源协议托管 ...

  10. kafka 主题管理

    对于 kafka 主题(topic)的管理(增删改查),使用最多的便是kafka自带的脚本. 创建主题 kafka提供了自带的 kafka-topics 脚本,用来帮助用户创建主题(topic). b ...