`

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.进行测试

 

 

 

 

  • 大小: 128.3 KB
  • 大小: 31.4 KB
分享到:
评论

相关推荐

    SpringCache整合Redis简单练习

    SpringCache整合Redis简单练习

    SpringCache与redis集成,优雅的缓存解决方案.docx

    SpringCache与Redis集成,优雅的缓存解决方案 SpringCache是一种基于Java的缓存解决方案,它可以与Redis集成,提供了一种优雅的缓存解决方案。在本文中,我们将对SpringCache与Redis集成的优雅缓存解决方案进行详细...

    Spring cache整合redis代码实例

    主要介绍了Spring cache整合redis代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

    Spring Cache整合Redis实现方法详解

    Spring Cache整合Redis实现方法详解 Spring Cache是Spring框架中的一种缓存机制,可以帮助开发者快速实现缓存功能,而Redis是当前最流行的NoSQL数据库之一,高性能、持久化、数据类型丰富等特点使其成为当前最流行...

    spring cache + redis 主从

    此外,还需要掌握如何将Spring Cache与Redis整合,以便在应用中高效使用缓存机制。 一、Redis的主从配置 1. 准备工作: - 操作系统要求:Ubuntu 16.04。 - Redis版本:选择适合的稳定版本,例如redis-4.0.9.tar....

    Spring3.0整合redis相关jar

    "Spring3.0整合redis相关jar"这个主题主要涉及的是如何在Spring 3.0版本中集成Redis作为数据存储或缓存解决方案。Spring 3.0虽然相对较老,但在当时是广泛使用的版本,因此了解其与Redis的集成方式对维护旧项目或...

    springcache+redis springboot maven

    在这个项目中,"springcache+redis"的整合意味着我们要利用Spring Cache的特性,将缓存存储在Redis中,以提升应用的性能。 首先,Spring Cache提供了`@Cacheable`、`@CacheEvict`和`@Caching`等注解,允许我们在...

    springboot整合redis+shiro

    标题 "springboot整合redis+shiro" 描述的是一个基于Spring Boot的应用程序,该应用程序集成了Redis和Apache Shiro框架,以实现权限管理和用户认证。这个项目还包含了SQL文件,可以方便地部署和运行,但前提是你需要...

    springboot_springcache_redis入门实例

    以上就是SpringBoot整合SpringCache和Redis的基本步骤。这个入门实例可以帮助你理解如何在实际项目中利用这三个强大的工具提升应用性能。通过实践和调整,你可以根据具体需求进一步优化缓存策略,比如设置过期时间、...

    spring boot cache 整合 redis demo (redis windows 安装包,和redis desktop管理工具)

    在本项目中,我们主要探讨的是如何在Spring Boot应用中整合Redis实现缓存功能,并提供了Windows环境下Redis的安装包以及Redis Desktop Manager这款桌面管理工具。这个整合过程涉及到多个关键知识点,接下来将逐一...

    spring整合redis项目

    Spring整合Redis项目是一种常见的数据存储和缓存解决方案,特别是在高并发、大数据量的Web应用中。Redis是一款开源的、高性能的键值对数据库,而Spring是Java领域广泛使用的框架,提供了一整套的企业级应用开发工具...

    SpringCache+Redis实现高可用缓存解决方案.docx

    ### SpringCache+Redis实现高可用缓存解决方案 #### 前言 在现代软件开发中,缓存技术是提升系统性能的重要手段之一。Spring Boot框架自带的`ConcurrentMapCacheManager`虽然简单易用,但对于分布式环境下的应用来...

    Spring Boot整合Redis的完整步骤

    "Spring Boot整合Redis的完整步骤" 本文将详细介绍Spring Boot整合Redis的完整步骤,包括Spring Boot对Redis的支持、添加依赖、配置RedisTemplate和StringRedisTemplate、使用Redis缓存等。 一、Spring Boot对...

    Springboot 2.X中Spring-cache与redis整合

    **Spring Boot 2.X 中 Spring Cache 与 Redis 整合详解** 在现代的 Web 应用开发中,缓存机制是提升系统性能的关键技术之一。Spring Cache 是 Spring 框架提供的一种统一的缓存抽象,它允许开发者通过简单的注解来...

    Spring整合Redis用作缓存-注解方式

    Spring框架提供了一种灵活且强大的方式来整合Redis,使得在Java应用中使用Redis作为缓存变得简单。 首先,我们需要在项目中添加相关的依赖。Spring Data Redis是Spring框架的一个模块,专门用于处理Redis集成。在`...

    Redis整合SpringCache实例

    **Redis整合SpringCache实例** 在现代的Web应用中,数据缓存是提高系统性能的关键技术之一。本示例主要探讨如何将开源的内存数据结构存储系统Redis与Spring Cache框架结合,实现高效的分布式缓存解决方案。Redis以...

    springboot整合redis.zip

    SpringBoot整合Redis是现代Web应用中常见的数据存储与缓存技术结合方式,它极大地简化了在SpringBoot项目中配置和使用Redis的过程。Redis是一个高性能的键值对存储系统,适用于处理大量数据,常用于缓存、消息队列、...

    SpringBoot整合Redis实例

    本教程将详细介绍如何在Spring Boot项目中整合Redis,涵盖单机版、Redis集群以及Redis Sentinel哨兵模式。 首先,我们要理解Spring Boot与Redis的基本整合。Spring Boot提供了自动配置功能,通过添加`spring-boot-...

Global site tag (gtag.js) - Google Analytics