首頁  >  文章  >  資料庫  >  redis與jedis的差別是什麼

redis與jedis的差別是什麼

尚
原創
2019-06-29 17:10:4816948瀏覽

redis與jedis的差別是什麼

redis與spring的整合一般分為spring-data-redis整合和jedis整合,先看看兩者的差異

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實例方式、操作redis服務的不同:

spring-data-redis:

    透過org.springframework.data.redis.connection.jedis.JedisConnectionFactory來管理,即透過工廠類別管理,然後透過配置的模版bean,操作redis服務,程式碼片段中充斥大量與業務無關的模版片段程式碼,程式碼冗餘,不易維護,例如像下面的程式碼:

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 物件來進行對redis的各種操作,它支援所有的redis 原生的api。在RedisTemplate中提供了幾個常用的介面方法的使用,分別是:

private ValueOperationsb56561a2c0bc639cf0044c0859afb88f valueOps;private ListOperationsb56561a2c0bc639cf0044c0859afb88f listOps;private SetOperationsb56561a2c0bc639cf0044c0859afb88f private ZSetOperationsb56561a2c0bc639cf0044c0859afb88f zSetOps;

RedisTemplate中定義了對5種資料結構操作

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

兩者的關聯是StringRedisTemplate繼承RedisTemplate。
兩者的數據是不共通的;也就是說StringRedisTemplate只能管理StringRedisTemplate裡面的數據,RedisTemplate只能管理RedisTemplate中的數據。
SDR預設採用的序列化策略有兩種,一種是String的序列化策略,一種是JDK的序列化策略。
StringRedisTemplate預設採用的是String的序列化策略,而保存的key和value都是採用此策略序列化保存的。

RedisTemplate預設採用的是JDK的序列化策略,保存的key和value都是採用此策略序列化保存的。

jedis方式:

透過redis.clients.jedis.JedisPool來管理,即透過池來管理,透過池物件取得jedis實例,然後透過jedis實例直接操作redis服務,剔除了與業務無關的冗餘程式碼,如下面的程式碼片段:

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

從工廠類別到池的方式變化,就相當於mybatis連接mysql方變化是一樣的,程式碼變得更簡潔,維護也更容易了。 Jedis使用apache commons-pool2對Jedis資源池進行管理,所以在定義JedisPool時一個很重要的參數就是資源池GenericObjectPoolConfig,使用方式如下,其中有許多資源管理和使用的參數。

參數說明

JedisPool保證資源在一個可控範圍內,並且提供了線程安全,但是一個合理的GenericObjectPoolConfig配置能為應用使用Redis保駕護航,下面將對它的一些重要參數進行說明與建議:

在目前環境下,Jedis連線就是資源,JedisPool管理的就是Jedis連線。

1、資源設定和使用

maxTotal:資源池中最大連線數;預設值:8 設定建議見下節
maxIdle:資源池允許最大空閒的連線數;預設值:8;使用建議:設定建議請參閱下節
minIdle:資源池確保最少空閒的連線數;預設值:0;使用建議:設定建議請參閱下方節
blockWhenExhausted:當資源池用完後,呼叫者是否要等待。只有當為true時,下面的maxWaitMillis才會生效;預設值:true;使用建議:建議使用預設值
maxWaitMillis:當資源池連接用盡後,呼叫者的最大等待時間(單位為毫秒) - 1:表示永不逾時;使用建議:不建議使用預設值
testOnBorrow:向資源池借用連線時是否做連線有效性偵測(ping),無效連線會被移除;預設值:false;使用建議:業務量很大時候建議設定為false(多一次ping的開銷)。
testOnReturn:向資源池歸還連線時是否做連線有效性偵測(ping),無效連線會被移除;預設值:false;使用建議:業務量很大時候建議設定為false(多一次ping的開銷)。
jmxEnabled:是否開啟jmx監控,可用來監控;預設值:true;使用建議:建議開啟,但應用程式本身也要開啟

2、空閒資源監控

空閒Jedis物件偵測,下面四個參數組合來完成,testWhileIdle是該功能的開關。

testWhileIdle:是否開啟空閒資源監測;預設值:false;使用建議:true
timeBetweenEvictionRunsMillis:空閒資源的偵測週期(單位為毫秒);預設值:-1:不偵測;使用建議:建議設定,週期自行選擇,也可以預設也可以使用下面JedisPoolConfig中的配置
minEvictableIdleTimeMillis:資源池中資源最小空閒時間(單位為毫秒),達到此值後空閒資源將被移除;預設值:1000 60 30 = 30分鐘;使用建議:可依自身業務決定,大部分預設值即可,也可以考慮使用下面JeidsPoolConfig中的配置
numTestsPerEvictionRun:做空閒資源偵測時,每次的取樣數;預設值: 3;使用建議:可根據自身應用連接數進行微調,如果設定為-1,就是對所有連接做空閒監測

更多Redis相關知識,請訪問Redis使用教程欄!

以上是redis與jedis的差別是什麼的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn