在项目中,我们经常需要将一些常用的数据使用缓存起来,避免频繁的查询数据库造成效率低下。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的更多相关文章

  1. SpringBoot--使用Spring Cache整合redis

    一.简介 Spring Cache是Spring对缓存的封装,适用于 EHCache.Redis.Guava等缓存技术. 二.作用 主要是可以使用注解的方式来处理缓存,例如,我们使用redis缓存时, ...

  2. 【Spring】17、spring cache 与redis缓存整合

    spring cache,基本能够满足一般应用对缓存的需求,但现实总是很复杂,当你的用户量上去或者性能跟不上,总需要进行扩展,这个时候你或许对其提供的内存缓存不满意了,因为其不支持高可用性,也不具备持 ...

  3. springboot整合spring @Cache和Redis

    转载请注明出处:https://www.cnblogs.com/wenjunwei/p/10779450.html spring基于注解的缓存 对于缓存声明,spring的缓存提供了一组java注解: ...

  4. Spring Boot2 系列教程(二十九)Spring Boot 整合 Redis

    经过 Spring Boot 的整合封装与自动化配置,在 Spring Boot 中整合Redis 已经变得非常容易了,开发者只需要引入 Spring Data Redis 依赖,然后简单配下 red ...

  5. Spring优雅整合Redis缓存

    “小明,多系统的session共享,怎么处理?”“Redis缓存啊!” “小明,我想实现一个简单的消息队列?”“Redis缓存啊!” “小明,分布式锁这玩意有什么方案?”“Redis缓存啊!” “小明 ...

  6. Spring Boot(八)集成Spring Cache 和 Redis

    在Spring Boot中添加spring-boot-starter-data-redis依赖: <dependency> <groupId>org.springframewo ...

  7. SpringBoot入门系列(七)Spring Boot整合Redis缓存

    前面介绍了Spring Boot 中的整合Mybatis并实现增删改查,.不清楚的朋友可以看看之前的文章:https://www.cnblogs.com/zhangweizhong/category/ ...

  8. Spring Boot 整合 Redis 和 JavaMailSender 实现邮箱注册功能

    Spring Boot 整合 Redis 和 JavaMailSender 实现邮箱注册功能 开篇 现在的网站基本都有邮件注册功能,毕竟可以通过邮件定期的给用户发送一些 垃圾邮件 精选推荐

  9. 使用Spring Cache集成Redis

    SpringBoot 是为了简化 Spring 应用的创建.运行.调试.部署等一系列问题而诞生的产物,自动装配的特性让我们可以更好的关注业务本身而不是外部的XML配置,我们只需遵循规范,引入相关的依赖 ...

随机推荐

  1. el-table回显遇到的坑

    使用element ui 的el-table在做到复选框回显勾中的问题时,整整困惑了我一天,当时百度了一下,好多人都说是  this.$nextTick(() => {})的问提,在组件中监听w ...

  2. golang中的左值VS右值

    对应关系 左值 可寻址 右值 不可寻址 可寻址:可以通过&取地址符,获取内存地址; 可寻址,也就是分配了内存; 不可寻址:根本没有分配内存; 常量const 常量通常只支持数字/字符串/布尔, ...

  3. 谈谈raft fig8 —— 迷惑的提交条件和选举条件

    谈谈raft fig8 -- 迷惑的提交条件和选举条件 前言 这篇文章的思路其实在两个月前就已经成型了,但由于实习太累了,一直没来得及写出来.大概一个月前在群里和群友争论fig8的一些问题时,发现很多 ...

  4. symfony generate:bundle出现提示: Checking that the bundle is autoloaded

    可以参考官方文档给出来的解决办法 http://symfonychina.com/doc/current/bundles/SensioGeneratorBundle/commands/generate ...

  5. 【tp6】解决Driver [Think] not supported.

    使用助手函数view时会出现 解决方法:使用composer安装composer require topthink/think-view

  6. Java基础系列(27)- 什么是方法

    何谓方法 System.out.println();它是什么呢 # System:类 # out:对象 # println():方法 Java方法是语句的集合,它们在一起执行一个功能 方法是解决一类问 ...

  7. Promise源码实现与测试

    const PENDING = 'pending', FULFILLED = 'fulfilled', REJECTED = 'rejected' class MyPromise { construc ...

  8. python刷题第四周

    本周有所收获的题目: 第一题: 第4章-17 水仙花数(20 分) (20 分) 水仙花数是指一个N位正整数(N≥3),它的每个位上的数字的N次幂之和等于它本身. 例如:153=1×1×1+5×5×5 ...

  9. redis 与java的连接 和集群环境下Session管理

    redis 的安装与设置开机自启(https://www.cnblogs.com/zhulina-917/p/11746993.html)  第一步: a) 搭建环境 引入 jedis jar包 co ...

  10. 鸿蒙内核源码分析(调度机制篇) | 任务是如何被调度执行的 | 百篇博客分析OpenHarmony源码 | v7.07

    百篇博客系列篇.本篇为: v07.xx 鸿蒙内核源码分析(调度机制篇) | 任务是如何被调度执行的 | 51.c.h .o 任务管理相关篇为: v03.xx 鸿蒙内核源码分析(时钟任务篇) | 触发调 ...