redis-計數信號量


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 = 0; i < 1000; 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(100);
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                continue;
            }
            String indentifier = Semaphore_Lock.acquire_semaphore(redis, "sem_name", 20, 1000*60);
            if (indentifier == null) {
                System.out.println(Thread.currentThread().getName() + " 獲取信號量失敗,取消任務. Semaphore  Semaphore  Semaphore  Semaphore");
            }else{
                System.out.println(Thread.currentThread().getName() + "  執行任務");
                try {
                    sleep(10);
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                Semaphore_Lock.release_semaphore(redis,"sem_name", indentifier);
                redis.close();
                break;
            }
        }
    }

}

 

測試日志

Thread-274  identifier rank :22,too late
Thread-255  identifier rank :21,too late
Thread-274 獲取信號量失敗,取消任務. Semaphore  Semaphore  Semaphore  Semaphore
Thread-213  identifier rank :23,too late
Thread-255 獲取信號量失敗,取消任務. Semaphore  Semaphore  Semaphore  Semaphore
Thread-274  identifier rank :21,too late
Thread-213 獲取信號量失敗,取消任務. Semaphore  Semaphore  Semaphore  Semaphore
Thread-274 獲取信號量失敗,取消任務. Semaphore  Semaphore  Semaphore  Semaphore
Thread-255  identifier rank :22,too late
Thread-213  identifier rank :21,too late
Thread-274  identifier rank :21,too late
Thread-255 獲取信號量失敗,取消任務. Semaphore  Semaphore  Semaphore  Semaphore
Thread-274 獲取信號量失敗,取消任務. Semaphore  Semaphore  Semaphore  Semaphore
Thread-213 獲取信號量失敗,取消任務. Semaphore  Semaphore  Semaphore  Semaphore
Thread-255  identifier rank :21,too late
Thread-213  identifier rank :21,too late
Thread-274  identifier rank :21,too late
Thread-255 獲取信號量失敗,取消任務. Semaphore  Semaphore  Semaphore  Semaphore
Thread-213 獲取信號量失敗,取消任務. Semaphore  Semaphore  Semaphore  Semaphore
Thread-255  identifier rank :20,too late
Thread-274 獲取信號量失敗,取消任務. Semaphore  Semaphore  Semaphore  Semaphore
Thread-213  identifier rank :21,too late
Thread-255 獲取信號量失敗,取消任務. Semaphore  Semaphore  Semaphore  Semaphore
Thread-255  identifier rank :20,too late
Thread-213 獲取信號量失敗,取消任務. Semaphore  Semaphore  Semaphore  Semaphore
Thread-274  identifier rank :21,too late
Thread-255 獲取信號量失敗,取消任務. Semaphore  Semaphore  Semaphore  Semaphore
Thread-213  identifier rank :19
Thread-213  執行任務
Thread-274 獲取信號量失敗,取消任務. Semaphore  Semaphore  Semaphore  Semaphore
Thread-255  identifier rank :19
Thread-255  執行任務
Thread-274  identifier rank :20,too late
Thread-274 獲取信號量失敗,取消任務. Semaphore  Semaphore  Semaphore  Semaphore
Thread-274  identifier rank :21,too late
Thread-274 獲取信號量失敗,取消任務. Semaphore  Semaphore  Semaphore  Semaphore
Thread-274  identifier rank :20,too late
Thread-274 獲取信號量失敗,取消任務. Semaphore  Semaphore  Semaphore  Semaphore
Thread-274  identifier rank :21,too late
Thread-274 獲取信號量失敗,取消任務. Semaphore  Semaphore  Semaphore  Semaphore
Thread-274  identifier rank :21,too late
Thread-274 獲取信號量失敗,取消任務. Semaphore  Semaphore  Semaphore  Semaphore
Thread-274  identifier rank :21,too late
Thread-274 獲取信號量失敗,取消任務. Semaphore  Semaphore  Semaphore  Semaphore
Thread-274  identifier rank :21,too late
Thread-274 獲取信號量失敗,取消任務. Semaphore  Semaphore  Semaphore  Semaphore
Thread-274  identifier rank :21,too late
Thread-274 獲取信號量失敗,取消任務. Semaphore  Semaphore  Semaphore  Semaphore
Thread-274  identifier rank :21,too late
Thread-274 獲取信號量失敗,取消任務. Semaphore  Semaphore  Semaphore  Semaphore
Thread-274  identifier rank :21,too late
Thread-274 獲取信號量失敗,取消任務. Semaphore  Semaphore  Semaphore  Semaphore
Thread-274  identifier rank :21,too late
Thread-274 獲取信號量失敗,取消任務. Semaphore  Semaphore  Semaphore  Semaphore
Thread-274  identifier rank :21,too late
Thread-274 獲取信號量失敗,取消任務. Semaphore  Semaphore  Semaphore  Semaphore
Thread-274  identifier rank :21,too late
Thread-274 獲取信號量失敗,取消任務. Semaphore  Semaphore  Semaphore  Semaphore
Thread-274  identifier rank :21,too late
Thread-274 獲取信號量失敗,取消任務. Semaphore  Semaphore  Semaphore  Semaphore
Thread-274  identifier rank :21,too late
Thread-274 獲取信號量失敗,取消任務. Semaphore  Semaphore  Semaphore  Semaphore
Thread-274  identifier rank :21,too late
Thread-274 獲取信號量失敗,取消任務. Semaphore  Semaphore  Semaphore  Semaphore
Thread-274  identifier rank :21,too late
Thread-274 獲取信號量失敗,取消任務. Semaphore  Semaphore  Semaphore  Semaphore
Thread-274  identifier rank :21,too late
Thread-274 獲取信號量失敗,取消任務. Semaphore  Semaphore  Semaphore  Semaphore
Thread-274  identifier rank :21,too late
Thread-274 獲取信號量失敗,取消任務. Semaphore  Semaphore  Semaphore  Semaphore
Thread-274  identifier rank :21,too late
Thread-274 獲取信號量失敗,取消任務. Semaphore  Semaphore  Semaphore  Semaphore
Thread-274  identifier rank :21,too late
Thread-274 獲取信號量失敗,取消任務. Semaphore  Semaphore  Semaphore  Semaphore
Thread-274  identifier rank :21,too late
Thread-274 獲取信號量失敗,取消任務. Semaphore  Semaphore  Semaphore  Semaphore
Thread-274  identifier rank :21,too late
Thread-274 獲取信號量失敗,取消任務. Semaphore  Semaphore  Semaphore  Semaphore
Thread-274  identifier rank :21,too late
Thread-274 獲取信號量失敗,取消任務. Semaphore  Semaphore  Semaphore  Semaphore
Thread-274  identifier rank :21,too late
Thread-274 獲取信號量失敗,取消任務. Semaphore  Semaphore  Semaphore  Semaphore
Thread-274  identifier rank :21,too late
Thread-274 獲取信號量失敗,取消任務. Semaphore  Semaphore  Semaphore  Semaphore
Thread-274  identifier rank :21,too late
Thread-274 獲取信號量失敗,取消任務. Semaphore  Semaphore  Semaphore  Semaphore
Thread-274  identifier rank :21,too late
Thread-274 獲取信號量失敗,取消任務. Semaphore  Semaphore  Semaphore  Semaphore
Thread-274  identifier rank :21,too late
Thread-274 獲取信號量失敗,取消任務. Semaphore  Semaphore  Semaphore  Semaphore
Thread-274  identifier rank :21,too late
Thread-274 獲取信號量失敗,取消任務. Semaphore  Semaphore  Semaphore  Semaphore
Thread-274  identifier rank :21,too late
Thread-274 獲取信號量失敗,取消任務. Semaphore  Semaphore  Semaphore  Semaphore
Thread-274  identifier rank :21,too late
Thread-274 獲取信號量失敗,取消任務. Semaphore  Semaphore  Semaphore  Semaphore
Thread-274  identifier rank :21,too late
Thread-274 獲取信號量失敗,取消任務. Semaphore  Semaphore  Semaphore  Semaphore
Thread-274  identifier rank :18
Thread-274  執行任務
Thread-963  identifier rank :16
Thread-963  執行任務

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM