国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

分布式工具的一次小升級?

AlexTuan / 2067人閱讀

前言

之前在做 秒殺架構(gòu)實(shí)踐 時(shí)有提到對 distributed-redis-tool 的一次小升級,但是沒有細(xì)說。

其實(shí)主要原因是:

秒殺時(shí)我做壓測:由于集成了這個(gè)限流組件,并發(fā)又比較大,所以導(dǎo)致連接、斷開 Redis 非常頻繁。
最終導(dǎo)致獲取不了 Redis connection 的異常。
池化技術(shù)

這就是一個(gè)典型的對稀缺資源使用不善導(dǎo)致的。

何為稀缺資源?常見的有:

線程

數(shù)據(jù)庫連接

網(wǎng)絡(luò)連接等

這些資源都有共同的特點(diǎn):創(chuàng)建銷毀成本較高

這里涉及到的 Redis 連接也屬于該類資源。

我們希望將這些稀有資源管理起來放到一個(gè)池子里,當(dāng)需要時(shí)就從中獲取,用完就放回去,不夠用時(shí)就等待(或返回)。

這樣我們只需要初始化并維護(hù)好這個(gè)池子,就能避免頻繁的創(chuàng)建、銷毀這些資源(也有資源長期未使用需要縮容的情況)。

通常我們稱這項(xiàng)姿勢為池化技術(shù),如常見的:

線程池

各種資源的連接池等。

為此我將使用到 Redis 的 分布式鎖、分布式限流 都升級為利用連接池來獲取 Redis 的連接。

這里以分布式鎖為例:

將使用的 api 修改為:

原有:

@Configuration
public class RedisLockConfig {

    @Bean
    public RedisLock build(){
        //Need to get Redis connection 
        RedisLock redisLock = new RedisLock() ;
        HostAndPort hostAndPort = new HostAndPort("127.0.0.1",7000) ;
        JedisCluster jedisCluster = new JedisCluster(hostAndPort) ;
        RedisLock redisLock = new RedisLock.Builder(jedisCluster)
                .lockPrefix("lock_test")
                .sleepTime(100)
                .build();
                
        return redisLock ;
    }

}

現(xiàn)在:

@Configuration
public class RedisLockConfig {
    private Logger logger = LoggerFactory.getLogger(RedisLockConfig.class);
    
    
    @Autowired
    private JedisConnectionFactory jedisConnectionFactory;
    
    @Bean
    public RedisLock build() {
        RedisLock redisLock = new RedisLock.Builder(jedisConnectionFactory,RedisToolsConstant.SINGLE)
                .lockPrefix("lock_")
                .sleepTime(100)
                .build();

        return redisLock;
    }
}

將以前的 Jedis 修改為 JedisConnectionFactory,后續(xù)的 Redis 連接就可通過這個(gè)對象獲取。

并且顯示的傳入使用 RedisCluster 還是單機(jī)的 Redis。

所以在真正操作 Redis 時(shí)需要修改:

    public boolean tryLock(String key, String request) {
        //get connection
        Object connection = getConnection();
        String result ;
        if (connection instanceof Jedis){
            result =  ((Jedis) connection).set(lockPrefix + key, request, SET_IF_NOT_EXIST, SET_WITH_EXPIRE_TIME, 10 * TIME);
            ((Jedis) connection).close();
        }else {
            result = ((JedisCluster) connection).set(lockPrefix + key, request, SET_IF_NOT_EXIST, SET_WITH_EXPIRE_TIME, 10 * TIME);
            try {
                ((JedisCluster) connection).close();
            } catch (IOException e) {
                logger.error("IOException",e);
            }
        }

        if (LOCK_MSG.equals(result)) {
            return true;
        } else {
            return false;
        }
    }
    
    //獲取連接
    private Object getConnection() {
        Object connection ;
        if (type == RedisToolsConstant.SINGLE){
            RedisConnection redisConnection = jedisConnectionFactory.getConnection();
            connection = redisConnection.getNativeConnection();
        }else {
            RedisClusterConnection clusterConnection = jedisConnectionFactory.getClusterConnection();
            connection = clusterConnection.getNativeConnection() ;
        }
        return connection;
    }    

最大的改變就是將原有操作 Redis 的對象(T extends JedisCommands)改為從連接池中獲取。

由于使用了 org.springframework.data.redis.connection.jedis.JedisConnectionFactory 作為 Redis 連接池。

所以需要再使用時(shí)構(gòu)件好這個(gè)對象:

        JedisPoolConfig config = new JedisPoolConfig();
        config.setMaxIdle(10);
        config.setMaxTotal(300);
        config.setMaxWaitMillis(10000);
        config.setTestOnBorrow(true);
        config.setTestOnReturn(true);

        RedisClusterConfiguration redisClusterConfiguration = new RedisClusterConfiguration();
        redisClusterConfiguration.addClusterNode(new RedisNode("10.19.13.51", 7000));

        //單機(jī)
        JedisConnectionFactory jedisConnectionFactory = new JedisConnectionFactory(config);

        //集群
        //JedisConnectionFactory jedisConnectionFactory = new JedisConnectionFactory(redisClusterConfiguration) ;
        jedisConnectionFactory.setHostName("47.98.194.60");
        jedisConnectionFactory.setPort(6379);
        jedisConnectionFactory.setPassword("");
        jedisConnectionFactory.setTimeout(100000);
        jedisConnectionFactory.afterPropertiesSet();
        //jedisConnectionFactory.setShardInfo(new JedisShardInfo("47.98.194.60", 6379));
        //JedisCluster jedisCluster = new JedisCluster(hostAndPort);

        HostAndPort hostAndPort = new HostAndPort("10.19.13.51", 7000);
        JedisCluster jedisCluster = new JedisCluster(hostAndPort);
        redisLock = new RedisLock.Builder(jedisConnectionFactory, RedisToolsConstant.SINGLE)
                .lockPrefix("lock_")
                .sleepTime(100)
                .build();

看起比較麻煩,需要構(gòu)建對象的較多。

但整合 Spring 使用時(shí)就要清晰許多。

配合 Spring

Spring 很大的一個(gè)作用就是幫我們管理對象,所以像上文那些看似很復(fù)雜的對象都可以交由它來管理:

   
    
        
        
        
        
        
    
    
    
        
        
        
        
        
    
    
        
        
            
        
        
            
        
    

這個(gè)其實(shí)沒多少好說的,就算是換成 SpringBoot 也是創(chuàng)建 JedispoolConfig,connectionFactory,redisTemplate 這些 bean 即可。

總結(jié)

換為連接池之后再進(jìn)行壓測自然沒有出現(xiàn)獲取不了 Redis 連接的異常(并發(fā)達(dá)到一定的量也會(huì)出錯(cuò))說明更新是很有必要的。

推薦有用到該組件的朋友都升級下,也歡迎提出 Issues 和 PR。

項(xiàng)目地址:

https://github.com/crossoverJie/distributed-redis-tool

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/69694.html

相關(guān)文章

  • 記一次小程序之旅

    摘要:用戶綁定的邏輯主要復(fù)雜在既需要考慮微信本身的接口在不同情況下提供的數(shù)據(jù)不同,另外一方面就是考慮本身用戶模塊的業(yè)務(wù)邏輯問題。針對每一節(jié)課以及每一節(jié)系列課程生成小程序太陽碼主要涉及到幾個(gè)細(xì)節(jié)問題。 感覺已經(jīng)好久沒寫程序了,最近這段時(shí)間,一方面是學(xué)習(xí)了python,然后折騰了scrapy框架,用python寫了下守護(hù)進(jìn)程程序監(jiān)聽任務(wù)以及用redis做隊(duì)列任務(wù)通信,并開進(jìn)程來處理爬蟲任務(wù)。以上...

    不知名網(wǎng)友 評論0 收藏0
  • 阿里云南京云棲釋放技術(shù)紅利 核心產(chǎn)品最高降價(jià)50%

    摘要:在南京峰會(huì)上,阿里云產(chǎn)品宣布,包年包月實(shí)例租用費(fèi)最高下調(diào),存儲(chǔ)價(jià)格不變。本次阿里云宣布所有規(guī)格整體降價(jià),平均降幅達(dá)到。阿里云表示,經(jīng)過不斷的技術(shù)升級和資源優(yōu)化,規(guī)模效應(yīng)開始展現(xiàn),這是今年持續(xù)大幅降價(jià)的基礎(chǔ)。4月26日,在2018云棲大會(huì)·南京峰會(huì)上,阿里云宣布新一輪的價(jià)格調(diào)整。此次調(diào)整包含了Elasticsearch、分析型數(shù)據(jù)庫、實(shí)人認(rèn)證、開放搜索等多項(xiàng)產(chǎn)品,最高降幅達(dá)到50%。 ...

    MartinHan 評論0 收藏0
  • 構(gòu)造函數(shù)與析構(gòu)函數(shù)執(zhí)行順序,記一次小bug修復(fù)。

    摘要:執(zhí)行構(gòu)造函數(shù)執(zhí)行析構(gòu)函數(shù)第一次完畢第二次完畢執(zhí)行輸出執(zhí)行構(gòu)造函數(shù)第一次完畢執(zhí)行構(gòu)造函數(shù)執(zhí)行析構(gòu)函數(shù)第二次完畢執(zhí)行析構(gòu)函數(shù)終于逮到你了。。。這就導(dǎo)致了先執(zhí)行構(gòu)造函數(shù),然后再執(zhí)行析構(gòu)函數(shù)。 class Test { protected $client; protected static $name; public function __construct() { ...

    xiao7cn 評論0 收藏0
  • 記一次小程序項(xiàng)目的開發(fā)心得

    摘要:前言這段時(shí)間一直負(fù)責(zé)公司的小程序的開發(fā),總結(jié)了一些小程序的開發(fā)心得,方便自己以后的查閱也方便同仁少踩點(diǎn)坑。文章底部的技巧類小程序的識別小程序二維碼功能,小程序的高斯模糊,都是自己填的坑。 前言:這段時(shí)間一直負(fù)責(zé)公司的小程序的開發(fā),總結(jié)了一些小程序的開發(fā)心得,方便自己以后的查閱也方便同仁少踩點(diǎn)坑。文章底部的技巧類小程序的識別小程序二維碼功能,小程序的高斯模糊,都是自己填的坑。歡迎交流。 ...

    you_De 評論0 收藏0

發(fā)表評論

0條評論

最新活動(dòng)
閱讀需要支付1元查看
<