spring配置:
<!-- redis pool相关配置 -->
<bean id="poolConfig" class="redis.clients.jedis.JedisPoolConfig">
<!-- 最小空闲数 -->
<property name="minIdle" value="${redis.minIdle}" />
<!-- 最大空闲数 -->
<property name="maxIdle" value="${redis.maxIdle}" />
<!-- 最大连接数 -->
<property name="maxTotal" value="${redis.maxTotal}" />
<!-- 最大等待时间 单位毫秒(ms) -->
<property name="maxWaitMillis" value="${redis.maxWaitMillis}" />
<!-- 使用连接时测试连接是否可用 -->
<property name="testOnBorrow" value="${redis.testOnBorrow}" />
</bean>
<!-- jedis客户端连接工厂 -->
<bean id="jedisConnectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory">
<property name="poolConfig" ref="poolConfig" />
<property name="database" value="${redis.database}" />
<property name="port" value="${redis.port}" />
<property name="hostName" value="${redis.host}" />
<property name="password" value="${redis.password}" />
</bean>
<!-- redisTemplate模板 -->
<bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate">
<property name="connectionFactory" ref="jedisConnectionFactory" />
</bean>
redis.properties:
###Redis缓存配置
#缓存池最小空闲数
redis.minIdle=5
#缓存池最大空闲数
redis.maxIdle=100
#缓存池最大连接数
redis.maxTotal=300
#最大等待时间
redis.maxWaitMillis=3000
#使用连接时是否测试可用
redis.testOnBorrow=true
#主机地址
redis.host=
#主机端口
redis.port=6379
#主机密码
redis.password=
#数据库下标
redis.database=4
具体实现方法:
package org.gyy.redis.dao;
import java.util.List;
import org.gyy.entity.user.User;
import org.gyy.redis.AbstractBaseRedisDao;
import org.springframework.dao.DataAccessException;
import org.springframework.data.redis.connection.RedisConnection;
import org.springframework.data.redis.core.RedisCallback;
import org.springframework.data.redis.serializer.RedisSerializer;
import org.springframework.stereotype.Component;
import org.springframework.util.Assert;
@Component
public class UserDao extends AbstractBaseRedisDao<String, User> implements IUserDao {
@Override
public boolean add(User user) {
// TODO Auto-generated method stub
boolean result = redisTemplate.execute(new RedisCallback<Boolean>() {
@Override
public Boolean doInRedis(RedisConnection connection) throws DataAccessException {
// TODO Auto-generated method stub
RedisSerializer<String> serializer = getRedisSerializer();
byte[] key = serializer.serialize(user.getId());
byte[] name = serializer.serialize(user.getName());
return connection.setNX(key, name);
}
});
return result;
}
@Override
public boolean add(List<User> list) {
// TODO Auto-generated method stub
Assert.notEmpty(list);
boolean result = redisTemplate.execute(new RedisCallback<Boolean>() {
@Override
public Boolean doInRedis(RedisConnection connection) throws DataAccessException {
// TODO Auto-generated method stub
RedisSerializer<String> serializer = getRedisSerializer();
for (User user : list) {
byte[] key = serializer.serialize(user.getId());
byte[] name = serializer.serialize(user.getName());
connection.setNX(key, name);
}
return true;
}
},false,true);
return result;
}
@Override
public void delete(String key) {
// TODO Auto-generated method stub
redisTemplate.delete(key);
}
@Override
public void delete(List<String> keys) {
// TODO Auto-generated method stub
redisTemplate.delete(keys);
}
@Override
public boolean update(User user) {
// TODO Auto-generated method stub
String keyId = user.getId();
if (get(keyId) == null) {
throw new NullPointerException("数据行不存在:key="+keyId);
}
boolean result = redisTemplate.execute(new RedisCallback<Boolean>() {
@Override
public Boolean doInRedis(RedisConnection connection) throws DataAccessException {
// TODO Auto-generated method stub
RedisSerializer<String> serializer = getRedisSerializer();
byte[] keyId = serializer.serialize(user.getId());
byte[] name = serializer.serialize(user.getName());
connection.set(keyId, name);
return true;
}
});
return result;
}
@Override
public User get(String keyId) {
// TODO Auto-generated method stub
User result = redisTemplate.execute(new RedisCallback<User>() {
@Override
public User doInRedis(RedisConnection connection) throws DataAccessException {
// TODO Auto-generated method stub
RedisSerializer<String> serializer = getRedisSerializer();
byte[] key = serializer.serialize(keyId);
byte[] value = connection.get(key);
if (null == value) {
return null;
}
String name = serializer.deserialize(value);
return new User(keyId,name,null);
}
});
return result;
}
}
序列化和模板:
package org.gyy.redis;
import javax.annotation.Resource;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.RedisSerializer;
public abstract class AbstractBaseRedisDao<K,V> {
@Resource
protected RedisTemplate<K, V> redisTemplate;
/**
* 得到RedisSerializer
* @return
*/
public RedisSerializer<String> getRedisSerializer() {
return redisTemplate.getStringSerializer();
}
/**
* 设置redis
* @param redisTemplate
*/
public void setRedisTemplate(RedisTemplate<K, V> redisTemplate) {
this.redisTemplate = redisTemplate;
}
}
测试父类:
package org.gyy.baseTest;
import org.junit.runner.RunWith;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
@RunWith(SpringJUnit4ClassRunner.class)//使用junit4进行测试
@ContextConfiguration({"classpath*:applicationContext.xml"}) //加载配置文件
//------------如果加入以下代码,所有继承该类的测试类都会遵循该配置,也可以不加,在测试类的方法上///控制事务,参见下一个实例
//这个非常关键,如果不加入这个注解配置,事务控制就会完全失效!
//@Transactional
//这里的事务关联到配置文件中的事务控制器(transactionManager = "transactionManager"),同时//指定自动回滚(defaultRollback = true)。这样做操作的数据才不会污染数据库!
//@TransactionConfiguration(transactionManager = "transactionManager", defaultRollback = true)
//------------
public class BaseJunit4Test {
}
测试类:
package org.gyy.redis;
import java.util.ArrayList;
import java.util.List;
import javax.annotation.Resource;
import org.gyy.baseTest.BaseJunit4Test;
import org.gyy.entity.user.User;
import org.gyy.redis.dao.IUserDao;
import org.junit.Test;
import org.springframework.test.annotation.Rollback;
import org.springframework.transaction.annotation.Transactional;
import junit.framework.Assert;
public class RedisTest extends BaseJunit4Test{
@Resource
private IUserDao userDao;
@Test//标明是测试方法
@Transactional //标明此方法需使用事务
@Rollback(true)//标明使用完此方法后事务不回滚,true时为回滚
public void addUser(){
User user = new User("12345","张三",null);
boolean result = userDao.add(user);
Assert.assertTrue("插入失败",result);
System.out.println("你好");
}
@Test
public void testGetUser(){
String key = "12";
User user = userDao.get(key);
Assert.assertNotNull(user);
Assert.assertEquals(user.getName(), "李四");
System.out.println(user);
}
@Test
public void testAddUserList(){
List list = new ArrayList<>();
for (int i = 0; i < 10; i++) {
User user = new User();
user.setId("1"+i);
user.setName("张三"+i);
list.add(user);
}
long begin = System.currentTimeMillis();
boolean result = userDao.add(list);
System.out.println(System.currentTimeMillis()-begin);
Assert.assertTrue(result);
}
@Test
public void testUpdata(){
User user = new User("12", "李四", null);
boolean update = userDao.update(user);
System.out.println(update);
}
}