溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

redis與jedis的區(qū)別有哪些

發(fā)布時(shí)間:2020-09-15 14:23:12 來源:億速云 閱讀:286 作者:小新 欄目:關(guān)系型數(shù)據(jù)庫

redis與jedis的區(qū)別有哪些?這個(gè)問題可能是我們?nèi)粘W(xué)習(xí)或工作經(jīng)常見到的。希望通過這個(gè)問題能讓你收獲頗深。下面是小編給大家?guī)淼膮⒖純?nèi)容,讓我們一起來看看吧!

redis與spring的整合一般分為spring-data-redis整合和jedis整合,先看看兩者的區(qū)別

1、引用的依賴不同:

spring-data-redis使用的依賴如下:

<dependency>  
      <groupId>org.springframework.data</groupId>  
      <artifactId>spring-data-redis</artifactId>  
      <version>1.8.9.RELEASE</version>  
</dependency>

jedis使用的依賴如下:

<dependency>
       <groupId>redis.clients</groupId>
       <artifactId>jedis</artifactId>
       <version>2.9.0</version>
       <type>jar</type>
       <scope>compile</scope>
</dependency>

2、管理jedis實(shí)例方式、操作redis服務(wù)的不同:

spring-data-redis:

通過org.springframework.data.redis.connection.jedis.JedisConnectionFactory來管理,即通過工廠類管理,然后通過配置的模版bean,操作redis服務(wù),代碼段中充斥大量與業(yè)務(wù)無關(guān)的模版片段代碼,代碼冗余,不易維護(hù),比如像下面的代碼:

protected RedisTemplate<Serializable, Serializable> redisTemplate;
 
public void saveUser(User user) {
    redisTemplate.execute(new RedisCallback<Object>() {
 
 
        @Override
        public Object doInRedis(RedisConnection connection) throws DataAccessException {
            connection.set(redisTemplate.getStringSerializer().serialize("user.uid." + user.getId()),
                           redisTemplate.getStringSerializer().serialize(user.getName()));
            return null;
        }
    });
}
 
 
public User getUser(long id) {
    return redisTemplate.execute(new RedisCallback<User>() {
        @Override
        public User doInRedis(RedisConnection connection) throws DataAccessException {
            byte[] key = redisTemplate.getStringSerializer().serialize("user.uid." + id);
            if (connection.exists(key)) {
                byte[] value = connection.get(key);
                String name = redisTemplate.getStringSerializer().deserialize(value);
                User user = new User();
                user.setName(name);
                user.setId(id);
                return user;
            }
            return null;
        }
    });
}

RedisTemplate介紹

spring 封裝了 RedisTemplate 對(duì)象來進(jìn)行對(duì)redis的各種操作,它支持所有的 redis 原生的 api。在RedisTemplate中提供了幾個(gè)常用的接口方法的使用,分別是:

private ValueOperations<K, V> valueOps;private ListOperations<K, V> listOps;private SetOperations<K, V> setOps;private ZSetOperations<K, V> zSetOps;

RedisTemplate中定義了對(duì)5種數(shù)據(jù)結(jié)構(gòu)操作

redisTemplate.opsForValue();//操作字符串
redisTemplate.opsForHash();//操作hash
redisTemplate.opsForList();//操作list
redisTemplate.opsForSet();//操作set
redisTemplate.opsForZSet();//操作有序set
StringRedisTemplate與RedisTemplate

兩者的關(guān)系是StringRedisTemplate繼承RedisTemplate。
兩者的數(shù)據(jù)是不共通的;也就是說StringRedisTemplate只能管理StringRedisTemplate里面的數(shù)據(jù),RedisTemplate只能管理RedisTemplate中的數(shù)據(jù)。
SDR默認(rèn)采用的序列化策略有兩種,一種是String的序列化策略,一種是JDK的序列化策略。
StringRedisTemplate默認(rèn)采用的是String的序列化策略,保存的key和value都是采用此策略序列化保存的。

RedisTemplate默認(rèn)采用的是JDK的序列化策略,保存的key和value都是采用此策略序列化保存的。

jedis方式:

通過redis.clients.jedis.JedisPool來管理,即通過池來管理,通過池對(duì)象獲取jedis實(shí)例,然后通過jedis實(shí)例直接操作redis服務(wù),剔除了與業(yè)務(wù)無關(guān)的冗余代碼,如下面的代碼片段:

private JedisPool jedisPool;
public String save(String key,String val) {
Jedis jedis = jedisPool.getResource();
return jedis.set(key, val);
}

從工廠類到池的方式變化,就相當(dāng)于mybatis連接mysql方變化是一樣的,代碼變得更簡潔,維護(hù)也更容易了。Jedis使用apache commons-pool2對(duì)Jedis資源池進(jìn)行管理,所以在定義JedisPool時(shí)一個(gè)很重要的參數(shù)就是資源池GenericObjectPoolConfig,使用方式如下,其中有很多資源管理和使用的參數(shù)。

參數(shù)說明

JedisPool保證資源在一個(gè)可控范圍內(nèi),并且提供了線程安全,但是一個(gè)合理的GenericObjectPoolConfig配置能為應(yīng)用使用Redis保駕護(hù)航,下面將對(duì)它的一些重要參數(shù)進(jìn)行說明和建議:

在當(dāng)前環(huán)境下,Jedis連接就是資源,JedisPool管理的就是Jedis連接。

1、資源設(shè)置和使用

maxTotal:資源池中最大連接數(shù);默認(rèn)值:8 設(shè)置建議見下節(jié)
maxIdle:資源池允許最大空閑的連接數(shù);默認(rèn)值:8;使用建議:設(shè)置建議見下節(jié)
minIdle:資源池確保最少空閑的連接數(shù);默認(rèn)值:0;使用建議:設(shè)置建議見下節(jié)
blockWhenExhausted:當(dāng)資源池用盡后,調(diào)用者是否要等待。只有當(dāng)為true時(shí),下面的maxWaitMillis才會(huì)生效;默認(rèn)值:true;使用建議:建議使用默認(rèn)值
maxWaitMillis:當(dāng)資源池連接用盡后,調(diào)用者的最大等待時(shí)間(單位為毫秒) -1:表示永不超時(shí);使用建議:不建議使用默認(rèn)值
testOnBorrow:向資源池借用連接時(shí)是否做連接有效性檢測(cè)(ping),無效連接會(huì)被移除;默認(rèn)值:false;使用建議:業(yè)務(wù)量很大時(shí)候建議設(shè)置為false(多一次ping的開銷)。
testOnReturn:向資源池歸還連接時(shí)是否做連接有效性檢測(cè)(ping),無效連接會(huì)被移除;默認(rèn)值:false;使用建議:業(yè)務(wù)量很大時(shí)候建議設(shè)置為false(多一次ping的開銷)。
jmxEnabled:是否開啟jmx監(jiān)控,可用于監(jiān)控;默認(rèn)值:true;使用建議:建議開啟,但應(yīng)用本身也要開啟

2、空閑資源監(jiān)測(cè)

空閑Jedis對(duì)象檢測(cè),下面四個(gè)參數(shù)組合來完成,testWhileIdle是該功能的開關(guān)。

testWhileIdle:是否開啟空閑資源監(jiān)測(cè);默認(rèn)值:false;使用建議:true
timeBetweenEvictionRunsMillis:空閑資源的檢測(cè)周期(單位為毫秒);默認(rèn)值:-1:不檢測(cè);使用建議:建議設(shè)置,周期自行選擇,也可以默認(rèn)也可以使用下面JedisPoolConfig中的配置
minEvictableIdleTimeMillis:資源池中資源最小空閑時(shí)間(單位為毫秒),達(dá)到此值后空閑資源將被移除;默認(rèn)值:1000 60 30 = 30分鐘;使用建議:可根據(jù)自身業(yè)務(wù)決定,大部分默認(rèn)值即可,也可以考慮使用下面JeidsPoolConfig中的配置
numTestsPerEvictionRun:做空閑資源檢測(cè)時(shí),每次的采樣數(shù);默認(rèn)值:3;使用建議:可根據(jù)自身應(yīng)用連接數(shù)進(jìn)行微調(diào),如果設(shè)置為-1,就是對(duì)所有連接做空閑監(jiān)測(cè)

感謝各位的閱讀!看完上述內(nèi)容,你們對(duì)redis與jedis的區(qū)別有哪些大概了解了嗎?希望文章內(nèi)容對(duì)大家有所幫助。如果想了解更多相關(guān)文章內(nèi)容,歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI