redission計數器實現,redisTemplate計數器

在redission 2.9.0版本以前是有BUG,在實現下面代碼時,第一次是成功的,可是在第二次就會失敗:html

RedissonClient client;//client參考別的demo
RMapCache<String, Integer> mapCache = client.getMapCache("nameSpace");
mapCache.putIfAbsent("redisKey", 0, 1, TimeUnit.DAYS);//當不存在redisKey時,就放置這個redis,存在則不放置

在redission 2.9.0(3.4.1)版本以後修復BUG,屢次操做是成功的:java

		RedissonClient client = RedissonHolder.getClient();//具體實現參考別的demo
		RMapCache<String, Integer> mapCache = client.getMapCache("nameSpace",IntegerCodec.INSTANCE);
		String redisKey = channel + "-" + userId;
		mapCache.putIfAbsent("redisKey", 0, 1, TimeUnit.DAYS);
		logger.info("獲取redis計數器:{}", redisKey);
		int incr = mapCache.addAndGet(redisKey, 1);//加1並獲取計算後的值

  參考pom:redis

         <dependency>
          	<groupId>org.redisson</groupId>
	        <artifactId>redisson</artifactId>
	        <version>3.4.1</version>
         </dependency>

  可參考redis demo:spring

import java.io.IOException;
import java.io.InputStream;
import java.util.ResourceBundle;

import org.redisson.Redisson;
import org.redisson.api.RedissonClient;
import org.redisson.config.Config;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;


public class RedissonHolder {

    private static final Logger LOGGER = LoggerFactory.getLogger(RedissonHolder.class);

    private static final RedissonHolder HOLDER = new RedissonHolder();

    private RedissonClient redisson;

    private RedissonHolder() {

        String location = ResourceBundle.getBundle("redisson").getString("redisson.json.location");
        InputStream inputStream = RedissonHolder.class.getClassLoader().getResourceAsStream(location);
        Config config = null;
        try {
            config = Config.fromJSON(inputStream);
        } catch (IOException e) {
            LOGGER.error("獲取Redisson配置文件失敗", e);
        }
        this.redisson = Redisson.create(config);
    }

   
    public static RedissonClient getClient() {
        return HOLDER.redisson;
    }

}

  redisson.properties(等號後面所有換成一行) :json

redisson.json.location ={"singleServerConfig":{"idleConnectionTimeout":10000,

"pingTimeout":1000,
"connectTimeout":10000,
"timeout":5000,
"retryAttempts":5,
"retryInterval":1500,
"reconnectionTimeout":3000,
"failedAttempts":3,
"password":"root",
"subscriptionsPerConnection":5,
"clientName":null,
"address":"redis://my.redis.com:6379",
"subscriptionConnectionMinimumIdleSize":1,
"subscriptionConnectionPoolSize":50,
"connectionMinimumIdleSize":10,
"connectionPoolSize":64,
"database":0,
"dnsMonitoring":false,
"dnsMonitoringInterval":5000
},
"threads":0,
"nettyThreads":0,
"codec":null,
"useLinuxNativeEpoll":false
}api

  基於 springboot 的 redisTemplate計數器緩存

redisTemplate基本配置參考 http://www.cnblogs.com/tietazhan/p/7479585.htmlspringboot

而後就能夠直接使用內部函數函數

redisTemplate.opsForHash().increment(H var1, HK var2, long var3);

 第一個爲緩存key值,第二個爲hashKey值,第三個爲增量值。this

相關文章
相關標籤/搜索