Spring-data-redis是spring大家族的一部分,提供了在srping应用中通过简单的配置访问redis服务,对reids底层开发包(Jedis, JRedis, and RJC)进行了高度封装,RedisTemplate提供了redis各种操作、异常处理及序列化,支持发布订阅,并对spring 3.1 cache进行了实现。
spring-data-redis针对jedis提供了如下功能:
- 连接池自动管理,提供了一个高度封装的“RedisTemplate”类
- 针对jedis客户端中大量api进行了归类封装,将同一类型操作封装为operation接口
- ValueOperations:简单K-V操作
- SetOperations:set类型数据操作
- ZSetOperations:zset类型数据操作
- HashOperations:针对map类型的数据操作
- ListOperations:针对list类型的数据操作
一、引入依赖
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>5.1.2</version>
</dependency>
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-redis</artifactId>
<version>3.2.4</version>
</dependency>
如果存储的是Map<String,Object>需要导入jackson相关的包,存储的时候使用json序列化器存储。如果不导入jackson的包会报错。
<!-- springMVC支持json包-->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.10.0</version>
</dependency>
二、配置文件
(1) redis.properties
#redis集群
redis.host=192.168.147.128
redis.port=6379
#
redis.host2=192.168.147.128
redis.port2=6380
#
redis.host3=192.168.147.128
redis.port3=6381
(2)applicationContext-redis.xml
<context:property-placeholder location="classpath:redis.properties"
ignore-unresolvable="true"/>
<!-- jedis连接配置-->
<bean id="redisClusterConfiguration" class="org.springframework.data.redis.connection.RedisClusterConfiguration">
<property name="clusterNodes">
<set>
<bean class="org.springframework.data.redis.connection.RedisNode">
<constructor-arg name="host" value="${redis.host}"></constructor-arg>
<constructor-arg name="port" value="${redis.port}"></constructor-arg>
</bean>
<bean class="org.springframework.data.redis.connection.RedisNode">
<constructor-arg name="host" value="${redis.host2}"></constructor-arg>
<constructor-arg name="port" value="${redis.port2}"></constructor-arg>
</bean>
<bean class="org.springframework.data.redis.connection.RedisNode">
<constructor-arg name="host" value="${redis.host3}"></constructor-arg>
<constructor-arg name="port" value="${redis.port3}"></constructor-arg>
</bean>
</set>
</property>
</bean>
<!-- redis连接工厂 -->
<bean id="jedisConnectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory">
<constructor-arg name="clusterConfiguration" ref="redisClusterConfiguration"></constructor-arg>
</bean>
<!-- redis操作模版 -->
<bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate">
<!-- property 表示set注入 ref 表示引用其他bean对象 -->
<property name="connectionFactory" ref="jedisConnectionFactory"></property>
<!-- 这里不配置redis客户端将无法查询到存储数据 -->
<property name="keySerializer">
<bean class="org.springframework.data.redis.serializer.StringRedisSerializer"/>
</property>
<property name="valueSerializer">
<bean class="org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer"/>
</property>
<property name="hashKeySerializer">
<bean class="org.springframework.data.redis.serializer.StringRedisSerializer"/>
</property>
<property name="hashValueSerializer">
<bean class="org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer"/>
</property>
<!--开启事务 -->
<property name="enableTransactionSupport" value="true"></property>
</bean>
如果在多个spring配置文件中引入<context:property-placeholder .../>标签,最后需要加上ignore-unresolvable="true",否则会报错。
(3)测试
@Test
public void test() {
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext-redis.xml");
RedisTemplate redisTemplate = context.getBean("redisTemplate", RedisTemplate.class);
// stringRedisTemplate的操作
// String读写
redisTemplate.delete("k1");
redisTemplate.opsForValue().set("k1", "v1");
System.out.println(redisTemplate.opsForValue().get("k1"));
System.out.println("==============");
// List读写
redisTemplate.delete("l1");
redisTemplate.opsForList().rightPush("l1", "1");
redisTemplate.opsForList().rightPush("l1", "2");
redisTemplate.opsForList().leftPush("l1", "3");
List<String> listCache = redisTemplate.opsForList().range("l1", 0, -1);
for (String s : listCache) {
System.out.println(s);
}
System.out.println("==============");
// Set读写
redisTemplate.delete("s1");
redisTemplate.opsForSet().add("s1", "A");
redisTemplate.opsForSet().add("s1", "B");
redisTemplate.opsForSet().add("s1", "C");
Set<String> setCache = redisTemplate.opsForSet().members("s1");
for (String s : setCache) {
System.out.println(s);
}
System.out.println("===============");
// Hash读写
redisTemplate.delete("h1");
redisTemplate.opsForHash().put("h1", "address1", "北京");
redisTemplate.opsForHash().put("h1", "address2", "上海");
redisTemplate.opsForHash().put("h1", "address3", "河南");
Map<String, String> hashCache = redisTemplate.opsForHash().entries("h1");
for (Map.Entry entry : hashCache.entrySet()) {
System.out.println(entry.getKey() + "-" + entry.getValue());
}
System.out.println("===============");
}
执行结果
如果本文对您有很大的帮助,还请点赞关注一下。