- 1.1、Spring Data Redis 1.8 新特性
- 1.2、Spring Data Redis 1.7 新特性
- 1.3、Spring Data Redis 1.6 新特性
- 1.4、Spring Data Redis 1.5 新特性
- 5.1、Redis要求
- 5.2、Redis支持高级视图
- 5.3、连接到Redis
- 5.4、Redis Sentinel支持
- 5.5、使用RedisTemplate操作Objects
- 5.6、聚焦String的便捷类
- 5.7、序列化器 Serializers
- 5.8、Hash映射
- 5.9、Redis 消息/发布订阅
- 5.10、Redis事务
- 5.11、Pipelining 管道
- 5.12、Redis 脚本
- 5.13、支持类
- 7.1、使用
- 7.2、Object to Hash Mapping
- 7.3、Keyspaces
- 7.4、Secondary Indexes
- 7.5、Time To Live 存活时间
- 7.6、持久化参考
- 7.7、Persisting Partial Updates
- 7.8、查询和查询方法
- 7.9、运行在Cluster上的Redis Repositories
- 7.10、CDI集成
前言
1、新功能
1.1、Spring Data Redis 1.8 新特性
- Jedis升级到2.9。
- Lettuce升级到4.2。(注意,Lettuce 4.2要求Java8)。
- 支持Redis GEO 命令。
- 使用Spring Data Repository抽象来支持Geo索引。
- 基于HashMapper实现的MappingRedisConverter。
- 在repository支持中支持PartialUpdate。
- 对于连接到Redis cluster的SSL支持。
- 当使用Jedis时,支持通过ConnectionFactory来设置client name。
1.2、Spring Data Redis 1.7 新特性
- 支持RedisCluster。
- 支持Spring Data Repository抽象。
1.3、Spring Data Redis 1.6 新特性
- Lettuce Redis驱动,由wg/lettuce切换到mp911de/lettuce。
- 支持ZRANGEBYLEX.
- 增强了ZSET的range操作,包括 +inf 、 -inf。
- RedisCache的性能改进,更早释放连接。
- Generic Jackson2 RedisSerializer,利用了Jackson的多态反序列化
1.4、Spring Data Redis 1.5 新特性
- 添加对Redis HyperLogLog命令的支持:PFADD、PFCOUNT、PFMERGE。
- 可配置的JavaType查找,用于基于RedisSerializers的Jackson。
- 基于PropertySource的配置,用于连接到Redis Sentinel。
介绍
2、为什么选择Spring Data Redis?
3、要求
- SDR 1.x要求JDK 6.0及以上,要求Spring框架4.3.9.RELEASE及以上。
- Redis 2.6.x及以上。
4、开始
4.1、第一步
虽然本文档的每一部分都提供了相关资源的连接,但最好还是提前熟悉下。
Spring Data严重依赖Spring框架的核心功能,例如IoC容器、资源抽象、或者AOP。重要的不是掌握Spring的APIs,而是理解它们背后的概念。至少,应该熟悉IoC。简单的说,你对Spring了解的越多,越容易上手SDR。
4.1.2、了解NoSQL和键值存储
4.1.3、尝试案例
4.2、需要帮助?
4.2.1、社区帮助
4.2.2、专业帮助
4.3、跟随开发
参考文档
5、Redis支持
5.1、Redis要求
5.2、Redis支持高级视图
5.3、连接到Redis
5.3.1、RedisConnection 和 RedisConnectionFactory
活动的RedicConnection由RedisConnectionFactory创建。另外,该工厂还扮演了PersistenceExceptionTranslator,就是说,一旦声明了,它们会允许用户进行透明的异常翻译。例如,通过使用@Repository和AOP的异常翻译。更多信息,见Spring框架的相关部分。
注意:依赖于底层的配置,工厂会返回一个新的连接 或者 一个现有的连接(使用pool或者shared native connection时)。
使用RedisConnectionFactory最简单的方式,是通过IoC容器配置相应的connector,并将其注入使用类中。
重要:不幸的是,目前,不是所有的connector都支持所有的Redis功能。当调用底层库不支持的API时,会抛出UnsupportedOperationException。这种情况在将来可能被解决,视不同的connector的成熟情况。
5.3.2、配置Jedis connector
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <!-- Jedis ConnectionFactory --> <bean id="jedisConnectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory"/> </beans>
<?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:host-name="server" p:port="6379" /> </beans>
5.3.3、配置JRedis connector(自1.7起废弃)
5.3.4、配置SRP connector(自1.7起废弃)
5.3.5、配置Lettuce connector
<?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="lettuceConnectionFactory" class="org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory" p:hostname="server" p:port="6379"/> </beans>
注意:LettuceConnectionFactory 也可以为pooling blocking和事务连接配置一个LettucePool,或者,为所有连接配置一个LettucePool -- 如果shareNativeConnection设为false的话。
5.4、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); }
- spring.redis.sentinel.master: master节点的名字
- spring.redis.sentinel.nodes: 以逗号间隔的host:port列表
5.5、使用RedisTemplate操作Objects
Interface | Description |
---|---|
Key Type Operations |
|
ValueOperations |
Redis string (or value) operations |
ListOperations |
Redis list operations |
SetOperations |
Redis set operations |
ZSetOperations |
Redis zset (or sorted set) operations |
HashOperations |
Redis hash operations |
HyperLogLogOperations |
Redis HyperLogLog operations like (pfadd, pfcount,…) |
GeoOperations |
Redis geospatial operations like |
Key Bound Operations |
|
BoundValueOperations |
Redis string (or value) key bound operations |
BoundListOperations |
Redis list key bound operations |
BoundSetOperations |
Redis set key bound operations |
BoundZSetOperations |
Redis zset (or sorted set) key bound operations |
BoundHashOperations |
Redis hash key bound operations |
BoundGeoOperations |
Redis key bound geospatial operations. |
<?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的便捷类
<?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()); } }
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"); } }); }
5.7、序列化器 Serializers
5.8、Hash映射
- 使用HashOperations和一个序列化器,直接映射。
- 使用Redis Repositories。
- 使用HashMapper和HashOperations。
5.8.1、Hash mappers 哈希映射器
- BeanUtilsHashMapper,使用Spring的BeanUtils。
- ObjectHashMapper,使用Object to Hash Mapping。
- Jackson2HashMapper,使用FasterXML Jackson。
public class Person { String firstname; String lastname; // … } public class HashMapping { @Autowired HashOperations<String, byte[], byte[]> hashOperations; HashMapper<Object, byte[], byte[]> mapper = new ObjectHashMapper(); public void writeHash(String key, Person person) { Map<byte[], byte[]> mappedHash = mapper.toHash(person); hashOperations.putAll(key, mappedHash); } public Person loadHash(String key) { Map<byte[], byte[]> loadedHash = hashOperations.entries("key"); return (Person) mapper.fromHash(loadedHash); } }
5.8.2、Jackson2HashMapper
public class Person { String firstname; String lastname; Address address; } public class Address { String city; String country; }
Hash Field | Value |
---|---|
firstname |
|
lastname |
|
address |
|
Hash Field | Value |
---|---|
firstname |
|
lastname |
|
address.city |
|
address.country |
|
5.9、Redis 消息/发布订阅
5.10、Redis事务
5.10.1、@Transactional 支持5.11、Pipelining 管道
5.12、Redis 脚本
5.13、支持类
5.13.1、对于Spring Cache抽象的支持6、Redis Cluster
6.1、启用Redis Cluster
6.2、Redis Cluster连接
6.3、使用RedisTemplate 和 ClusterOperations