- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章spring整合redis缓存并以注解(@Cacheable、@CachePut、@CacheEvict)形式使用由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
maven项目中在pom.xml中依赖2个jar包,其他的spring的jar包省略:
1
2
3
4
5
6
7
8
9
10
|
<
dependency
>
<
groupId
>redis.clients</
groupId
>
<
artifactId
>jedis</
artifactId
>
<
version
>2.8.1</
version
>
</
dependency
>
<
dependency
>
<
groupId
>org.springframework.data</
groupId
>
<
artifactId
>spring-data-redis</
artifactId
>
<
version
>1.7.2.RELEASE</
version
>
</
dependency
>
|
spring-Redis.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
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
|
<?
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:mvc
=
"http://www.springframework.org/schema/mvc"
xmlns:cache
=
"http://www.springframework.org/schema/cache"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.2.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.2.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-4.2.xsd
http://www.springframework.org/schema/cache
http://www.springframework.org/schema/cache/spring-cache-4.2.xsd">
<
context:property-placeholder
location
=
"classpath:redis-config.properties"
/>
<!-- 启用缓存注解功能,这个是必须的,否则注解不会生效,另外,该注解一定要声明在spring主配置文件中才会生效 -->
<
cache:annotation-driven
cache-manager
=
"cacheManager"
/>
<!-- redis 相关配置 -->
<
bean
id
=
"poolConfig"
class
=
"redis.clients.jedis.JedisPoolConfig"
>
<
property
name
=
"maxIdle"
value
=
"${redis.maxIdle}"
/>
<
property
name
=
"maxWaitMillis"
value
=
"${redis.maxWait}"
/>
<
property
name
=
"testOnBorrow"
value
=
"${redis.testOnBorrow}"
/>
</
bean
>
<
bean
id
=
"JedisConnectionFactory"
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.RedisTemplate"
>
<
property
name
=
"connectionFactory"
ref
=
"JedisConnectionFactory"
/>
</
bean
>
<!-- spring自己的缓存管理器,这里定义了缓存位置名称 ,即注解中的value -->
<
bean
id
=
"cacheManager"
class
=
"org.springframework.cache.support.SimpleCacheManager"
>
<
property
name
=
"caches"
>
<
set
>
<!-- 这里可以配置多个redis -->
<!-- <bean class="com.cn.util.RedisCache">
<property name="redisTemplate" ref="redisTemplate" />
<property name="name" value="default"/>
</bean> -->
<
bean
class
=
"com.cn.util.RedisCache"
>
<
property
name
=
"redisTemplate"
ref
=
"redisTemplate"
/>
<
property
name
=
"name"
value
=
"common"
/>
<!-- common名称要在类或方法的注解中使用 -->
</
bean
>
</
set
>
</
property
>
</
bean
>
</
beans
>
|
redis-config.properties中的内容:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
# Redis settings
# server IP
redis.host=127.0.0.1
# server port
redis.port=6379
# server pass
redis.pass=
# use dbIndex
redis.database=0
# 控制一个pool最多有多少个状态为idle(空闲的)的jedis实例
redis.maxIdle=300
# 表示当borrow(引入)一个jedis实例时,最大的等待时间,如果超过等待时间(毫秒),则直接抛出JedisConnectionException;
redis.maxWait=3000
# 在borrow一个jedis实例时,是否提前进行validate操作;如果为true,则得到的jedis实例均是可用的
redis.testOnBorrow=true
|
com.cn.util.RedisCache类中的内容:
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
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
|
package
com.cn.util;
import
java.io.ByteArrayInputStream;
import
java.io.ByteArrayOutputStream;
import
java.io.IOException;
import
java.io.ObjectInputStream;
import
java.io.ObjectOutputStream;
import
org.springframework.cache.Cache;
import
org.springframework.cache.support.SimpleValueWrapper;
import
org.springframework.dao.DataAccessException;
import
org.springframework.data.redis.connection.RedisConnection;
import
org.springframework.data.redis.core.RedisCallback;
import
org.springframework.data.redis.core.RedisTemplate;
public
class
RedisCache
implements
Cache{
private
RedisTemplate<String, Object> redisTemplate;
private
String name;
public
RedisTemplate<String, Object> getRedisTemplate() {
return
redisTemplate;
}
public
void
setRedisTemplate(RedisTemplate<String, Object> redisTemplate) {
this
.redisTemplate = redisTemplate;
}
public
void
setName(String name) {
this
.name = name;
}
@Override
public
String getName() {
// TODO Auto-generated method stub
return
this
.name;
}
@Override
public
Object getNativeCache() {
// TODO Auto-generated method stub
return
this
.redisTemplate;
}
@Override
public
ValueWrapper get(Object key) {
// TODO Auto-generated method stub
System.out.println(
"get key"
);
final
String keyf = key.toString();
Object object =
null
;
object = redisTemplate.execute(
new
RedisCallback<Object>() {
public
Object doInRedis(RedisConnection connection)
throws
DataAccessException {
byte
[] key = keyf.getBytes();
byte
[] value = connection.get(key);
if
(value ==
null
) {
return
null
;
}
return
toObject(value);
}
});
return
(object !=
null
?
new
SimpleValueWrapper(object) :
null
);
}
@Override
public
void
put(Object key, Object value) {
// TODO Auto-generated method stub
System.out.println(
"put key"
);
final
String keyf = key.toString();
final
Object valuef = value;
final
long
liveTime =
86400
;
redisTemplate.execute(
new
RedisCallback<Long>() {
public
Long doInRedis(RedisConnection connection)
throws
DataAccessException {
byte
[] keyb = keyf.getBytes();
byte
[] valueb = toByteArray(valuef);
connection.set(keyb, valueb);
if
(liveTime >
0
) {
connection.expire(keyb, liveTime);
}
return
1L;
}
});
}
private
byte
[] toByteArray(Object obj) {
byte
[] bytes =
null
;
ByteArrayOutputStream bos =
new
ByteArrayOutputStream();
try
{
ObjectOutputStream oos =
new
ObjectOutputStream(bos);
oos.writeObject(obj);
oos.flush();
bytes = bos.toByteArray();
oos.close();
bos.close();
}
catch
(IOException ex) {
ex.printStackTrace();
}
return
bytes;
}
private
Object toObject(
byte
[] bytes) {
Object obj =
null
;
try
{
ByteArrayInputStream bis =
new
ByteArrayInputStream(bytes);
ObjectInputStream ois =
new
ObjectInputStream(bis);
obj = ois.readObject();
ois.close();
bis.close();
}
catch
(IOException ex) {
ex.printStackTrace();
}
catch
(ClassNotFoundException ex) {
ex.printStackTrace();
}
return
obj;
}
@Override
public
void
evict(Object key) {
// TODO Auto-generated method stub
System.out.println(
"del key"
);
final
String keyf = key.toString();
redisTemplate.execute(
new
RedisCallback<Long>() {
public
Long doInRedis(RedisConnection connection)
throws
DataAccessException {
return
connection.del(keyf.getBytes());
}
});
}
@Override
public
void
clear() {
// TODO Auto-generated method stub
System.out.println(
"clear key"
);
redisTemplate.execute(
new
RedisCallback<String>() {
public
String doInRedis(RedisConnection connection)
throws
DataAccessException {
connection.flushDb();
return
"ok"
;
}
});
}
@Override
public
<T> T get(Object key, Class<T> type) {
// TODO Auto-generated method stub
return
null
;
}
@Override
public
ValueWrapper putIfAbsent(Object key, Object value) {
// TODO Auto-generated method stub
return
null
;
}
}
|
到了这一步,大部分人会想在web.xml的启动配置文件地方(context-param)加入了spring-redis.xml,让项目启动时加载这个配置文件吧,但是这样启动后注解不生效.
正确的做法是:web.xml中配置了servlet控制器:
1
2
3
4
5
6
7
8
9
10
|
<
servlet
>
<
servlet-name
>SpringMVC</
servlet-name
>
<
servlet-class
>org.springframework.web.servlet.DispatcherServlet</
servlet-class
>
<
init-param
>
<
param-name
>contextConfigLocation</
param-name
>
<
param-value
>/WEB-INF/spring-mvc.xml</
param-value
>
</
init-param
>
<
load-on-startup
>1</
load-on-startup
>
<
async-supported
>true</
async-supported
>
</
servlet
>
|
在DispatcherServlet的初始化过程中,框架会在web应用的 WEB-INF文件夹下寻找名为spring-mvc.xml的配置文件,如果不指定的话,默认是applicationContext.xml 。
只需要在spring-mvc.xml文件中引入spring-redis配置文件即可,正如spring-redis.xml中的启用注解说的:<cache:annotation-driven cache-manager="cacheManager" />注解一定要声明在spring主配置文件中才会生效.
spring-mvc.xml内容,省略了spring与spring MVC整合的那部分:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
<?
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:mvc
=
"http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.2.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.2.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-4.2.xsd">
<!-- 自动扫描该包,使SpringMVC认为包下用了@controller注解的类是控制器 -->
<
context:component-scan
base-package
=
"com.cn"
/>
<!-- 引入同文件夹下的redis属性配置文件 -->
<
import
resource
=
"spring-redis.xml"
/>
</
beans
>
|
在service的实现类中:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
@Service
public
class
UserServiceImpl
implements
UserService{
@Autowired
private
UserBo userBo;
@Cacheable
(value=
"common"
,key=
"'id_'+#id"
)
public
User selectByPrimaryKey(Integer id) {
return
userBo.selectByPrimaryKey(id);
}
@CachePut
(value=
"common"
,key=
"#user.getUserName()"
)
public
void
insertSelective(User user) {
userBo.insertSelective(user);
}
@CacheEvict
(value=
"common"
,key=
"'id_'+#id"
)
public
void
deleteByPrimaryKey(Integer id) {
userBo.deleteByPrimaryKey(id);
}
}
|
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我.
原文链接:http://blog.csdn.net/aqsunkai/article/details/51758900 。
最后此篇关于spring整合redis缓存并以注解(@Cacheable、@CachePut、@CacheEvict)形式使用的文章就讲到这里了,如果你想了解更多关于spring整合redis缓存并以注解(@Cacheable、@CachePut、@CacheEvict)形式使用的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我阅读了有关 JSR 107 缓存 (JCache) 的内容。 我很困惑:据我所知,每个 CPU 都管理其缓存内存(无需操作系统的任何帮助)。 那么,为什么我们需要 Java 缓存处理程序? (如果C
好吧,我是 jQuery 的新手。我一直在这里和那里搞乱一点点并习惯它。我终于明白了(它并不像某些人想象的那么难)。因此,鉴于此链接:http://jqueryui.com/sortable/#dis
我正在使用 Struts 2 和 Hibernate。我有一个简单的表,其中包含一个日期字段,用于存储有关何时发生特定操作的信息。这个日期值显示在我的 jsp 中。 我遇到的问题是hibernate更
我有点不确定这里发生了什么,但是我试图解释正在发生的事情,也许一旦我弄清楚我到底在问什么,就可能写一个更好的问题。 我刚刚安装了Varnish,对于我的请求时间来说似乎很棒。这是一个Magneto 2
解决 Project Euler 的问题后,我在论坛中发现了以下 Haskell 代码: fillRow115 minLength = cache where cache = ((map fill
我正试图找到一种方法来为我网络上的每台计算机缓存或存储某些 python 包。我看过以下解决方案: pypicache但它不再被积极开发,作者推荐 devpi,请参见此处:https://bitbuc
我想到的一个问题是可以从一开始就缓存网络套接字吗?在我的拓扑中,我在通过双 ISP 连接连接到互联网的 HAProxy 服务器后面有 2 个 Apache 服务器(带有 Google PageSpee
我很难说出不同缓存区域 (OS) 之间的区别。我想简要解释一下磁盘\缓冲区\交换\页面缓存。他们住在哪里?它们之间的主要区别是什么? 据我了解,页面缓存是主内存的一部分,用于存储从 I/O 设备获取的
1.题目 请你为最不经常使用(LFU)缓存算法设计并实现数据结构。 实现 LFUCache 类: LFUCache(int capacity) - 用数据结构的容量 capacity 初始化对象 in
1.题目 请你设计并实现一个满足 LRU (最近最少使用) 缓存 约束的数据结构。 实现 LRUCache 类: ① LRUCache(int capacity) 以正整数作为容量 capacity
我想在访问该 View 时关闭某些页面的缓存。它适用于简单查询模型对象的页面。 好像什么时候 'django.middleware.cache.FetchFromCacheMiddleware', 启
documents为 ExePackage element state Cache属性的目的是 Whether to cache the package. The default is "yes".
我知道 docker 用图层存储每个图像。如果我在一台开发服务器上有多个用户,并且每个人都在运行相同的 Dockerfile,但将镜像存储为 user1_myapp . user2 将其存储为 use
在 Codeigniter 中没有出现缓存问题几年后,我发现了一个问题。我在其他地方看到过该问题,但没有适合我的解决方案。 例如,如果我在 View 中更改一些纯 html 文本并上传新文件并按 F5
我在 Janusgraph 文档中阅读了有关 Janusgraph Cache 的内容。关于事务缓存,我几乎没有怀疑。我在我的应用程序中使用嵌入式 janusgrah 服务器。 如果我只对例如进行读取
我想知道是否有来自终端的任何命令可以用来匹配 Android Studio 中执行文件>使缓存无效/重新启动的使用。 谢谢! 最佳答案 According to a JetBrains employe
我想制作一个 python 装饰器来内存函数。例如,如果 @memoization_decorator def add(a, b, negative=False): print "Com
我经常在 jQuery 事件处理程序中使用 $(this) 并且从不缓存它。如果我愿意的话 var $this = $(this); 并且将使用变量而不是构造函数,我的代码会获得任何显着的额外性能吗?
是的,我要说实话,我不知道varnish vcl,我可以解决一些基本问题,但是我不太清楚,这就是为什么我遇到问题了。 我正在尝试通过http请求设置缓存禁止,但是该请求不能通过DNS而是通过 Varn
在 WP 站点上加载约 4000 个并发用户时遇到此问题。 这是我的配置: F5 负载均衡器 ---> Varnish 4,8 核,32 Gb RAM ---> 9 个后端,4 个核,每个 16 RA
我是一名优秀的程序员,十分优秀!