参考文档: https://docs.spring.io/spring-data/redis/docs/2.0.3.RELEASE/reference/html/
Redis中文教程: http://www.redis.net.cn/tutorial/3501.html
RedisConnectionFactory: 用于创建RedisConnection 实例,根据底层配置,RedisConnectionFactory 可以返回一个新连接或现有连接(以防止连接池或共享的本地连接已经使用),使用RedisConnectionFactory的最简单方法是通过IoC容器配置适当的连接器(连接器:connector;Jekis就是其中一种连接器),并将其注入到使用的类中。不幸的是,目前并非所有连接器都支持所有Redis功能。当调用连接的方法是底层API库不受支持的方法时,一个UnsupportedOperationException将会被抛出。 随着各种连接器的成熟,这种情况在未来可能会得到解决。
Jedis是Spring Data Redis模块通过org.springframework.data.redis.connection.jedis包支持的连接器之一。 最简单形式的Jedis配置如下所示:
但是,对于生产环境(Production)用途,可能需要调整主机或密码等设置:p:host-name="server" p:port="6379"
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,则可以使用所有连接。
为了处理高可用性的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)定义。
有时需要与Sentinels之一直接互动。使用RedisConnectionFactory.getSentinelConnection()或RedisConnection.getSentinelCommands()可以访问配置的第一个活动Sentinel。
此外,该模板提供了操作视图(参考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 |
...
public class Example {
// inject the actual template
@Autowired
private RedisTemplate template;
// inject the template as ListOperations
@Resource(name="redisTemplate")
private ListOperations listOps;
public void addLink(String userId, URL url) {
listOps.leftPush(userId, url.toExternalForm());
}
}
由于存储在Redis中的键和值通常是java.lang.String,因此Redis模块为RedisConnection和RedisTemplate提供了两个扩展,分别为StringRedisConnection(DefaultStringRedisConnection实现)和StringRedisTemplate提供了一个方便的一站式解决方案用于频繁密集的String操作。 除了绑定到字符串键外,模板和连接还使用下面的StringRedisSerializer,在表示存储的键和值是人类可读的(假设在Redis和您的代码中使用相同的编码)。 例如:
...
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