Spring Data Redis学习
Posted LarryZeal
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring Data Redis学习相关的知识,希望对你有一定的参考价值。
- 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>
同样,也有一些Lettuce特有的连接参数可以调整。默认,LettuceConnectionFactory创建的所有LettuceConnection都共享相同的线程安全的native 连接 -- 针对非阻塞式和非事务性操作而言。
注意: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());
}
}
<?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.8、Hash映射
- 使用HashOperations和一个序列化器,直接映射。
- 使用Redis Repositories。
- 使用HashMapper和HashOperations。
- 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);
}
}
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
7、Redis Repositories
7.1、使用
7.2、Object to Hash Mapping
7.3、Keyspaces
7.4、Secondary Indexes
7.4.1、Simple Property Index
7.4.2、Geospatial Index
7.5、Time To Live 存活时间
7.6、持久化参考
7.7、Persisting Partial Updates
7.8、查询和查询方法
7.9、运行在Cluster上的Redis Repositories
7.10、CDI集成
以上是关于Spring Data Redis学习的主要内容,如果未能解决你的问题,请参考以下文章
分布式缓存技术redis学习系列----深入理解Spring Redis的使用
redis学习系列--JedisPool与spring集成的实现及一致性哈希分析和基于Redis的分布式锁