spring cache整合redis
在项目中,我们经常需要将一些常用的数据使用缓存起来,避免频繁的查询数据库造成效率低下。spring 为我们提供了一套基于注解的缓存实现,方便我们实际的开发。我们可以扩展spring的cache接口以达到使用redis来做缓存的效果。
步骤:
1.编写一个类用于实现 org.springframework.cache.Cache 这个接口
2.编写一个类实现 org.springframework.cache.CacheManager 这个接口或继承 org.springframework.cache.support.AbstractCacheManager这个类
3.在配置文件中进行配置。
代码:
1.使用redis实现spring的cache接口 -- 数据以hash的方式存入到redis中
package com.huan.redis.springcache;
import org.springframework.cache.Cache;
import org.springframework.cache.support.SimpleValueWrapper;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
/**
* 自定义redis缓存
*
* @描述
* @作者 huan
* @时间 2016年6月26日 - 下午2:14:26
*/
public class RedisCache implements Cache {
private JedisPool jedisPool;
/** 缓存的过期时间,单位是秒 */
private int timeouts;
public void setJedisPool(JedisPool jedisPool) {
this.jedisPool = jedisPool;
}
public int getTimeouts() {
return timeouts;
}
public void setTimeouts(int timeouts) {
this.timeouts = timeouts;
}
private String name;
public void setName(String name) {
this.name = name;
}
@Override
public String getName() {
return name;
}
@Override
public Object getNativeCache() {
return jedisPool;
}
@Override
public ValueWrapper get(Object key) {
ValueWrapper result = null;
Jedis jedis = null;
try {
jedis = jedisPool.getResource();
String value = jedis.hget(getName(), (String) key);
if (value != null) {
result = new SimpleValueWrapper(value);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (null != jedis) {
jedis.close();
}
}
return result;
}
@Override
public void put(Object key, Object value) {
String cacheKey = (String) key;
String cacheValue = (String) value;
Jedis jedis = null;
try {
jedis = jedisPool.getResource();
jedis.hset(getName(), cacheKey, cacheValue);
jedis.expire(getName(), getTimeouts());
} catch (Exception e) {
e.printStackTrace();
} finally {
if (null != jedis) {
jedis.close();
}
}
}
@Override
public void evict(Object key) {
if (null != key) {
Jedis jedis = null;
try {
jedis = jedisPool.getResource();
jedis.hdel(getName(), (String) key);
} catch (Exception e) {
e.printStackTrace();
} finally {
if (null != jedis) {
jedis.close();
}
}
}
}
@Override
public void clear() {
Jedis jedis = null;
try {
jedis = jedisPool.getResource();
jedis.hdel(getName());
} catch (Exception e) {
e.printStackTrace();
} finally {
if (null != jedis) {
jedis.close();
}
}
}
}
2.实现自己的缓存管理器
package com.huan.redis.springcache;
import java.util.Collection;
import org.springframework.cache.Cache;
import org.springframework.cache.support.AbstractCacheManager;
/**
* 继承spring的抽象缓存管理器,用于实现我们自己的缓存管理
* @描述
* @作者 huan
* @时间 2016年6月26日 - 下午2:17:15
*/
public class RedisCacheManager extends AbstractCacheManager{
private Collection<? extends RedisCache> caches;
public void setCaches(Collection<? extends RedisCache> caches) {
this.caches = caches;
}
@Override
protected Collection<? extends Cache> loadCaches() {
return this.caches;
}
}
3.配置文件中进行配置
<?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:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:cache="http://www.springframework.org/schema/cache"
xsi:schemaLocation="http://www.springframework.org/schema/cache http://www.springframework.org/schema/cache/spring-cache-3.2.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.2.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.2.xsd">
<context:annotation-config />
<context:component-scan base-package="com.huan.redis" />
<cache:annotation-driven cache-manager="cacheManager"/>
<bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">
<property name="testWhileIdle" value="true" />
<property name="minEvictableIdleTimeMillis" value="60000" />
<property name="timeBetweenEvictionRunsMillis" value="30000" />
<property name="numTestsPerEvictionRun" value="-1" />
<property name="maxTotal" value="8" />
<property name="maxIdle" value="8" />
<property name="minIdle" value="0" />
</bean>
<bean id="jedisPool" class="redis.clients.jedis.JedisPool">
<constructor-arg ref="jedisPoolConfig" />
<constructor-arg value="192.168.1.5" />
</bean>
<bean id="cacheManager" class="com.huan.redis.springcache.RedisCacheManager">
<property name="caches">
<set>
<bean class="com.huan.redis.springcache.RedisCache">
<property name="jedisPool" ref="jedisPool" />
<property name="name" value="usersCache" />
<property name="timeouts" value="3600" />
</bean>
<bean class="com.huan.redis.springcache.RedisCache">
<property name="jedisPool" ref="jedisPool" />
<property name="name" value="booksCache" />
<property name="timeouts" value="3600" />
</bean>
</set>
</property>
</bean>
</beans>
注意:1. <cache:annotation-driven cache-manager="cacheManager"/>这一句用于开启spring的缓存注解
2.redis.clients.jedis.JedisPool 用于配置redis的地址和端口,默认端口是6379,如果自己的redis不是这个端口,可以选择JedisPool中适当的构造方法进行配置
4.编写业务方法 -- UserService类中比较简单,就是UserServiceImpl中方法的申明。
package com.huan.redis.service;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;
/**
* 测试业务员方法
* @描述
* @作者 huan
* @时间 2016年6月26日 - 下午3:20:58
*/
@Service
public class UserServiceImpl implements UserService {
/** 将数据放入到usersCache这个缓存中,缓存的key使用spirng的spel表达式获取值 */
@Override
@Cacheable(value = "usersCache", key = "#loginName")
public String getUser(String loginName) {
System.out.println("no user cache:" + loginName);
return loginName;
}
@Override
public String getUserNoCache(String loginName) {
return getUser(loginName);
}
@Override
@Cacheable(value = "booksCache", key = "#bookId")
public String addBook(String bookId) {
System.out.println("no book cache:" + bookId);
return bookId;
}
/** 使usersCache中的缓存key为#loginName这个值的缓存失效 */
@Override
@CacheEvict(value = "usersCache", key = "#loginName")
public void evictUser(String loginName) {
System.out.println("evict cache loginName:" + loginName);
}
}
5.进行测试


spring cache整合redis的更多相关文章
- SpringBoot--使用Spring Cache整合redis
一.简介 Spring Cache是Spring对缓存的封装,适用于 EHCache.Redis.Guava等缓存技术. 二.作用 主要是可以使用注解的方式来处理缓存,例如,我们使用redis缓存时, ...
- 【Spring】17、spring cache 与redis缓存整合
spring cache,基本能够满足一般应用对缓存的需求,但现实总是很复杂,当你的用户量上去或者性能跟不上,总需要进行扩展,这个时候你或许对其提供的内存缓存不满意了,因为其不支持高可用性,也不具备持 ...
- springboot整合spring @Cache和Redis
转载请注明出处:https://www.cnblogs.com/wenjunwei/p/10779450.html spring基于注解的缓存 对于缓存声明,spring的缓存提供了一组java注解: ...
- Spring Boot2 系列教程(二十九)Spring Boot 整合 Redis
经过 Spring Boot 的整合封装与自动化配置,在 Spring Boot 中整合Redis 已经变得非常容易了,开发者只需要引入 Spring Data Redis 依赖,然后简单配下 red ...
- Spring优雅整合Redis缓存
“小明,多系统的session共享,怎么处理?”“Redis缓存啊!” “小明,我想实现一个简单的消息队列?”“Redis缓存啊!” “小明,分布式锁这玩意有什么方案?”“Redis缓存啊!” “小明 ...
- Spring Boot(八)集成Spring Cache 和 Redis
在Spring Boot中添加spring-boot-starter-data-redis依赖: <dependency> <groupId>org.springframewo ...
- SpringBoot入门系列(七)Spring Boot整合Redis缓存
前面介绍了Spring Boot 中的整合Mybatis并实现增删改查,.不清楚的朋友可以看看之前的文章:https://www.cnblogs.com/zhangweizhong/category/ ...
- Spring Boot 整合 Redis 和 JavaMailSender 实现邮箱注册功能
Spring Boot 整合 Redis 和 JavaMailSender 实现邮箱注册功能 开篇 现在的网站基本都有邮件注册功能,毕竟可以通过邮件定期的给用户发送一些 垃圾邮件 精选推荐
- 使用Spring Cache集成Redis
SpringBoot 是为了简化 Spring 应用的创建.运行.调试.部署等一系列问题而诞生的产物,自动装配的特性让我们可以更好的关注业务本身而不是外部的XML配置,我们只需遵循规范,引入相关的依赖 ...
随机推荐
- HTTP快速入门
一.tomcat端口号设置为80,访问时候可以不加:http协议1.1版本可以复用连接,请求结束后会稍微等会: 二. 表单,get方式提交: 三.user-agent告诉服务器是哪个浏览器,代码中解决 ...
- 使用python快速搭建http服务
python2语法:python -m SimpleHTTPServer python3语法:python -m http.server 在局域网中使用web去访问http:/IP:8000即可 可以 ...
- 利用滴答定时器(SysTick)实现简单的延时函数
预备知识: 对标准库来说,如果定义了时钟频率,则系统会默认初始化该时钟频率. SysTick是CM4的内核外设,是一个24位的向下递减计数器,每次计数时间是1/SYSCLK,即1/168000000. ...
- Spring Cloud Hystrix 学习(一)
在学习Hystrix之前,首先引入一个问题场景,服务雪崩.如下图所示: 可以看到,三个入口服务A.B.C最终都会请求到服务T.当服务T的请求过载,打满CPU都无法匹配请求的频率时,同步调用的上级服务就 ...
- PHP中的日期相关函数(三)
之前我们已经介绍过了 PHP 的一些相关的日期操作对象,今天我们就来学习剩下的那些面向过程的使用方式.当然,如果是和 DateTime 类中相似的方法我们就不再进行介绍了.另外,Date() 和 ti ...
- PHP中的数组分页实现(非数据库)
在日常开发的业务环境中,我们一般都会使用 MySQL 语句来实现分页的功能.但是,往往也有些数据并不多,或者只是获取 PHP 中定义的一些数组数据时需要分页的功能.这时,我们其实不需要每次都去查询数据 ...
- Jmeter系列(36)- Access Log Sampler
简介 Access Log Sampler 是个非常有用的工具,可以收集和分析真实用户操作的数据,并可用于流量分析.常见的就是我们的nginx的access.log 日志 使用 access.log ...
- Leetcode 矩阵置零
题目描述(中等难度) 给定一个 m x n 的矩阵,如果一个元素为 0 ,则将其所在行和列的所有元素都设为 0 .请使用 原地 算法. 进阶: 一个直观的解决方案是使用 O(mn) 的额外空间,但这 ...
- 使用form插件 和ajax 结合使用 没有调用success的原因
当我做文件上传的时候出现不调用success方法 将datype: 'json' 注释掉后成功响应 浏览器显示200状态码,并且响应头为json格式,格式ajax不认为它是json,所以一直执行错误 ...
- Navicat连接数据库成功,新建查询时提示错误“Cannot create file ……”
Navicat连接数据库成功,新建查询时提示错误"Cannot create file --" 原因:编辑连接{高级}<设置位置>被修改,该oci.dll不正确 解决方 ...