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. 浅谈jQuery中的Ajax

    浅谈jQuery中的Ajax 一.前言 jQuery 对 Ajax 操作进行了封装, 在 jQuery 中最底层的方法时 $.ajax(), 第二层是 load(), $.get() 和 $.post ...

  2. JWT原理 使用(入门篇)

    1.JWT简介 JWT:Json Web Token,是基于Json的一个公开规范,这个规范允许我们使用JWT在用户和服务器之间传递安全可靠的信息,他的两大使用场景是:认证和数据交换 使用起来就是,由 ...

  3. 牛客多校第六场 C Generation I 组合数学 阶乘逆元模板

    链接:https://www.nowcoder.com/acm/contest/144/C来源:牛客网 Oak is given N empty and non-repeatable sets whi ...

  4. HYSBZ - 4016 最短路径树问题 点分治 + 最短路径最小字典序

    题目传送门 题解:首先对于给定的图,需要找到那些从1好点出发然后到x号点的最短路, 如果有多条最短路就要找到字典序最小的路,这样扣完这些边之后就会有一棵树.然后再就是很普通的点分治了. 对于扣边这个问 ...

  5. CodeForces 639C Bear and Polynomials

    Bear and Polynomials 题解: 如果改变一个其中的一个数,那么需要知道的是,前面的数都可以进到当前位来,如果过不来的话,那么就会因为前面有数导致无法变成0. 所以我们将前面的数不断向 ...

  6. 模板汇总——Tarjian

    1. 单向边  + 新图建边 int belong[N], dfn[N], low[N], now_time, scc_cnt; stack<int> s; void dfs(int u) ...

  7. 牛客多校第五场 F take 期望转化成单独事件概率(模板) 树状数组

    链接:https://www.nowcoder.com/acm/contest/143/F来源:牛客网 Kanade has n boxes , the i-th box has p[i] proba ...

  8. 洛谷P5335 [THUSC2016]补退选 题解

    传送门 一道字典树的例题吧 先说下思路前1,2两个条件都易满足,字典树插入修改即可,第三个条件可用动态数组来实现,存下它的size表示当前有几个节点经过(即人数),其下标表示第几次出现,里面存入操作次 ...

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

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

  10. .gitignore文件失效的解决方案

    通常在idea中,我们使用git进行项目管理的时候,一些不需要的文件如.idea,.target文件不需要上传至gitlab仓库,这时,就需要在项目中定义一个.gitignore文件,用来标识这些文件 ...