参考文档: https://docs.spring.io/spring-data/redis/docs/2.0.3.RELEASE/reference/html/
Redis中文教程: http://www.redis.net.cn/tutorial/3501.html
5.3.1. RedisConnection and RedisConnectionFactory
RedisConnection:提供基础的构建功能,用于Redis前后端的通信,并且会自动的将Redis的connection异常转化成Spring DAO异常,同时RedisConnection提供了专用方法getNativeConnection,获取底层原始的connection对象。
RedisConnectionFactory: 用于创建RedisConnection 实例,根据底层配置,RedisConnectionFactory 可以返回一个新连接或现有连接(以防止连接池或共享的本地连接已经使用),使用RedisConnectionFactory的最简单方法是通过IoC容器配置适当的连接器(连接器:connector;Jekis就是其中一种连接器),并将其注入到使用的类中。不幸的是,目前并非所有连接器都支持所有Redis功能。当调用连接的方法是底层API库不受支持的方法时,一个UnsupportedOperationException将会被抛出。 随着各种连接器的成熟,这种情况在未来可能会得到解决。
5.3.2. Configuring Jedis connector
Jedis是Spring Data Redis模块通过org.springframework.data.redis.connection.jedis包支持的连接器之一。 最简单形式的Jedis配置如下所示:
但是,对于生产环境(Production)用途,可能需要调整主机或密码等设置:p:host-name="server" p:port="6379"
5.3.3. Configuring Lettuce connector
Lettuce是一个Spring Data Redis通过org.springframework.data.redis.connection.lettuce包支持的基于netty的可伸缩线程安全的开源连接器(Redis客户端)。多个线程可以共享同一个RedisConnection。它利用优秀netty NIO框架来高效地管理多个连接。Lettuce 的详细介绍和下载地址:点击下载
配置方式与Jedis类似:
还有一些可以调整的Lettuce专用的连接参数。 默认情况下,由LettuceConnectionFactory创建的所有LettuceConnection共享用于所有非阻塞和非事务操作的相同线程安全本机连接。 将shareNativeConnection设置为false,以便每次都使用专用连接。 LettuceConnectionFactory也可以配置为使用LettucePool来共享阻塞和事务连接,或者如果shareNativeConnection设置为false,则可以使用所有连接。
5.4. Redis Sentinel Support
为了处理高可用性的Redis,RedisSentinel使用RedisSentinelConfiguration支持Redis Sentinel
/**
* jedis
*/
@Bean
public RedisConnectionFactory jedisConnectionFactory() {
RedisSentinelConfiguration sentinelConfig = new RedisSentinelConfiguration()
.master("mymaster")
.sentinel("127.0.0.1", 26379)
.sentinel("127.0.0.1", 26380);
return new JedisConnectionFactory(sentinelConfig);
}
/**
* Lettuce
*/
@Bean
public RedisConnectionFactory lettuceConnectionFactory() {
RedisSentinelConfiguration sentinelConfig = new RedisSentinelConfiguration()
.master("mymaster")
.sentinel("127.0.0.1", 26379)
.sentinel("127.0.0.1", 26380);
return new LettuceConnectionFactory(sentinelConfig);
}
RedisSentinelConfiguration也可以通过PropertySource(在applicatoin.properties或者其他在classpath上的properties)定义。
配置属性
spring.redis.sentinel.master:主节点(master node)的名称。
spring.redis.sentinel.nodes:逗号分隔的主机:端口对列表(host:port pairs)。
有时需要与Sentinels之一直接互动。使用RedisConnectionFactory.getSentinelConnection()或RedisConnection.getSentinelCommands()可以访问配置的第一个活动Sentinel。
5.5. Working with Objects through RedisTemplate
大多数用户可能喜欢使用RedisTemplate及其相应的包org.springframework.data.redis.core - 由于其丰富的功能集,模板实际上是Redis模块的集中化类的体现。 该模板为Redis交互提供了高层次(high-level 上层)的抽象。 而RedisConnection提供了接受和返回二进制值(字节数组)的低层方法,但该模板负责序列化和管理连接,使用户无需处理这些细节。此外,该模板提供了操作视图(参考Redis命令相关文档),该视图提供了丰富的,通用的接口,用于针对特定类型或特定键(通过KeyBound接口)进行处理,如下所述:
Interface | Description |
---|---|
Key Type Operations | |
GeoOperations | Redis geospatial operations like |
HashOperations | Redis hash operations |
HyperLogLogOperations | Redis HyperLogLog operations like ( |
ListOperations | Redis list operations |
SetOperations | Redis set operations |
ValueOperations | Redis string (or value) operations |
ZSetOperations | Redis zset (or sorted set) operations |
Key Bound Operations | |
BoundGeoOperations | Redis key bound geospatial operations. |
BoundHashOperations | Redis hash key bound operations |
BoundKeyOperations | Redis key bound operations |
BoundListOperations | Redis list key bound operations |
BoundSetOperations | Redis set key bound operations |
BoundValueOperations | Redis string (or value) key bound operations |
BoundZSetOperations | Redis zset (or sorted set) key bound operations |
开箱即用,RedisTemplate在其大部分操作中使用基于Java的序列化程序。这意味着模板写入或读取的任何对象都将通过Java进行序列化/反序列化。序列化机制可以很容易地在模板上进行更改,Redis模块在org.springframework.data.redis.serializer包中提供了多个可用实现 - 请参阅 序列化程序以获取更多信息。您还可以将任何序列化程序设置为null,并通过将enableDefaultSerializer属性设置为false来对原始字节数组使用RedisTemplate。请注意,模板要求所有的键都是非空值 - 只要基础序列化程序接受它们,值就可以为空;阅读每个序列化程序的javadoc以获取更多信息。
对于需要特定模板视图的情况,将视图声明为依赖项并注入模板:容器将自动执行消除opsFor [X]调用的转换:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="jedisConnectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory" p:use-pool="true"/>
<!-- redis template definition -->
<bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate" p:connection-factory-ref="jedisConnectionFactory"/>
...
</beans>
public class Example {
// inject the actual template
@Autowired
private RedisTemplate<String, String> template;
// inject the template as ListOperations
@Resource(name="redisTemplate")
private ListOperations<String, String> listOps;
public void addLink(String userId, URL url) {
listOps.leftPush(userId, url.toExternalForm());
}
}
5.6. String-focused convenience classes
由于存储在Redis中的键和值通常是java.lang.String,因此Redis模块为RedisConnection和RedisTemplate提供了两个扩展,分别为StringRedisConnection(DefaultStringRedisConnection实现)和StringRedisTemplate提供了一个方便的一站式解决方案用于频繁密集的String操作。 除了绑定到字符串键外,模板和连接还使用下面的StringRedisSerializer,在表示存储的键和值是人类可读的(假设在Redis和您的代码中使用相同的编码)。 例如:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="jedisConnectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory" p:use-pool="true"/>
<bean id="stringRedisTemplate" class="org.springframework.data.redis.core.StringRedisTemplate" p:connection-factory-ref="jedisConnectionFactory"/>
...
</beans>
public class Example {
@Autowired
private StringRedisTemplate redisTemplate;
public void addLink(String userId, URL url) {
redisTemplate.opsForList().leftPush(userId, url.toExternalForm());
}
}
与其他Spring模板一样,RedisTemplate和StringRedisTemplate允许开发人员通过RedisCallback接口直接与Redis对话。 当它直接与RedisConnection对话时,这给了开发人员完全的控制权。请注意,当使用StringRedisTemplate时,回调接收到StringRedisConnection的实例。
Michael:RedisCallback方法就相当于直接在Redis客户端操作Redis命令一样。
public void useCallback() {
redisTemplate.execute(new RedisCallback<Object>() {
public Object doInRedis(RedisConnection connection) throws DataAccessException {
Long size = connection.dbSize();
// Can cast to StringRedisConnection if using a StringRedisTemplate
((StringRedisConnection)connection).set("key", "value");
}
});
}