spring-boot-starter-data-redis 翻译官方文档 5.3 - 5.6

参考文档: 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接口)进行处理,如下所述:

Table 1. Operational views
InterfaceDescription

Key Type Operations

GeoOperations

Redis geospatial operations like GEOADD, GEORADIUS,…​)

HashOperations

Redis hash operations

HyperLogLogOperations

Redis HyperLogLog operations like (PFADD, PFCOUNT,…​)

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");
    }
   });
}










阅读更多 登录后自动展开
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页