redis与spring结合使用
2016-04-26 11:27
543 查看
推荐一篇文章:
http://mp.weixin.qq.com/s?__biz=MjM5NzMyMjAwMA==&mid=2651477079&idx=1&sn=dd366c247d6225ee77177f5909a6a9b1&scene=4#wechat_redirect
redis与spring结合使用,在 MethodInterceptor 里 将请求参数为key,返回结果为value,通过约定的命名规则,将访问频繁的且对权限控制要求不高的请求“自动”接入redis。
比在具体方法里 进行 存取操作 ,工作量跟维护成本低很多。
http://pan.baidu.com/s/1gf4QD0n
http://mp.weixin.qq.com/s?__biz=MjM5NzMyMjAwMA==&mid=2651477079&idx=1&sn=dd366c247d6225ee77177f5909a6a9b1&scene=4#wechat_redirect
redis与spring结合使用,在 MethodInterceptor 里 将请求参数为key,返回结果为value,通过约定的命名规则,将访问频繁的且对权限控制要求不高的请求“自动”接入redis。
比在具体方法里 进行 存取操作 ,工作量跟维护成本低很多。
public class MethodCacheInterceptor implements MethodInterceptor { private RedisTemplate<Serializable, Object> redisTemplate; private Long defaultCacheExpireTime = 10l; // 缓存默认的过期时间,这里设置了10秒 public Object invoke(MethodInvocation invocation) throws Throwable { Object value = null; String targetName = invocation.getThis().getClass().getName(); String methodName = invocation.getMethod().getName(); Object[] arguments = invocation.getArguments(); String key = getCacheKey(targetName, methodName, arguments); try { // 判断是否有缓存 if (exists(key)) { return getCache(key); } // 写入缓存 value = invocation.proceed(); if (value != null) { final String tkey = key; final Object tvalue = value; new Thread(new Runnable() { public void run() { setCache(tkey, tvalue, defaultCacheExpireTime); } }).start(); } } catch (Exception e) { e.printStackTrace(); if (value == null) { return invocation.proceed(); } } return value; } /** * 创建缓存key * * @param targetName * @param methodName * @param arguments */ private String getCacheKey(String targetName, String methodName, Object[] arguments) { StringBuffer sbu = new StringBuffer(); sbu.append(targetName).append("_").append(methodName); if ((arguments != null) && (arguments.length != 0)) { for (int i = 0; i < arguments.length; i++) { sbu.append("_").append(arguments[i]); } } return sbu.toString(); } /** * 判断缓存中是否有对应的value * * @param key * @return */ public boolean exists(final String key) { return redisTemplate.hasKey(key); } /** * 读取缓存 * * @param key * @return */ public Object getCache(final String key) { Object result = null; ValueOperations<Serializable, Object> operations = redisTemplate .opsForValue(); result = operations.get(key); return result; } /** * 写入缓存 * * @param key * @param value * @return */ public boolean setCache(final String key, Object value, Long expireTime) { boolean result = false; try { ValueOperations<Serializable, Object> operations = redisTemplate .opsForValue(); operations.set(key, value); redisTemplate.expire(key, expireTime, TimeUnit.SECONDS); result = true; } catch (Exception e) { e.printStackTrace(); } return result; } public void setRedisTemplate( RedisTemplate<Serializable, Object> redisTemplate) { this.redisTemplate = redisTemplate; } }
<!-- jedis 配置 --> <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 > <!-- redis服务器中心 --> <bean id="connectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory" > <property name="poolConfig" ref="poolConfig" /> <property name="port" value="${redis.port}" /> <property name="hostName" value="${redis.host}" /> <!-- <property name="password" value="${redis.password}" /> --> <property name="timeout" value="${redis.timeout}" ></property> </bean > <bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate" > <property name="connectionFactory" ref="connectionFactory" /> <property name="keySerializer" > <bean class="org.springframework.data.redis.serializer.StringRedisSerializer" /> </property> <property name="valueSerializer" > <bean class="org.springframework.data.redis.serializer.JdkSerializationRedisSerializer" /> </property> </bean > <!-- cache配置 --> <bean id="methodCacheInterceptor" class="com.test.redis.interceptor.MethodCacheInterceptor" > <property name="redisTemplate" ref="redisTemplate" /> </bean > <!-- aop配置切点跟通知 --> <bean id="methodCachePointCut" class="org.springframework.aop.support.RegexpMethodPointcutAdvisor"> <property name="advice" ref="methodCacheInterceptor"/> <property name="pattern" value=".*ServiceImpl.*getTimestamp"/> </bean> <bean id="redisTestService" class="com.test.redis.RedisTestServiceImpl"> </bean>
http://pan.baidu.com/s/1gf4QD0n
相关文章推荐
- Redis实战(五)
- Redis实战(四)
- Error creating bean with name 'enableRedisKeyspaceNotificationsInitializer'
- Error creating bean with name 'enableRedisKeyspaceNotificationsInitializer'
- Redis是一种面向“key-value”类型数据的分布式NoSQL数据库系统,具有高性能、持久存储、适应高并发应用场景等优势。它虽然起步较晚,但发展却十分迅速。
- Redis实战配置(三)
- Redis实战(二)
- redis配置详解
- redis 数据持久化
- Redis+Spring缓存实例(windows环境,附实例源码及详解)
- Redis 实现用户积分排行榜
- redis.conf配置详细解析
- linux下redis安装配置及redis常用命令
- Redis实战(一)
- linux下安装Redis
- Redis 下载
- Redis队列——PHP操作简单示例
- NoSQL之Redis(四)--- RedisCluster概念以及搭建
- rspamd 使用redis 作为bakend
- redis预分区介绍