我正在使用Jedis通過Spring數據訪問Redis。Spring Red Data支持Redis BRPOPLPUSH
<bean
id="jedisPoolConfig"
class="redis.clients.jedis.JedisPoolConfig"
p:maxTotal="100"
p:maxIdle="10"
p:maxWaitMillis="5000"
/>
<bean id="jedisConnectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory"
p:host-name="${redis.server.host}" p:port="${redis.server.port}"
p:password="${redis.server.password}"
p:use-pool="${redis.server.usepool}"
p:pool-config-ref="jedisPoolConfig"/>
<bean id="genericJackson2JsonRedisSerializer" class="org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer"/>
<bean id="stringSerializer" class="org.springframework.data.redis.serializer.StringRedisSerializer"/>
<!-- redis template definition -->
<bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate" p:connection-factory-ref="jedisConnectionFactory"> <property name="keySerializer" ref="stringSerializer"/>
<property name="hashKeySerializer" ref="stringSerializer"/>
<property name="hashValueSerializer" ref="genericJackson2JsonRedisSerializer"/>
</bean>
<bean id="stringRedisTemplate" class="org.springframework.data.redis.core.StringRedisTemplate" p:connection-factory-ref="jedisConnectionFactory" />
想執行BRPOPLPUSH
,我沒有看到下
OPTION_1 -> getRedisTemplate().boundListOps("Key").*
OPTION_2 -> getRedisTemplate().opsForList().rightPopAndLeftPush("sourceKey", "destinationKey") ---> No blocking ?
相反,它是在該選項,
OPTION_3 -> getRedisTemplate().getConnectionFactory().getConnection().bRPopLPush(timeout, srcKey, dstKey)
Question_0:這是唯一的選項?爲什麼它在上面的兩個API中不可用?
Answer_0:沒有,只要TIMEUNIT在boundListOps
提到與left/rightPop(timeout, unit)
,opsForList
它是阻塞調用。用0秒的時間單位阻止永遠。
Question_1:爲什麼有這麼多變種..?或可能何時使用boundListOps
,opsForList
和getConnection
?
Partial_Answer_1:看起來,如果多種業務於單個鍵,然後boundListOps採取行動,因爲它綁定到一個鍵,並沒有必要提及的是,在反覆的動作,其中在opsForList,每一個動作關鍵必須提及。
從boundListOps的DOC:
返回上綁定到給定 鍵列表值執行的操作。
請注意,boundListOps仍然通過將註冊密鑰傳遞給它來固有地使用opsForList。
好的,我仍然應該什麼時候直接使用getConnectionFactory().getConnection()
?
Question_2:如果我使用getConnectionFactory().getConnection()
,我是否需要關閉()finally(){}
在這方面? (因爲這是目前支持blocking RPopLPush
的那個)。
從代碼boundListOps
本質上是使用opsForList,它的所有行動最終像下面與釋放連接執行,因此問。
RedisTemplate.java
public <T> T execute(RedisCallback<T> action, boolean exposeConnection, boolean pipeline) {
RedisConnectionFactory factory = getConnectionFactory();
RedisConnection conn = null;
try {
conn = RedisConnectionUtils.getConnection(factory);
...
...
// TODO: any other connection processing?
return postProcessResult(result, connToUse, existingConnection);
} finally {
RedisConnectionUtils.releaseConnection(conn, factory);
}
Question_3:爲什麼getRedisTemplate().boundListOps("key").rightPush(new HashMap());
在接受Map
,而不是像String/Object
雖然"key"
值已經提到...?
Answer_3:這是我的問題,我已經這麼聲明過了。
public RedisTemplate<String, Map<String, Object>> getRedisTemplate() {
return redisTemplate;
}
同樣的RedisTemplate對象在獲取DefaultBoundListOperations時從RedisTemplate引用。
public BoundListOperations<K, V> boundListOps(K key) {
return new DefaultBoundListOperations<K, V>(key, this);
}
class DefaultBoundListOperations<K, V> extends DefaultBoundKeyOperations<K> implements BoundListOperations<K, V> {
public DefaultBoundListOperations(K key, RedisOperations<K, V> operations) {
super(key, operations); //RedisOperations<K, V> is converted to BoundListOperations<K, V> here
this.ops = operations.opsForList();
}
}
Question_4:爲什麼getConnection().bRPopLPush
被接受srcKey, dstKey
爲byte[]
而不是String
..?
對不起,很多問題都引發了,因爲我沒有在spring數據中找到正確的java文檔,或者教程來解釋這些用法。