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# 多种方式发送邮件(附帮助类)
因项目业务需要,需要做一个发送邮件功能,查了下资料,整了整,汇总如下,亲测可用- QQ邮箱发送邮件 #region 发送邮箱 try { MailMessage mail = new MailMess ...
- ASP.NET MVC5+EF6+EasyUI 后台管理系统(71)-微信公众平台开发-公众号管理
系列目录 思维导图 下面我们来看一个思维导图,这样就可以更快了解所需要的功能: 上一节我们利用了一个简单的代码例子,完成了与微信公众号的对话(给公众号发一条信息,并得到回复) 这一节将讲解公众号如何设 ...
- ASP.NET Core的路由[1]:注册URL模式与HttpHandler的映射关系
ASP.NET Core的路由是通过一个类型为RouterMiddleware的中间件来实现的.如果我们将最终处理HTTP请求的组件称为HttpHandler,那么RouterMiddleware中间 ...
- 如何远程关闭一个ASP.NET Core应用?
在<历数依赖注入的N种玩法>演示系统自动注册服务的实例中,我们会发现输出的列表包含两个特殊的服务,它们的对应的服务接口分别是IApplicationLifetime和IHostingEnv ...
- [OpenGL超级宝典]专栏前言
我小时候的梦想呢,是做宇航员或者科学家或者是做一款属于自己的游戏,后来前面两个梦想都没有实现,于是我就来实现我的第三个梦想了,,,我呢,也算是零基础,因为我的专业是物联网工程,这个专业覆盖面之广,简直 ...
- 如何快速优化手游性能问题?从UGUI优化说起
WeTest 导读 本文作者从自身多年的Unity项目UI开发及优化的经验出发,从UGUI,CPU,GPU以及unity特有资源等几个维度,介绍了unity手游性能优化的一些方法. 在之前的文 ...
- Consul 服务注册与服务发现
上一篇:Mac OS.Ubuntu 安装及使用 Consul 1. 服务注册 对 Consul 进行服务注册之前,需要先部署一个服务站点,我们可以使用 ASP.NET Core 创建 Web 应用程序 ...
- javascript中变量提升的理解
网上找了两个经典的例子 var foo = 1; function bar() { if (!foo) { var foo = 10; } alert(foo); } bar(); // 10 var ...
- Android 死锁和重入锁
死锁的定义: 1.一般的死锁 一般的死锁是指多个线程的执行必须同时拥有多个资源,由于不同的线程需要的资源被不同的线程占用,最终导致僵持的状态,这就是一般死锁的定义. package com.cxt.t ...
- Mysql - 游标/动态sql/事务
游标这个在我目前的项目里面用的还不多, 但是其功能还是很强大的. 动态sql以前都没用过, 是跟着富士康(不是张全蛋的富土康哦)过来的同事学的. 还是挺好用的. 我的数据库方面, 跟他学了不少. 在此 ...