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. 设计模式(C#)——07装饰者模式

    推荐阅读:  我的CSDN  我的博客园  QQ群:704621321       在一款战斗类的游戏中,随着故事情节的发展,玩家(即游戏中的主角,下文统一为主角)通常会解锁一些新技能.最初主角只有使 ...

  2. 堆、栈、内存分配、==、equals、hashcode详解(转载)

    问题的引入: 问题一:String str1 = "abc";String str2 = "abc";System.out.println(str1==str2 ...

  3. Redis主从复制的原理

    更多内容,欢迎关注微信公众号:全菜工程师小辉.公众号回复关键词,领取免费学习资料. 在Redis集群中,让若干个Redis服务器去复制另一个Redis服务器,我们定义被复制的服务器为主服务器(mast ...

  4. 【Linux命令】nohup命令

    nohup命令 不挂断的运行,它会使您的脚本被忽略SIGHUP,并重定向stdout/stderr到一个文件nohup.out,以便在您注销后该命令可以在后台继续运行. 1)语法 nohup Comm ...

  5. 求大的组合数模板 利用Lucas定理

    Lucas定理:A.B是非负整数,p是质数.A B写成p进制:A=a[n]a[n-1]…a[0],B=b[n]b[n-1]…b[0]. 则组合数C(A,B)与C(a[n],b[n])C(a[n-1], ...

  6. bzoj2049 Cave 洞穴勘测 lct

    这里比上次多了几个操作. 1. make_root(u) 换根节点, 先access(u), 再splay(u),将u移动到splay树的最顶上, 现在这棵splay对于root来说 只有左子树上有东 ...

  7. codeforces H. Queries for Number of Palindromes(区间dp)

    题目链接:http://codeforces.com/contest/245/problem/H 题意:给出一个字符串还有q个查询,输出每次查询区间内回文串的个数.例如aba->(aba,a,b ...

  8. CSU 1803 2016 湖南省2016省赛

    1803: 2016 Submit Page   Summary   Time Limit: 5 Sec     Memory Limit: 128 Mb     Submitted: 1416    ...

  9. Catch That Cow POJ - 3278 [kuangbin带你飞]专题一 简单搜索

    Farmer John has been informed of the location of a fugitive cow and wants to catch her immediately. ...

  10. 在CMD命令行进入和退出Python程序

    进入: 直接输入python即可 退出: 方法一:输入exit(),回车 方法二:输入quit(),回车 方法三:CTRL + Z,回车