做过大型软件系统的同学都知道,随着系统数据越来越庞大,越来越复杂,随之带来的问题就是系统性能越来越差,尤其是频繁操作数据库带来的性能损耗更为严重。很多业绩大牛为此提出了众多的解决方案和开发了很多框架以优化这种频繁操作数据库所带来的性能损耗,其中,尤为突出的两个缓存服务器是Memcached和Redis。今天,我们不讲Memcached和Redis本身,这里主要为大家介绍如何使spring与Redis整合。
1、pom构建
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
|
< project xmlns = "http://maven.apache.org/POM/4.0.0" xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation = "http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" >
< modelVersion >4.0.0</ modelVersion >
< groupId >com.x.redis</ groupId >
< artifactId >springredis</ artifactId >
< version >0.0.1-SNAPSHOT</ version >
< dependencies >
< dependency >
< groupId >org.springframework.data</ groupId >
< artifactId >spring-data-redis</ artifactId >
< version >1.0.2.RELEASE</ version >
</ dependency >
< dependency >
< groupId >org.springframework</ groupId >
< artifactId >spring-test</ artifactId >
< version >3.1.2.RELEASE</ version >
< scope >test</ scope >
</ dependency >
< dependency >
< groupId >redis.clients</ groupId >
< artifactId >jedis</ artifactId >
< version >2.1.0</ version >
</ dependency >
< dependency >
< groupId >junit</ groupId >
< artifactId >junit</ artifactId >
< version >4.8.2</ version >
< scope >test</ scope >
</ dependency >
</ dependencies >
</ project >
|
2、spring配置文件(applicationContext.xml)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
<? 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"
xmlns:context = "http://www.springframework.org/schema/context"
xmlns:jee = "http://www.springframework.org/schema/jee" xmlns:tx = "http://www.springframework.org/schema/tx"
xmlns:aop = "http://www.springframework.org/schema/aop"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
< context:property-placeholder location = "classpath:redis.properties" />
< bean id = "poolConfig" class = "redis.clients.jedis.JedisPoolConfig" >
< property name = "maxIdle" value = "${redis.maxIdle}" />
< property name = "maxActive" value = "${redis.maxActive}" />
< property name = "maxWait" value = "${redis.maxWait}" />
< property name = "testOnBorrow" value = "${redis.testOnBorrow}" />
</ bean >
< bean id = "connectionFactory" class = "org.springframework.data.redis.connection.jedis.JedisConnectionFactory"
p:host-name = "${redis.host}" p:port = "${redis.port}" p:password = "${redis.pass}" p:pool-config-ref = "poolConfig" />
< bean id = "redisTemplate" class = "org.springframework.data.redis.core.StringRedisTemplate" >
< property name = "connectionFactory" ref = "connectionFactory" />
</ bean >
< bean id = "userDao" class = "com.lyz.dao.impl.UserDaoImpl" />
</ beans >
|
3、redis.properties
1
2
3
4
5
6
7
8
9
10
|
# Redis settings
redis.host=192.168.157.130
redis.port=6379
redis.pass=liuyazhuang
redis.maxIdle=300
redis.maxActive=600
redis.maxWait=1000
redis.testOnBorrow=true
|
4、User实体类
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
|
package com.lyz.entity;
import java.io.Serializable;
/**
* user实体类
* @author liuyazhuang
*
*/
public class User implements Serializable {
private static final long serialVersionUID = -6011241820070393952L;
private String id;
private String name;
private String password;
public User() {
}
public User(String id, String name, String password) {
super ();
this .id = id;
this .name = name;
this .password = password;
}
/**
* 获得id
* @return the id
*/
public String getId() {
return id;
}
/**
* 设置id
* @param id the id to set
*/
public void setId(String id) {
this .id = id;
}
/**
* 获得name
* @return the name
*/
public String getName() {
return name;
}
/**
* 设置name
* @param name the name to set
*/
public void setName(String name) {
this .name = name;
}
/**
* 获得password
* @return the password
*/
public String getPassword() {
return password;
}
/**
* 设置password
* @param password the password to set
*/
public void setPassword(String password) {
this .password = password;
}
}
|
5、User操作的接口IUserDao
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
|
package com.lyz.dao;
import java.util.List;
import com.lyz.entity.User;
/**
* user操作接口
* @author liuyazhuang
*
*/
public interface IUserDao {
/**
* 新增
* @param user
* @return
*/
boolean add(User user);
/**
* 批量新增 使用pipeline方式
* @param list
* @return
*/
boolean add(List<User> list);
/**
* 删除
* @param key
*/
void delete(String key);
/**
* 删除多个
* @param keys
*/
void delete(List<String> keys);
/**
* 修改
* @param user
* @return
*/
boolean update(User user);
/**
* 通过key获取
* @param keyId
* @return
*/
User get(String keyId);
}
|
6、基本的抽象类
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
|
package com.lyz.dao.impl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.RedisSerializer;
/**
* 基本的抽象类
* @author liuyazhuang
*
* @param <K>
* @param <V>
*/
public abstract class AbstractBaseRedisDao<K, V> {
@Autowired
protected RedisTemplate<K, V> redisTemplate;
/**
* 设置redisTemplate
* @param redisTemplate the redisTemplate to set
*/
public void setRedisTemplate(RedisTemplate<K, V> redisTemplate) {
this .redisTemplate = redisTemplate;
}
/**
* 获取 RedisSerializer
* <br>------------------------------<br>
*/
protected RedisSerializer<String> getRedisSerializer() {
return redisTemplate.getStringSerializer();
}
}
|
7、IUserDao的实现类UserDaoImpl
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
|
package com.lyz.dao.impl;
import java.util.ArrayList;
import java.util.List;
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.util.Assert;
import com.lyz.dao.IUserDao;
import com.lyz.entity.User;
/**
* 接口的实现类
* @author liuyazhuang
*
*/
public class UserDaoImpl extends AbstractBaseRedisDao<String, User> implements IUserDao {
/**
* 新增
* @param user
* @return
*/
public boolean add( final User user) {
boolean result = redisTemplate.execute( new RedisCallback<Boolean>() {
public Boolean doInRedis(RedisConnection connection)
throws DataAccessException {
RedisSerializer<String> serializer = getRedisSerializer();
byte [] key = serializer.serialize(user.getId());
byte [] name = serializer.serialize(user.getName());
return connection.setNX(key, name);
}
});
return result;
}
/**
* 批量新增 使用pipeline方式
*@param list
*@return
*/
public boolean add( final List<User> list) {
Assert.notEmpty(list);
boolean result = redisTemplate.execute( new RedisCallback<Boolean>() {
public Boolean doInRedis(RedisConnection connection)
throws DataAccessException {
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;
}
/**
* 删除
* @param key
*/
public void delete(String key) {
List<String> list = new ArrayList<String>();
list.add(key);
delete(list);
}
/**
* 删除多个
* @param keys
*/
public void delete(List<String> keys) {
redisTemplate.delete(keys);
}
/**
* 修改
* @param user
* @return
*/
public boolean update( final User user) {
String key = user.getId();
if (get(key) == null ) {
throw new NullPointerException( "数据行不存在, key = " + key);
}
boolean result = redisTemplate.execute( new RedisCallback<Boolean>() {
public Boolean doInRedis(RedisConnection connection)
throws DataAccessException {
RedisSerializer<String> serializer = getRedisSerializer();
byte [] key = serializer.serialize(user.getId());
byte [] name = serializer.serialize(user.getName());
connection.set(key, name);
return true ;
}
});
return result;
}
/**
* 通过key获取
* @param keyId
* @return
*/
public User get( final String keyId) {
User result = redisTemplate.execute( new RedisCallback<User>() {
public User doInRedis(RedisConnection connection)
throws DataAccessException {
RedisSerializer<String> serializer = getRedisSerializer();
byte [] key = serializer.serialize(keyId);
byte [] value = connection.get(key);
if (value == null ) {
return null ;
}
String name = serializer.deserialize(value);
return new User(keyId, name, null );
}
});
return result;
}
}
|
8、测试类RedisTest
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
|
package com.lyz.test;
import java.util.ArrayList;
import java.util.List;
import junit.framework.Assert;
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.AbstractJUnit4SpringContextTests;
import com.lyz.dao.IUserDao;
import com.lyz.entity.User;
/**
* Redis测试类
* @author liuyazhuang
*
*/
@ContextConfiguration (locations = { "classpath*:applicationContext.xml" })
public class RedisTest extends AbstractJUnit4SpringContextTests {
@Autowired
private IUserDao userDao;
/**
* 新增
*/
@Test
public void testAddUser() {
User user = new User();
user.setId( "user1" );
user.setName( "liuyazhuang" );
boolean result = userDao.add(user);
Assert.assertTrue(result);
}
/**
* 批量新增 普通方式
*/
@Test
public void testAddUsers1() {
List<User> list = new ArrayList<User>();
for ( int i = 10 ; i < 50000 ; i++) {
User user = new User();
user.setId( "user" + i);
user.setName( "liuyazhuang" + i);
list.add(user);
}
long begin = System.currentTimeMillis();
for (User user : list) {
userDao.add(user);
}
System.out.println(System.currentTimeMillis() - begin);
}
/**
* 批量新增 pipeline方式
*/
@Test
public void testAddUsers2() {
List<User> list = new ArrayList<User>();
for ( int i = 10 ; i < 1500000 ; i++) {
User user = new User();
user.setId( "user" + i);
user.setName( "liuyazhuang" + 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 testUpdate() {
User user = new User();
user.setId( "user1" );
user.setName( "liuyazhuang" );
boolean result = userDao.update(user);
Assert.assertTrue(result);
}
/**
* 通过key删除单个
*/
@Test
public void testDelete() {
String key = "user1" ;
userDao.delete(key);
}
/**
* 批量删除
*/
@Test
public void testDeletes() {
List<String> list = new ArrayList<String>();
for ( int i = 0 ; i < 10 ; i++) {
list.add( "user" + i);
}
userDao.delete(list);
}
/**
* 获取
*/
@Test
public void testGetUser() {
String id = "user1" ;
User user = userDao.get(id);
Assert.assertNotNull(user);
Assert.assertEquals(user.getName(), "liuyazhuang" );
}
/**
* 设置userDao
* @param userDao the userDao to set
*/
public void setUserDao(IUserDao userDao) {
this .userDao = userDao;
}
}
|
9、温馨提示
项目下载地址:Spring-Redis.rar
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。
原文链接:http://blog.csdn.net/l1028386804/article/details/52108758