redis是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,redis支持各种不同方式的排序。与memcached一样,为了保证效率,数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从复制)同步。那么如何让Redis和Spring进行整合呢?
1)首先需要配置Redis的配置文件
#连接配置
redis.host=192.168.2.112
redis.port=6379
redis.password=
#具体是哪一个库(默认是16个)
redis.db=1
#连接池配置
redis.maxIdle=300
redis.maxWait=1000
redis.testOnBorrow=true
2) 第二步,当然就是Spring的配置文件啦~
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
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-4.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.0.xsd">
<!--使用注解-->
<context:annotation-config/>
<!--加载Redis的配置文件-->
<context:property-placeholder location="classpath:redis.properties"></context:property-placeholder>
<!--配置Jedis的连接池信息-->
<bean id="poolConfig" class="redis.clients.jedis.JedisPoolConfig">
<property name="maxIdle" value="${redis.maxIdle}"></property>
<property name="maxWaitMillis" value="${redis.maxWait}"></property>
<property name="testOnBorrow" value="${redis.testOnBorrow}"></property>
</bean>
<!--配置Jedis的连接信息-->
<bean id="jedisConnectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory">
<property name="hostName" value="${redis.host}"></property>
<property name="port" value="${redis.port}"></property>
<property name="password" value="${redis.password}"></property>
<property name="database" value="${redis.db}"></property>
<property name="poolConfig" ref="poolConfig"></property>
</bean>
<!--Redis的操作模板-->
<bean id="jedisTemplate" class="org.springframework.data.redis.core.RedisTemplate">
<property name="connectionFactory" ref="jedisConnectionFactory"/>
<property name="keySerializer">
<bean class="org.springframework.data.redis.serializer.StringRedisSerializer">
</bean>
</property>
<!--用于对象的序列化-->
<property name="valueSerializer">
<bean class="org.springframework.data.redis.serializer.JdkSerializationRedisSerializer"></bean>
</property>
</bean>
3).接下来就可以测试了,首先创建一个JavaBean,注意要实现序列化接口--->Serializable
public class User implements Serializable{
private String name;
private String password;
private double sal;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public double getSal() {
return sal;
}
public void setSal(double sal) {
this.sal = sal;
}
public User(String name, String password, double sal) {
this.name = name;
this.password = password;
this.sal = sal;
}
public User() {
}
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
", password='" + password + '\'' +
", sal=" + sal +
'}';
}
}
4).测试是不是成功
package com.SDR;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.ValueOperations;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import java.io.Serializable;
import java.util.concurrent.TimeUnit;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations ={"classpath:applicationContext.xml"})
public class TestSDR {
@Autowired
private RedisTemplate<String,Serializable> redisTemplate;
//向Redis中存放数据,修改Redis中的数据也是直接调用这个add方法即可
@Test
public void putIntoRedis(){
redisTemplate.opsForValue().set("User","AAAA--");
}
@Test
public void putIntoRedis3(){
User user=new User("AA","123",123.45);
ValueOperations<String, Serializable> valueOperations = redisTemplate.opsForValue();
redisTemplate.opsForValue().set("UserBySer",user);
}
//从Redis中获取数据
@Test
public void getByRedis(){
User user= (User) redisTemplate.opsForValue().get("UserBySer"); //--->解析序列化后的
System.out.println(user);
}
@Test
public void getByRedis2(){
System.out.println(redisTemplate.opsForValue().get("User"));
}
//对对象设置过期时间
@Test
public void setTTL(){
redisTemplate.opsForValue().set("UserWithTTL","AAAA--",60, TimeUnit.SECONDS);
}
//
}
5).可以看到Redis中的确有了数据
常见的问题:只可以连接127.0.0.1 这个本地地址?
解决方案:修改redis的配置文件中的NetWork节点!在bind后面添加需要连接的地址