分享知識 傳遞快樂
Redis 可以存儲鍵與5種不同資料結構類型之間的映射,這5種資料結構類型分别為String(字元串)、List(清單)、Set(集合)、Hash(散列)和 Zset(有序集合)。
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 ValueOperations<K, V> valueOps;
- private ListOperations<K, V> listOps;
- private SetOperations<K, V> setOps;
- private ZSetOperations<K, V> 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是該功能的開關。