spring-boot-starter-data-redis官⽅⽂档中⽂版
参考⽂档: docs.spring.io/spring-data/redis/docs/2.0.3.RELEASE/reference/html/
Redis中⽂教程: dis/tutorial/3501.html
Redis官⽅中⽂⽂档之Redis集教程: ifeve/redis-cluster-tutorial/
本⽂是从5.3.1. RedisConnection and RedisConnectionFactory 开始翻译的,因为前⾯的章节不太实⽤。
点击下⾯的链接可直达官⽹:
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.tion.jedis包⽀持的连接器之⼀。最简单形式的Jedis配置如下所⽰:
但是,对于⽣产环境(Production)⽤途,可能需要调整主机或密码等设置:p:host-name="server" p:port="6379"
5.3.3. Configuring Lettuce connector
Lettuce是⼀个Spring Data Redis通过org.tion.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)定义。
配置属性
以下是⼀个使⽤Lua脚本执⾏常见“检查并设置”场景的⽰例。对于Redis脚本来说,这是⼀个理想的⽤例,因为它要求我们以原⼦⽅式执⾏⼀组命令,并且⼀个命令的⾏为受另⼀个命令的影响。
@Bean
public RedisScript<Boolean> script() {
ScriptSource scriptSource = new ResourceScriptSource(new ClassPathResource("META-INF/scripts/checkandset.lua");
return RedisScript.of(scriptSource, Boolean.class);
}
public class Example {
@Autowired
RedisScript<Boolean> script;
public boolean checkAndSet(String expectedValue, String newValue) {
ute(script, singletonList("key"), asList(expectedValue, newValue));
}
}
-- checkandset.lua local
current = redis.call('GET', KEYS[1])
if current == ARGV[1]
then redis.call('SET', KEYS[1], ARGV[2])
return true
end
return false
上⾯的代码配置RedisScript指向名为checkandset.lua的⽂件,该⽂件预计会返回⼀个布尔值。脚本re
sultType应该是Long,Boolean,List 或反序列化值类型之⼀。如果脚本返回丢弃状态(即“OK”),它也可以为空。在应⽤程序上下⽂中配置DefaultRedisScript的单个实例是⾮常理想的,以避免在每次脚本执⾏时重新计算脚本的SHA1。
上⾯的checkAndSet⽅法执⾏脚本可以作为事务或管道的⼀部分在SessionCallback中执⾏。有关更多信息,请参阅Redis事务和管道传输。
Spring Data Redis提供的脚本⽀持还允许您使⽤Spring Task和Scheduler抽象计划定期执⾏Redis脚本。有关更多详细信息,请参阅Spring Framework⽂档。
5.13. Support Classes
Package org.dis.support提供各种可重⽤组件,这些组件依赖Redis作为后备存储。⽬前,该软件包在Redis之上包含各种基于JDK的界⾯实现,如原⼦计数器和JDK集合。
原⼦计数器可以轻松地包装Redis密钥增量,⽽集合允许以最⼩的存储空间或API泄漏轻松管理Redis密钥:特别是RedisSet和RedisZSet接⼝可以轻松访问Redis⽀持的集合操作,例如交集intersection和联合union,⽽RedisList在Redis之上实现了List,Queue和Deque契约(及其等效的同级同胞),将存储作为FIFO(先进先出),LIFO(后进先出)或采⽤最⼩配置的集合:
public class AnotherExample {
// injected
private Deque<String> queue;
public void addTag(String tag) {
queue.push(tag);
}
}
如上例所⽰,使⽤代码与实际的存储实现分离 - 事实上,没有指出在下⾯使⽤Redis的情况。这使得从开发到⽣产环境变得透明并且极⼤地提⾼了可测试性(Redis实现可以被在内存中的⼀个所取代)。
5.13.1. Support for Spring Cache Abstraction - 2.0中的改变
Spring Redis通过org.dis.cache包提供了Spring缓存抽象的实现。要使⽤Redis作为后台实现,只需将RedisCacheManager添加到您的配置中即可:
@Bean
public RedisCacheManager cacheManager(RedisConnectionFactory connectionFactory) {
ate(connectionFactory);
}
RedisCacheManager⾏为可以通过RedisCacheManagerBuilder配置,允许设置默认的RedisCacheConfiguration,事务⾏为和预定义的缓存。
RedisCacheManager cm = RedisCacheManager.builder(connectionFactory)
.cacheDefaults(defaultCacheConfig())
.initialCacheConfigurations(singletonMap("predefined", defaultCacheConfig().disableCachingNullValues()))
.transactionAware()
.build();
通过RedisCacheManager创建的RedisCache的⾏为通过RedisCacheConfiguration定义。该配置允许设置密钥到期时间,前缀和RedisSerializer以转换为⼆进制存储格式和从⼆进制存储格式转换。如上所⽰,RedisCacheManager允许定义每个缓存库上的配置。RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig()
.entryTtl(Duration.ofSeconds(1))
.disableCachingNullValues();
RedisCacheManager默认使⽤⽆锁 Lock-free RedisCacheWriter来读取和写⼊⼆进制值。⽆锁缓存提⾼了吞吐量。缺少⼊⼝锁定可能会导致putIfAbsent和clean⽅法的重叠⾮原⼦命令,因为那些⽅法需要将多个命令发送到Redis。锁定副本通过设置显式锁定键explicit lock key 并检查是否存在此键来防⽌命令重叠,这会导致额外的请求和潜在的命令等待时间。
可以选择加⼊锁定⾏为如下:
RedisCacheManager cm = RedisCacheManager.build(RedisCacheWriter.lockingRedisCacheWriter())
.cacheDefaults(defaultCacheConfig())
...
Table 4. RedisCacheManager defaults
Table 5. RedisCacheConfiguration defaults
6. Reactive Redis support
本节介绍Redis⽀持以及如何⼊门。你会发现与有某些重叠。
6.1. Redis Requirements
Spring Data Redis需要Redis 2.6或更⾼版本以及Java SE 8.0或更⾼版本。在语⾔绑定(或连接器)⽅⾯,Spring Data Redis⽬前与Lettuce集成为唯⼀的reactive Java连接器。 Project Reactor被作为reactive组合库。
6.2. Connecting to Redis using a reactive driver
使⽤Redis和Spring的⾸要任务之⼀是通过IoC容器连接到商店。为此,需要Java连接器connector(或绑定binding)。⽆论选择哪个库,只有⼀组SpringDataRedis API需要使⽤,它们在所有连接器中的⾏
为⼀致,org.tion包和它的ReactiveRedisConnection和ReactiveRedisConnectionFactory接⼝,以便处理并检索到Redis的活动连接。
6.2.1. Redis Operation Modes
Redis可以作为独⽴服务器运⾏,使⽤或模式运⾏。
⽀持上⾯提到的所有连接类型。
6.2.2. ReactiveRedisConnection and ReactiveRedisConnectionFactory ReactiveRedisConnection为Redis通信提供构建块,因为它处理与Redis后端的通信。它还⾃动将底层驱动程序异常转换为Spring的⼀致DAO异常层次结构,因此可以在不更改任何代码的情况下切换连接器,因为操作语义保持不变。
ReactiveRedisConnections的实例是通过ReactiveRedisConnectionFactory创建的。另外,⼯⼚充当PersistenceExceptionTranslators,意味着⼀旦声明,它允许⼈们处理成明确的异常。例如,通过使⽤@Repository注释和AOP进⾏异常处理。有关更多信息,请参阅Spring Framework⽂档中的专⽤章节。
根据底层配置,⼯⼚可以返回新连接或现有连接(如果使⽤池或共享本地连接)。
使⽤Reactive RedisConnectionFactory的最简单⽅法是通过IoC容器配置适当的连接器,并将其注⼊到使⽤的类中。
6.2.3. Configuring Lettuce connector
Spring Data Redis通过org.tion.lettuce包⽀持Lettuce。
为Lettuce设置ReactiveRedisConnectionFactory可以按如下⽅式完成:
@Bean
public ReactiveRedisConnectionFactory connectionFactory() {
return new LettuceConnectionFactory("localhost", 6379);
}
使⽤LettuceClientConfigurationBuilder的更复杂的配置(包括SSL和超时)如下所⽰:
@Bean
public ReactiveRedisConnectionFactory lettuceConnectionFactory() {
LettuceClientConfiguration clientConfig = LettuceClientConfiguration.builder()
.useSsl().and()
mandTimeout(Duration.ofSeconds(2))
.shutdownTimeout(Duration.ZERO)
.build();
return new LettuceConnectionFactory(new RedisStandaloneConfiguration("localhost", 6379), clientConfig);
}
有关更详细的客户端配置调整,请参阅LettuceClientConfiguration。
6.3. Working with Objects through ReactiveRedisTemplate
Most users are likely to use ReactiveRedisTemplate and its corresponding package org. - the template is in fact the central class of the Redis module du
e to its rich feature set. The template offers a high-level abstraction for Redis interactions. While ReactiveRedisConnection offers low level methods that accept and return binary values (ByteBuffer), the template takes care of serialization and connection management, freeing the user from dealing with such details.
Moreover, the template provides operation views (following the grouping from Redis command ) that offer rich, generified interfaces for working against a certain type as described below:
⼤多数⽤户可能使⽤ReactiveRedisTemplate及其相应的包org. - 由于其丰富的功能集,template实际上是Redis模块的中⼼类。该模板为Redis交互提供了⾼级抽象。虽然ReactiveRedisConnection提供接受和返回⼆进制值(ByteBuffer)的低级⽅法,但该模板负责序列化和连接管理,使⽤户⽆需处理这些细节。
此外,该模板提供了操作视图(来⾃Redis命令参考的分组之后),该视图提供了丰富的,通⽤的接⼝,⽤于针对某种类型进⾏处理,如下所述:
Table 6. Operational views
配置完成后,该模板是线程安全的,可以在多个实例中重复使⽤。
开箱即⽤,ReactiveRedisTemplate在其⼤部分操作中使⽤基于Java的序列化程序。这意味着模板写⼊或读取的任何对象都将通过RedisElementWriter和RedisElementReader进⾏序列化/反序列化。序列化上下⽂在构建时传递给模板,Redis模块在
org.dis.serializer包中提供了⼏个可⽤实现 - 请参阅序列化程序以获取更多信息。
@Configuration
class RedisConfiguration {
@Bean
ReactiveRedisTemplate<String, String> reactiveRedisTemplate(ReactiveRedisConnectionFactory factory) {
return new ReactiveRedisTemplate<>(connectionFactory, RedisSerializationContext.string());
}
}
public class Example {
@Autowired
private ReactiveRedisTemplate<String, String> template;
public Mono<Long> addLink(String userId, URL url) {
return template.opsForList().leftPush(userId, ExternalForm());
}
}
6.4. Reactive Scripting
通过ReactiveRedisTemplate使⽤ReactiveScriptExecutor也可以实现Reactive基础构建执⾏ Redis scripts的功能。
public class Example {
@Autowired
private ReactiveRedisTemplate<String, String> template;
public Flux<Long> theAnswerToLife() {
DefaultRedisScript<Long> script = new DefaultRedisScript<>();
script.setLocation(new ClassPathResource("META-INF/scripts/42.lua"));
script.setResultType(Long.class);
ute(script);
}
}
7. Redis Cluster
使⽤Redis集需要Redis Server 3.0+版本,并提供了⼀套⾃⼰的特性和功能。有关更多信息,请参阅集教程。
7.1. Enabling Redis Cluster
集⽀持基于与⾮集通信相同的构建块。RedisClusterConnection是RedisConnection的扩展,⽤于处理与Redis集的通信,并将错误转换为Spring DAO异常层次结构。 RedisClusterConnection通过RedisConnectionFactory创建,必须使⽤相应的RedisClusterConfiguration进⾏设置。
⽰例1. Redis集的⽰例RedisConnectionFactory配置
@Component
@ConfigurationProperties(prefix = "dis.cluster")
public class ClusterConfigurationProperties {
/*
* des[0] = 127.0.0.1:7379
* des[1] = 127.0.0.1:7380
* ...
*/
List<String> nodes;
/**
* Get initial collection of known cluster nodes in format {@code host:port}.
*
* @return
*/
public List<String> getNodes() {
return nodes;
}
public void setNodes(List<String> nodes) {
}
}
@Configuration
public class AppConfig {
/**
* Type safe representation of application.properties
*/
@Autowired ClusterConfigurationProperties clusterProperties;
public @Bean RedisConnectionFactory connectionFactory() {
return new JedisConnectionFactory(
springboot aopnew Nodes()));
}
}
RedisClusterConfiguration可以通过PropertySource定义

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。