redis集成到Springmvc中及使用实例
redis是现在主流的缓存工具了,因为使用简单、高效且对服务器要求较小,用于大数据量下的缓存
spring也提供了对redis的支持: org.springframework.data.redis.core.RedisTemplate
为了在springmvc环境中使用redis,官方推荐是和jedis结合使用,由jedis来管理连接这些
首先进行整合配置
1.properties文件
#############Common Redis configuration
cache.redis.maxIdle=5
cache.redis.maxActive=20
cache.redis.maxWait=1000
cache.redis.testOnBorrow=true ##############Redis configuration
cache.redis.host=127.0.0.1
cache.redis.port=6379
cache.redis.password=
cache.redis.db=0
cache.redis.timeout=2000 ##############
cache.cacheExpire=500
2.xml配置文档
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://www.springframework.org/schema/beans"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.1.xsd"> <bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">
<property name="maxTotal" value="${cache.redis.maxActive}" />
<property name="maxIdle" value="${cache.redis.maxIdle}" />
<property name="maxWaitMillis" value="${cache.redis.maxWait}" />
<property name="testOnBorrow" value="${cache.redis.testOnBorrow}" />
</bean> <bean id="redisConnectionFactory"
class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory">
<property name="usePool" value="true"></property>
<property name="hostName" value="${cache.redis.host}" />
<property name="port" value="${cache.redis.port}" />
<property name="password" value="${cache.redis.password}" />
<property name="timeout" value="${cache.redis.timeout}" />
<property name="database" value="${cache.redis.db}"></property>
<constructor-arg index="0" ref="jedisPoolConfig" />
</bean> <bean id="redisCache" class="org.springframework.data.redis.core.RedisTemplate">
<property name="connectionFactory" ref="redisConnectionFactory" />
<property name="keySerializer" ref="stringRedisSerializer" />
<property name="valueSerializer" ref="stringRedisSerializer" />
<property name="hashKeySerializer" ref="stringRedisSerializer" />
<property name="hashValueSerializer" ref="stringRedisSerializer" />
</bean> <bean id="stringRedisSerializer"
class="org.springframework.data.redis.serializer.StringRedisSerializer" />
</beans>
3.使用实例之,存入到redis
package net.zicp.xiaochangwei.web.cache; import java.util.List;
import java.util.concurrent.ScheduledThreadPoolExecutor;
import java.util.concurrent.TimeUnit; import net.zicp.xiaochangwei.web.dao.CityDao;
import net.zicp.xiaochangwei.web.dao.FeedBackDao;
import net.zicp.xiaochangwei.web.dao.HobbyDao;
import net.zicp.xiaochangwei.web.dao.PhotoDao;
import net.zicp.xiaochangwei.web.dao.RolePermissionDao;
import net.zicp.xiaochangwei.web.dao.UserDao;
import net.zicp.xiaochangwei.web.entity.City;
import net.zicp.xiaochangwei.web.entity.Hobby;
import net.zicp.xiaochangwei.web.entity.HobbyType;
import net.zicp.xiaochangwei.web.entity.Permission;
import net.zicp.xiaochangwei.web.entity.Photos;
import net.zicp.xiaochangwei.web.entity.Role;
import net.zicp.xiaochangwei.web.entity.UserInfo;
import net.zicp.xiaochangwei.web.utils.Constant;
import net.zicp.xiaochangwei.web.utils.NamedThreadFactory; import org.apache.commons.collections.CollectionUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.DisposableBean;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component; import com.alibaba.fastjson.JSON; /**
*
* @author xiaochangwei
* redis缓存变动较少的数据并定时刷新
*/
@Component
public class BasicDataCacheLoader implements InitializingBean, DisposableBean { private final Logger log = LoggerFactory.getLogger(this.getClass()); protected static final int CORE_SIZE = Runtime.getRuntime().availableProcessors() * 2; @Value("${cache.cacheExpire}")
private long cacheExpire; private ScheduledThreadPoolExecutor executor = null; @Autowired
private RedisTemplate<String, String> redisCache; @Autowired
private FeedBackDao feedBackDao; @Autowired
private RolePermissionDao rolePermissionDao; @Autowired
private CityDao cityDao; @Autowired
private HobbyDao hobbyDao; @Autowired
private UserDao userDao; @Autowired
private PhotoDao photoDao; @Override
public void destroy() throws Exception {
executor.shutdownNow();
} @Override
public void afterPropertiesSet() throws Exception { executor = new ScheduledThreadPoolExecutor(CORE_SIZE, new NamedThreadFactory("static-info-loader"));
RefreshCache refreshCache = new RefreshCache();
refreshCache.run();
executor.scheduleWithFixedDelay(refreshCache, cacheExpire, cacheExpire, TimeUnit.SECONDS); } private class RefreshCache implements Runnable {
@Override
public void run() {
log.info("---开始刷新角色权限缓存-----");
List<Role> roles = rolePermissionDao.getAllRole();
if (CollectionUtils.isNotEmpty(roles)) {
for (Role role : roles) {
List<Permission> permissions = rolePermissionDao.getPermissionByRole(role.getRid());
role.setPermissions(permissions);
redisCache.opsForValue().set(Constant.ROLE + role.getRid(), JSON.toJSONString(role));
}
} log.info("---开始刷新城市缓存-----");
List<City> cityProvince = cityDao.getAllProvince();
redisCache.opsForValue().set(Constant.CITY_ROOT, JSON.toJSONString(cityProvince));
if (CollectionUtils.isNotEmpty(cityProvince)) {
for (City sheng : cityProvince) {
List<City> shis = cityDao.getCityByParentId(sheng.getCid());
sheng.setChildren(shis);
redisCache.opsForValue().set(Constant.CITY + sheng.getCid(), JSON.toJSONString(sheng));
if (CollectionUtils.isNotEmpty(shis)) {
for (City shi : shis) {
List<City> xians = cityDao.getCityByParentId(shi.getCid());
shi.setChildren(xians);
redisCache.opsForValue().set(Constant.CITY + shi.getCid(), JSON.toJSONString(shi));
for (City xian : xians) {
redisCache.opsForValue().set(Constant.CITY + xian.getCid(), JSON.toJSONString(xian));
}
}
}
}
} log.info("---开始刷新兴趣爱好缓存-----");
List<HobbyType> allHobby = hobbyDao.getAllHobbys();
if(CollectionUtils.isNotEmpty(allHobby)){
for(HobbyType ht : allHobby){
List<Hobby> hobbys = hobbyDao.getHobbyItems(ht.getHtId());
if(CollectionUtils.isNotEmpty(hobbys)){
ht.setHobbys(hobbys);
}
redisCache.opsForValue().set(Constant.HOBBY + ht.getHtId(), JSON.toJSONString(ht));
}
} log.info("---开始刷新用户信息缓存-----");
List<UserInfo> userinfos = userDao.getAllUserInfo();
if(CollectionUtils.isNotEmpty(userinfos)){
for(UserInfo userInfo : userinfos){
List<Photos> photos = photoDao.getUserPhotos(userInfo.getUserId());
if(CollectionUtils.isNotEmpty(photos)){
userInfo.setPhotos(photos);
}
redisCache.opsForValue().set(Constant.USER_INFO + userInfo.getUserId(), JSON.toJSONString(userInfo));
}
} }
}
}
4.从redis中获取并解析为对象
@Override
public List<UserInfo> getUserInfoFromCache(int number) {
Set<String> sets = redis.keys(Constant.USER_INFO + "*");
Iterator<String> it = sets.iterator();
List<UserInfo> result = new LinkedList<UserInfo>();
int i = 0;
while(it.hasNext() && i<number){
String item = it.next();
String value = redis.opsForValue().get(item);
result.add(JSON.parseObject(value,UserInfo.class));
i++;
}
return result;
}
redis集成到Springmvc中及使用实例的更多相关文章
- Redis在Laravel项目中的应用实例详解
https://mp.weixin.qq.com/s/axIgNPZLJDh9VFGVk7oYYA 在初步了解Redis在Laravel中的应用 那么我们试想这样的一个应用场景 一个文章或者帖子的浏览 ...
- 如何在springMVC 中对REST服务使用mockmvc 做测试
如何在springMVC 中对REST服务使用mockmvc 做测试 博客分类: java 基础 springMVCmockMVC单元测试 spring 集成测试中对mock 的集成实在是太棒了!但 ...
- 【主流技术】Redis 在 Spring 框架中的实践
前言 在Java Spring 项目中,数据与远程数据库的频繁交互对服务器的内存消耗比较大,而 Redis 的特性可以有效解决这样的问题. Redis 的几个特性: Redis 以内存作为数据存储介质 ...
- SpringMVC中使用Cron表达式的定时器
SpringMVC中使用Cron表达式的定时器 cron(定时策略)简要说明 顺序: 秒 分 时 日 月 星期 年份 (7个参数,空格隔开各个参数,年份非必须参数) 通配符: , 如果分钟位置为* 1 ...
- Spring+Mybatis+SpringMVC+Maven+MySql搭建实例
林炳文Evankaka原创作品.转载请注明出处http://blog.csdn.net/evankaka 摘要:本文主要讲了如何使用Maven来搭建Spring+Mybatis+SpringMVC+M ...
- springmvc中request的线程安全问题
SpringMvc学习心得(四)springmvc中request的线程安全问题 标签: springspring mvc框架线程安全 2016-03-19 11:25 611人阅读 评论(1) 收藏 ...
- 详解SpringMVC中Controller的方法中参数的工作原理[附带源码分析]
目录 前言 现象 源码分析 HandlerMethodArgumentResolver与HandlerMethodReturnValueHandler接口介绍 HandlerMethodArgumen ...
- SpringMvc中Interceptor拦截器用法
SpringMVC 中的Interceptor 拦截器也是相当重要和相当有用的,它的主要作用是拦截用户的请求并进行相应的处理.比如通过它来进行权限验证,或者是来判断用户是否登陆等. 一. 使用场景 1 ...
- [Python][flask][flask-wtf]关于flask-wtf中API使用实例教程
简介:简单的集成flask,WTForms,包括跨站请求伪造(CSRF),文件上传和验证码. 一.安装(Install) 此文仍然是Windows操作系统下的教程,但是和linux操作系统下的运行环境 ...
随机推荐
- 匹夫细说C#:庖丁解牛迭代器,那些藏在幕后的秘密
0x00 前言 在匹夫的上一篇文章<匹夫细说C#:不是“栈类型”的值类型,从生命周期聊存储位置>的最后,匹夫以总结和后记的方式涉及到一部分迭代器的知识.但是觉得还是不够过瘾,很多需要说清楚 ...
- 23种设计模式--责任链模式-Chain of Responsibility Pattern
一.责任链模式的介绍 责任链模式用简单点的话来说,将责任一步一步传下去,这就是责任,想到这个我们可以相当击鼓传花,这个是为了方便记忆,另外就是我们在项目中经常用到的审批流程等这一类的场景时我们就可以考 ...
- C#多线程之基础篇3
在上一篇C#多线程之基础篇2中,我们主要讲述了确定线程的状态.线程优先级.前台线程和后台线程以及向线程传递参数的知识,在这一篇中我们将讲述如何使用C#的lock关键字锁定线程.使用Monitor锁定线 ...
- ASP.NET Core project.json imports 是什么意思?
示例代码: "frameworks": { "netcoreapp1.0.0": { "imports" : "portable- ...
- MySQL 系列(三)你不知道的 视图、触发器、存储过程、函数、事务、索引、语句
第一篇:MySQL 系列(一) 生产标准线上环境安装配置案例及棘手问题解决 第二篇:MySQL 系列(二) 你不知道的数据库操作 第三篇:MySQL 系列(三)你不知道的 视图.触发器.存储过程.函数 ...
- 【转】为什么我们都理解错了HTTP中GET与POST的区别
GET和POST是HTTP请求的两种基本方法,要说它们的区别,接触过WEB开发的人都能说出一二. 最直观的区别就是GET把参数包含在URL中,POST通过request body传递参数. 你可能自己 ...
- JavaScript 正则表达式语法
定义 JavaScript定义正则表达式有两种方法. 1.RegExp构造函数 var pattern = new RegExp("[bc]at","i"); ...
- 【干货分享】流程DEMO-采购预算编制
流程名: 采购预算编制 业务描述: 在月初由计财部进行预算编辑,提交审批后预算生效 流程相关文件: 流程包.xml WebService业务服务.xml WebService.asmx WebSe ...
- Linux学习日记(二)
在linux上运行.Net程序 并安装Linux网站 一.环境 ubuntu14.10(桌面版 官网下载的最新版) jexus5.6.3 正式版 MonoDevloper (安装完后里面有个Ubunt ...
- MySql 死锁时的一种解决办法
转自:http://blog.csdn.net/mchdba/article/details/38313881 之前也遇到一次,今天又遇到了这个问题,所以这次必须解决,网上找到这篇文章帮了大忙,方便以 ...