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

鍍金池/ 問答/人工智能  Java/ redis資源釋放問題

redis資源釋放問題

代碼中需要用到redis,但是總會由于各種異常導(dǎo)致redis資源無法釋放,導(dǎo)致獲取不到資源。代碼邏輯如下,求大神優(yōu)化:
{
聲明redis;
獲取redis;
執(zhí)行sql邏輯代碼1;
執(zhí)行邏輯代碼2;
釋放redis;
}
結(jié)果異常往往出現(xiàn)在執(zhí)行sql查詢,導(dǎo)致redis不能釋放,所以改進版(1)如下:
聲明redis;
try{

獲取redis;
執(zhí)行sql邏輯代碼1;
執(zhí)行邏輯代碼2;

}catch(){

}finally{

釋放redis;

}

但是這樣,發(fā)現(xiàn)把所有的業(yè)務(wù)邏輯都包在了try-catch中,求大神幫忙改進怎樣釋放redi最好
改進方法(2)如下:
{
聲明redis;
redis包裝類進行查詢刪除操作1(在redis包裝類每次操作后進行try-catch-finally釋放);
執(zhí)行sql邏輯代碼1;
redis包裝類進行查詢刪除操作2(在redis包裝類每次操作后進行try-catch-finally釋放);
執(zhí)行邏輯代碼2;
}

回答
編輯回答
扯機薄

個人覺得你的問題不在于連接不釋放,而在于連接持有時間過長,在處理SQL期間,連接持有是沒有意義的,所以可以改為:

1. 持有Redis連接,執(zhí)行前置邏輯(如果有的話),釋放連接
2. 執(zhí)行SQL邏輯(可能耗時較久)
3. 再次持有連接,執(zhí)行后置邏輯(如果有的話),釋放連接

在有連接池的條件下,連接的開銷會很小,所以不必要長時間占用連接

2018年8月17日 18:57
編輯回答
朕略萌

可以用Java來造一個偽函數(shù)式來解決這個問題...

創(chuàng)建接口

public interface Function<T, E> {

    public T callback(E e);

}

抽取service

@Service
public class RedisService {

    @Autowired(required = false)
    private JedisPool jedisPool;

    private <T> T execute(Function<T, Jedis> fun) {
        Jedis jedis = null;
        try {
            jedis = jedisPool.getResource();
            return fun.callback(jedis);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (null != jedis){
                jedis.close();
            }
        }
        return null;
    }

    public String set(final String key, final String value) {
        return this.execute(new Function<String, Jedis>() {
            @Override
            public String callback(Jedis e) {
                return e.set(key, value);
            }
        });
    }

    public String get(final String key) {
        return this.execute(new Function<String, Jedis>() {
            @Override
            public String callback(Jedis e) {
                return e.get(key);
            }
        });
    }
}

使用

@Resource
RedisService redisService;

redisService.set("k","amazing");
redisService.get("k");
2017年4月14日 03:01
編輯回答
情皺

建議:
1.可以考慮用 連接池 ,減少頻繁連接和釋放。
2.采用 長連接,復(fù)用同一個連接。

2018年7月9日 04:43