在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問答/人工智能  PHP/ redis原子性測試的疑問

redis原子性測試的疑問

我知道redis的單個操作是原子性的,如果在代碼中對redis進行多次操作將無法保證整個操作流程的原子性。

比如下面的這段代碼中,假設nums這個key的值是50,使用ab.exe工具對其1000次訪問,并發(fā)數(shù)是100,理論上結果應該會出現(xiàn)負數(shù)的.

可是我多次測試下nums的值都是1,請問是我測試的方式不對還是其他哪里有問題呢?

$nums = $redis->get('nums');
if($nums > 1)
    $redis->decr('nums');
回答
編輯回答
葬愛

不知道ab.exe測試時什么原理,你自己寫一個多線程調(diào)用下就知道了會產(chǎn)生負數(shù)值的。

//php不會,用java寫了個test。
import redis.clients.jedis.Jedis;


public class Test {
    
    public static void main(String[] args) throws Exception {
        
        Jedis jedis = getJedis();
        jedis.set("nums", 50+"");
        close(jedis);
        
        for(int i = 0;i < 1000;i++){ //啟動1000個線程
            new Thread(new MyTask()).start();
        }
        
    }
    
    public static  Jedis getJedis(){
        Jedis j = new Jedis("xxxxx", 6379);
        j.auth("xxxx");
        return j;
    }
    
    public static void close(Jedis jedis){
        if(null == jedis){
            return;
        }
        jedis.close();
    }
}

class MyTask implements Runnable{
    @Override
    public void run() {
        Jedis j = Test.getJedis();
         String numStr = j.get("nums");
         Integer nums = Integer.valueOf(numStr);
        
        if(nums > 1){
             j.decr("nums");
        }else{
             System.out.println(nums);
        }
        Test.close(j);
    }
}

輸出結果出現(xiàn)負值。

2018年1月23日 09:46
編輯回答
葬愛

你寫了判斷呀,大于1的時候才遞減1
你減到1的時候都不執(zhí)行了,他怎么能作為測試原子性的依據(jù)呢?

2018年5月23日 09:24
編輯回答
孤客

你這樣的并發(fā)很難測試出來的,的確這樣操作存在負數(shù)的可能。但是想想你的電腦是 4核8線程,最多同時執(zhí)行8個請求而已,這對redis來說是非常小的并發(fā)量了。所以我認為不出現(xiàn)問題是因為并發(fā)量小了,實際上是會存在問題的。

2017年1月24日 11:44