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、第一步
虽然本文档的每一部分都提供了相关资源的连接,但最好还是提前熟悉下。
4.1.1、了解Spring
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支持高级视图
对于大多数人来说,high-level抽象和支持服务是最佳选择。请注意,用户可以在不同的层次之间切换 -- 例如,获取low-level连接(甚至native库)来与Redis通信。
5.3、连接到Redis
5.3.1、RedisConnection 和 RedisConnectionFactory
注意:对于需要native库API的情况,RedisConnection提供了专有方法getNativeConnection -- 会返回原生的、底层的用于通信的对象。
活动的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>
生产使用时,用户可能想要调整设置,例如host或者password:
<?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>
注意:可以设置shareNativeConnection为false,这样每次都使用专有的连接。
注意:LettuceConnectionFactory 也可以为pooling blocking和事务连接配置一个LettucePool,或者,为所有连接配置一个LettucePool -- 如果shareNativeConnection设为false的话。
5.4、Redis Sentinel支持
注意:目前,只有Jedis和Lettuce支持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列表
有时候,需要直接与Sentinels中的某一个进行交互。使用RedisConnectionFactory.getSentinelConnection() 或者RedisConnection.getSentinelCommands(),可以让你访问第一个活动的Sentinel。
5.5、使用RedisTemplate操作Objects
reference) -- 提供了丰富的接口 来操作特定类型或特定key(通过KeyBound接口),如下:
| 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. |
一旦配置了,该template就是线程安全的,可被多个实例复用。
<?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 |
|
注意:扁平化,要求所有的property name不能与JSON path冲突。在map中使用点或者括号作为key,或者在实体中作为property name,都不行。如果非要这样做,那得到的hash是无法被映射回对象的。
5.9、Redis 消息/发布订阅
5.9.2、接收/订阅消息
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学习的更多相关文章
- spring mvc Spring Data Redis RedisTemplate [转]
http://maven.springframework.org/release/org/springframework/data/spring-data-redis/(spring-data包下载) ...
- Spring Data Redis简介以及项目Demo,RedisTemplate和 Serializer详解
一.概念简介: Redis: Redis是一款开源的Key-Value数据库,运行在内存中,由ANSI C编写,详细的信息在Redis官网上面有,因为我自己通过google等各种渠道去学习Redis, ...
- Spring Data Redis整体介绍 (一)
为什么使用Spring Data Redis 首先Spring Data Redis 是Spring 框架提供的用于操作Redis的客户端. Spring框架是一个全栈Java程序框架,通过DI.AO ...
- spring data redis RedisTemplate操作redis相关用法
http://blog.mkfree.com/posts/515835d1975a30cc561dc35d spring-data-redis API:http://docs.spring.io/sp ...
- Spring Data Redis—Pub/Sub(附Web项目源码)
一.发布和订阅机制 当一个客户端通过 PUBLISH 命令向订阅者发送信息的时候,我们称这个客户端为发布者(publisher). 而当一个客户端使用 SUBSCRIBE 或者 PSUBSCRIBE ...
- Spring data redis的一个bug
起因 前两天上线了一个新功能,导致线上业务的缓存总是无法更新,报错也是非常奇怪,redis.clients.jedis.exceptions.JedisConnectionException: Unk ...
- Spring Data Redis—Pub/Sub(附Web项目源码) (转)
一.发布和订阅机制 当一个客户端通过 PUBLISH 命令向订阅者发送信息的时候,我们称这个客户端为发布者(publisher). 而当一个客户端使用 SUBSCRIBE 或者 PSUBSCRIBE ...
- spring data redis 理解
前言 Spring Data Redis project,应用了Spring概念来开发使用键值形式的数据存储的解决方案.我们(官方)提供了一个 "template" ,这是一个高级 ...
- Spring Data Redis 详解及实战一文搞定
SDR - Spring Data Redis的简称. Spring Data Redis提供了从Spring应用程序轻松配置和访问Redis的功能.它提供了与商店互动的低级别和高级别抽象,使用户免受 ...
随机推荐
- 菜鸟学SSH(二)——Struts2国际化手动切换版
国际化(internationalization,i18n)和本地化(localization,l10n)指让产品(出版物,软件,硬件等)能够适应非本地环境,特别是其他的语言和文化.程序在不修改内部代 ...
- C++中的typedef typename 作用
今天在代码里看到了这样一段代码: typedef typename RefBase::weakref_type weakref_type; 起初一直搞不懂为什么要加个typename,后来搜索了一下才 ...
- epoll, NIO,AIO
Java 网络IO编程总结(BIO.NIO.AIO均含完整实例代码) Java中BIO,NIO和AIO使用样例 https://blog.insanecoder.top/javazhong-bio-n ...
- Linux系统/boot目录破损无法启动怎么办
linux系统中的/boot目录存放着系统开机所需要的各种文件,其中包含内核.开机菜单及所需配置文件等等.但是当不小心删除了/boot目录里的某些文件或者干脆整个/boot目录都不见了的情况下,该如何 ...
- 【Socket】linux网络多路复用IO技术
1.mystery引入 1)Select是一种多路复用IO输入输出模式,在linux的输入输出编程中通过select的轮询机制,发现可用/可读或可写的接口. 2)低级socket程 ...
- mybatis使用注解往postgresql数据库表insert数据[主键自增]的写法
建表SQL: DROP TABLE IF EXISTS person; CREATE TABLE person( person_id serial PRIMARY KEY NOT NULL, pers ...
- 多媒体文件格式之AVI
[时间:2016-07] [状态:Open] AVI(Audio Video Interleaved的缩写)是一种RIFF(Resource Interchange File Format的缩写)文件 ...
- ostream_iterator的可能实现
当我们要输出一个容器的内容时,可以使用std::copy函数,如下: vector <string> myvector; std::copy(myvector.begin(), myvec ...
- 纯html实现将网页页面分享到微信朋友圈添加缩略图图片的方法
在分享页面中的body中最前面添加一个隐藏的div,里面放一个300*300的正方形图片即可:如下 <div style="display:none"><img ...
- js实现文本框文本域光标处插入图片文本的插件(并且光标在插入内容的内容后显示)
js: /******************************************* * * 插入光标处的插件 * @authors Du xin li * @update 2015 ...