最代碼廣告位
最代碼官方的gravatar頭像
最代碼官方2019-10-20 10:16:12

redis如何實現多個項目間同一條數據的并發讀寫控制?

目前最代碼的多個項目(www,admin,edu)的同一個數據的讀寫緩存是通過ehcache實現,jgroups實現同步,但是發現,如果服務器負載較高的情況下,jgroups同步會出現問題。

redis如何實現多個項目間同一條數據的并發讀寫控制?

最近在思考換成redis替代ehcache

redis如何實現多個項目間同一條數據的并發讀寫控制?

但是同一條數據之間的讀寫并發控制是個問題,首先想到的是redis的加鎖機制,如果Redis中有這條數據的鎖則讀寫MySQL,如果沒有則讀寫Redis,這樣是否會對MySQL的壓力加大?

另外百度搜索到的Redis共享數據全部是對Session的操作,請教牛牛們是否有類似的解決方案。

所有回答列表(7)
2603824096劉秋平的gravatar頭像
2603824096劉秋平 LV310月20日

牛人

最代碼人間蒸發的gravatar頭像
最代碼人間蒸發 LV1510月21日

我不知道cheeky

liuliu的gravatar頭像
liuliu LV2310月21日

smileysmileysmiley

最代碼-上海-飛兒的gravatar頭像

@Scheduled(initialDelay = 1000, fixedDelay = 60000)
    public void redisTest(){
        Jedis jedis = jedisPool.getResource();
        try{
            jedis.set("red_packet_num","5000");
        }catch (Exception e)
        {
            e.printStackTrace();
            if (jedis != null) {
                jedis.close();
            }
        }
        finally {
            if (jedis != null) {
                jedis.close();
            }
        }
        Lock lock=new ReentrantLock();
        for(int i=0;i<2000;i++){
            fixedThreadPool.execute(new Runnable() {
                @Override
                public void run() {
                    Jedis jedis = jedisPool.getResource();
                    try {
                        lock.lock();
                        String red_packet_num = jedis.get("red_packet_num");
                        int a = Integer.parseInt(red_packet_num) - 1;
                        jedis.set("red_packet_num", String.valueOf(a));
                        lock.unlock();
                        System.out.println("數據是:" + a+"當前線程是:"+Thread.currentThread().getName()+"當前時間"+ CommonUtil.getCurrentTimeFormatForHMS());
                    }
                    catch (Exception e){
                        e.printStackTrace();
                        if (jedis != null) {
                            jedis.close();
                        }
                    }
                    finally {
                        if (jedis != null) {
                            jedis.close();
                        }
                    }
                }
            });
        }
    }
代碼推薦調試看看,看處其中的處理操作邏輯,如何其中的推薦實踐做實際實踐看看吧,謝謝!

treeke的gravatar頭像
treeke LV1010月22日

redis 讀寫操作都是基于多路I/O復用的單線程操作, 所以不存在多個連接讀寫并發的問題,所有的并發操作到redis都會阻塞,但是其基于epoll模型的多路I/O復用和高速的內存操作還是使它在數據讀寫方面表現的非常優秀。但是超大數據的操作會阻塞當前線程掛起其他所有的讀寫線程,這也是redis最大的缺陷。但是這個也可以通過集群配置和讀寫分離彌補上,此外redis支持string,hash,list,set及zset結構的數據,本質上可以通過redis共享任意數據

songyii的gravatar頭像
songyii LV210月24日

redis有個setNx

1236cat的gravatar頭像
1236cat LV210月28日

可以用Redis分布鎖,基于redis.setNx實現.需要設置自動過期時間,避免死鎖.只有拿到鎖的才會crud,其他的會阻塞,等待這個執行成功后才會開始.正因為都是基于對緩存的操作,才能緩解數據庫的壓力.還可以把熱門訪問的資源也放到redis里,redis不同于一般的緩存,不光存的數據量多,對數據的結構要求也較廣泛.這樣訪問熱門資源時,可以先查redis,redis沒有在請求數據庫,請求后在存入redis,也能緩解數據庫壓力.

頂部客服微信二維碼底部
>掃描二維碼關注最代碼為好友掃描二維碼關注最代碼為好友
福彩3d组选020前后关系