windows环境下Redis+Spring缓存实例讲解_Redis

一、Redis了解

1.1、Redis介绍:

redis是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set –有序集合)和hash(哈希类型)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,redis支持各种不同方式的排序。与memcached一样,为了保证效率,数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。

Redis数据库完全在内存中,使用磁盘仅用于持久性。相比许多键值数据存储,Redis拥有一套较为丰富的数据类型。Redis可以将数据复制到任意数量的从服务器。

1.2、Redis优点:

(1)异常快速:Redis的速度非常快,每秒能执行约11万集合,每秒约81000+条记录。

(2)支持丰富的数据类型:Redis支持最大多数开发人员已经知道像列表,集合,有序集合,散列数据类型。这使得它非常容易解决各种各样的问题,因为我们知道哪些问题是可以处理通过它的数据类型更好。

(3)操作都是原子性:所有Redis操作是原子的,这保证了如果两个客户端同时访问的Redis服务器将获得更新后的值。

(4)多功能实用工具:Redis是一个多实用的工具,可以在多个用例如缓存,消息,队列使用(Redis原生支持发布/订阅),任何短暂的数据,应用程序,如Web应用程序会话,网页命中计数等。

1.3、Redis缺点:

(1)单线程

(2)耗内存

二、64位windows下Redis安装

Redis官方是不支持windows的,但是Microsoft Open Tech group 在 GitHub上开发了一个Win64的版本,下载地址:https://github.com/MSOpenTech/redis/releases。注意只支持64位哈。

小宝鸽是下载了Redis-x64-3.0.500.msi进行安装。安装过程中全部采取默认即可。

安装完成之后可能已经帮你开启了Redis对应的服务,博主的就是如此。查看资源管理如下,说明已经开启:

已经开启了对应服务的,我们让它保持,下面例子需要用到。如果没有开启的,我们命令开启,进入Redis的安装目录(博主的是C:\Program Files\Redis),然后如下命令开启:

redis-server  redis.windows.conf

OK,下面我们进行实例。

三、详细实例

本工程采用的环境:Eclipse + maven + spring + junit

3.1、添加相关依赖(spring+junit+redis依赖),pom.xml:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
 <modelVersion>4.0.0</modelVersion>
 <groupId>com.luo</groupId>
 <artifactId>redis_project</artifactId>
 <version>0.0.1-SNAPSHOT</version>

 <properties>
  <!-- spring版本号 -->
  <spring.version>3.2.8.RELEASE</spring.version>
  <!-- junit版本号 -->
  <junit.version>4.10</junit.version>
 </properties>

 <dependencies>
  <!-- 添加Spring依赖 -->
  <dependency>
   <groupId>org.springframework</groupId>
   <artifactId>spring-core</artifactId>
   <version>${spring.version}</version>
  </dependency>
  <dependency>
   <groupId>org.springframework</groupId>
   <artifactId>spring-webmvc</artifactId>
   <version>${spring.version}</version>
  </dependency>
  <dependency>
   <groupId>org.springframework</groupId>
   <artifactId>spring-context</artifactId>
   <version>${spring.version}</version>
  </dependency>
  <dependency>
   <groupId>org.springframework</groupId>
   <artifactId>spring-context-support</artifactId>
   <version>${spring.version}</version>
  </dependency>
  <dependency>
   <groupId>org.springframework</groupId>
   <artifactId>spring-aop</artifactId>
   <version>${spring.version}</version>
  </dependency>
  <dependency>
   <groupId>org.springframework</groupId>
   <artifactId>spring-aspects</artifactId>
   <version>${spring.version}</version>
  </dependency>
  <dependency>
   <groupId>org.springframework</groupId>
   <artifactId>spring-tx</artifactId>
   <version>${spring.version}</version>
  </dependency>
  <dependency>
   <groupId>org.springframework</groupId>
   <artifactId>spring-jdbc</artifactId>
   <version>${spring.version}</version>
  </dependency>
  <dependency>
   <groupId>org.springframework</groupId>
   <artifactId>spring-web</artifactId>
   <version>${spring.version}</version>
  </dependency>

  <!--单元测试依赖 -->
  <dependency>
   <groupId>junit</groupId>
   <artifactId>junit</artifactId>
   <version>${junit.version}</version>
   <scope>test</scope>
  </dependency>

  <!--spring单元测试依赖 -->
  <dependency>
   <groupId>org.springframework</groupId>
   <artifactId>spring-test</artifactId>
   <version>${spring.version}</version>
   <scope>test</scope>
  </dependency>

  <!-- Redis 相关依赖 -->
  <dependency>
   <groupId>org.springframework.data</groupId>
   <artifactId>spring-data-redis</artifactId>
   <version>1.6.1.RELEASE</version>
  </dependency>
  <dependency>
   <groupId>redis.clients</groupId>
   <artifactId>jedis</artifactId>
   <version>2.7.3</version>
  </dependency>

 </dependencies>
</project>

3.2、spring配置文件application.xml:

<?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:context="http://www.springframework.org/schema/context"
 xmlns:aop="http://www.springframework.org/schema/aop"
 xsi:schemaLocation=" 

http://www.springframework.org/schema/beans

http://www.springframework.org/schema/beans/spring-beans-3.0.xsd

http://www.springframework.org/schema/aop

http://www.springframework.org/schema/aop/spring-aop-3.0.xsd

http://www.springframework.org/schema/context

http://www.springframework.org/schema/context/spring-context-3.0.xsd">

 <!-- 自动扫描注解的bean -->
 <context:component-scan base-package="com.luo.service" />

 <!-- 引入properties配置文件 -->
 <bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
  <property name="locations">
   <list>
    <value>classpath:properties/*.properties</value>
    <!--要是有多个配置文件,只需在这里继续添加即可 -->
   </list>
  </property>
 </bean>

 <!-- jedis 配置 -->
 <bean id="poolConfig" class="redis.clients.jedis.JedisPoolConfig" >
   <property name="maxIdle" value="${redis.maxIdle}" />
   <property name="maxWaitMillis" value="${redis.maxWait}" />
   <property name="testOnBorrow" value="${redis.testOnBorrow}" />
 </bean >

 <!-- redis服务器中心 -->
 <bean id="connectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory" >
   <property name="poolConfig" ref="poolConfig" />
   <property name="port" value="${redis.port}" />
   <property name="hostName" value="${redis.host}" />
   <!-- <property name="password" value="${redis.password}" /> -->
   <property name="timeout" value="${redis.timeout}" ></property>
 </bean >
 <bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate" >
   <property name="connectionFactory" ref="connectionFactory" />
   <property name="keySerializer" >
    <bean class="org.springframework.data.redis.serializer.StringRedisSerializer" />
   </property>
   <property name="valueSerializer" >
    <bean class="org.springframework.data.redis.serializer.JdkSerializationRedisSerializer" />
   </property>
 </bean >

 <!-- cache配置 -->
 <bean id="methodCacheInterceptor" class="com.luo.redis.cache.MethodCacheInterceptor" >
   <property name="redisTemplate" ref="redisTemplate" />
 </bean >

 <!-- aop配置切点跟通知 -->
 <bean id="methodCachePointCut" class="org.springframework.aop.support.RegexpMethodPointcutAdvisor">
  <property name="advice" ref="methodCacheInterceptor"/>
  <property name="pattern" value=".*ServiceImpl.*getTimestamp"/>
 </bean>
 <bean id="redisTestService" class="com.luo.service.impl.RedisTestServiceImpl">
 </bean>
 <bean class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator"/>

</beans>

3.3、Redis配置参数,redis.properties:

#redis中心
#绑定的主机地址
redis.host=127.0.0.1
#指定Redis监听端口,默认端口为6379
redis.port=6379
#授权密码(本例子没有使用)
redis.password=123456
#最大空闲数:空闲链接数大于maxIdle时,将进行回收
redis.maxIdle=100
#最大连接数:能够同时建立的“最大链接个数”
redis.maxActive=300
#最大等待时间:单位ms
redis.maxWait=1000
#使用连接时,检测连接是否成功
redis.testOnBorrow=true
#当客户端闲置多长时间后关闭连接,如果指定为0,表示关闭该功能
redis.timeout=10000

3.4、添加接口及对应实现RedisTestService.Java和RedisTestServiceImpl.java:

package com.luo.service;

public interface RedisTestService {
 public String getTimestamp(String param);
}
package com.luo.service.impl;

import org.springframework.stereotype.Service;
import com.luo.service.RedisTestService;

@Service
public class RedisTestServiceImpl implements RedisTestService {

 public String getTimestamp(String param) {
  Long timestamp = System.currentTimeMillis();
  return timestamp.toString();
 }

}

3.5、本例采用spring aop切面方式进行缓存,配置已在上面spring配置文件中,对应实现为MethodCacheInterceptor.java:

package com.luo.redis.cache;

import java.io.Serializable;
import java.util.concurrent.TimeUnit;
import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.ValueOperations;

public class MethodCacheInterceptor implements MethodInterceptor {

 private RedisTemplate<Serializable, Object> redisTemplate;
 private Long defaultCacheExpireTime = 10l; // 缓存默认的过期时间,这里设置了10秒

 public Object invoke(MethodInvocation invocation) throws Throwable {
  Object value = null;

  String targetName = invocation.getThis().getClass().getName();
  String methodName = invocation.getMethod().getName();

  Object[] arguments = invocation.getArguments();
  String key = getCacheKey(targetName, methodName, arguments);

  try {
   // 判断是否有缓存
   if (exists(key)) {
    return getCache(key);
   }
   // 写入缓存
   value = invocation.proceed();
   if (value != null) {
    final String tkey = key;
    final Object tvalue = value;
    new Thread(new Runnable() {
     public void run() {
      setCache(tkey, tvalue, defaultCacheExpireTime);
     }
    }).start();
   }
  } catch (Exception e) {
   e.printStackTrace();
   if (value == null) {
    return invocation.proceed();
   }
  }
  return value;
 }

 /**
  * 创建缓存key
  *
  * @param targetName
  * @param methodName
  * @param arguments
  */
 private String getCacheKey(String targetName, String methodName,
   Object[] arguments) {
  StringBuffer sbu = new StringBuffer();
  sbu.append(targetName).append("_").append(methodName);
  if ((arguments != null) && (arguments.length != 0)) {
   for (int i = 0; i < arguments.length; i++) {
    sbu.append("_").append(arguments[i]);
   }
  }
  return sbu.toString();
 }

 /**
  * 判断缓存中是否有对应的value
  *
  * @param key
  * @return
  */
 public boolean exists(final String key) {
  return redisTemplate.hasKey(key);
 }

 /**
  * 读取缓存
  *
  * @param key
  * @return
  */
 public Object getCache(final String key) {
  Object result = null;
  ValueOperations<Serializable, Object> operations = redisTemplate
    .opsForValue();
  result = operations.get(key);
  return result;
 }

 /**
  * 写入缓存
  *
  * @param key
  * @param value
  * @return
  */
 public boolean setCache(final String key, Object value, Long expireTime) {
  boolean result = false;
  try {
   ValueOperations<Serializable, Object> operations = redisTemplate
     .opsForValue();
   operations.set(key, value);
   redisTemplate.expire(key, expireTime, TimeUnit.SECONDS);
   result = true;
  } catch (Exception e) {
   e.printStackTrace();
  }
  return result;
 }

 public void setRedisTemplate(
   RedisTemplate<Serializable, Object> redisTemplate) {
  this.redisTemplate = redisTemplate;
 }
}

3.6、单元测试相关类:

package com.luo.baseTest;

import org.junit.runner.RunWith;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.AbstractJUnit4SpringContextTests;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; 

//指定bean注入的配置文件
@ContextConfiguration(locations = { "classpath:application.xml" })
//使用标准的JUnit @RunWith注释来告诉JUnit使用Spring TestRunner
@RunWith(SpringJUnit4ClassRunner.class)
public class SpringTestCase extends AbstractJUnit4SpringContextTests {

}
package com.luo.service;

import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;

import com.luo.baseTest.SpringTestCase;

public class RedisTestServiceTest extends SpringTestCase {

 @Autowired
 private RedisTestService redisTestService;

 @Test
 public void getTimestampTest() throws InterruptedException{
  System.out.println("第一次调用:" + redisTestService.getTimestamp("param"));
  Thread.sleep(2000);
  System.out.println("2秒之后调用:" + redisTestService.getTimestamp("param"));
  Thread.sleep(11000);
  System.out.println("再过11秒之后调用:" + redisTestService.getTimestamp("param"));
 }
}

3.7、运行结果:

四、源码下载:redis-project(jb51.net).rar

以上就是本文的全部内容,希望对大家的学习有所帮助。

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索spring
, 缓存
redis
spring redis缓存注解、spring redis 缓存、spring mvc redis缓存、spring集成redis缓存、spring aop redis缓存,以便于您获取更多的相关知识。

时间: 2024-09-17 08:10:42

windows环境下Redis+Spring缓存实例讲解_Redis的相关文章

Redis+Spring缓存实例(windows环境,附实例源码及详解)

版权声明:本文为博主原创文章,转载注明出处http://blog.csdn.net/u013142781 目录(?)[+] 一.Redis了解 1.1.Redis介绍: redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合).zset(sorted set –有序集合)和hash(哈希类型).这些数据类型都支持push/pop.add/remove及取交集并集和差集及更丰富的操作,而且

Echache整合Spring缓存实例讲解(转)

           林炳文Evankaka原创作品.转载请注明出处http://blog.csdn.net/evankaka              摘要:本文主要介绍了EhCache,并通过整合Spring给出了一个使用实例. 一.EhCache 介绍           EhCache 是一个纯Java的进程内缓存框架,具有快速.精干等特点,是Hibernate中默认的CacheProvider.Ehcache是一种广泛使用的开源Java分布式缓存.主要面向通用缓存,Java EE和轻量

《C语言开发从入门到精通》一2.2 在Windows环境下开发C程序

2.2 在Windows环境下开发C程序 知识点讲解:光盘:视频\PPT讲解(知识点)\第2章\在Windows环境下开发C程序.mp4 DOS环境对广大读者来说十分陌生,并且在DOS下进行开发也十分麻烦.为此,专门推出了Windows环境下的开发工具.Win-TC其实就是一种Windows环境下的开发工具,但是其功能和Turbo C基本类似,只是在编译和运行上更加方便而已.随着计算机技术的发展,编程工具也随之更新换代.目前最受程序员喜爱的开发工具,当属微软的Visual Studio. 2.2

Windows环境下安装Redis体验谈

 Redis 是一个高性能的key-value数据库, 使用内存作为主存储,数据访问速度非常快,当然它也提供了两种机制支持数据持久化存储.比较遗憾的是,Redis项目不直接支持Windows,Windows版项目是由微软开放技术团队建立和维护一个实验性项目(支持32,64位),所以并不适用生产环境,但可在Windows环境下用于开发测试. 1.下载安装 猛戳这里就到了开源首页,下载源码包,解压ZIP包后进入msvsbinrelease文件夹有三个文件分别对应32,64位,windows服务三个版

《精通Android 实例开发》——第1章,第1.4节在Windows环境下安装ADT

1.4 在Windows环境下安装ADT 1.4.1 实例说明Android 为Eclipse定制了一个插件,即Android Development Tools(ADT),这个插件为用户提供一个强大的综合环境用于开发Android应用程序.ADT扩展了Eclipse的功能,可以让用户快速地建立Android项目,创建应用程序界面,在基于Android框架API的基础上添加组件,以及用SDK工具集调试应用程序,甚至导出签名(或未签名)的APKS以便发行应用程序.下面详细介绍安装配置ADT的基本方

《精通Android 实例开发》——第1章,第1.3节在Windows环境下集成安装Eclipse和Android SDK

1.3 在Windows环境下集成安装Eclipse和Android SDK 1.3.1 实例说明Android SDK指的是Android专属的软件开发工具包.与iPhone相似,Android采用WebKit浏览器引擎,具备触摸屏.高级图形显示和上网功能,用户能够在手机上查看电子邮件.搜索网址和观看视频节目等,比iPhone等其他手机更强调搜索功能,界面更强大,可以说是一种融入全部Web应用的单一平台. 1.3.2 具体实现在Android官方公布的最新版本中,已经将Eclipse和Andr

4.windows环境下如何安装memcached教程(转载+自己整理)

 Memcached 是一个开源免费高性能的分布式内存对象缓存系统,能够加快网站访问速度和减轻数据库压力,本文向大家介绍下windows环境下如何安装memcached.百度经验:jingyan.baidu.com 工具/原料 memcached1.4.13百度经验:jingyan.baidu.com 方法/步骤 软件的下载,好像从官网上只能下载未经编译的源码,需要自己编译后才能安装使用,不熟悉的用户还是直接百度搜索下载比较好,这里也提供一个下载地址给大家参考. www.newasp.net

基于Windows环境下的PHP开发环境搭建

相信许多和人和我一样,都非常的喜欢学习PHP编程,同样有很多人因为无法搭建一个基于Windows环境下的PHP开发环境搭建而不得不放弃自己学习PHP的愿望.所以我想就这个问题将自己的心得体会写出来,一是可以帮助那些苦于无法搭建开发环境的人,二是可以让自己也有个总结的机会. 我写这篇文章的目的很简单,就是帮助那些刚刚开始学习PHP的朋友,所以我将尽量以最简单.明确的语言来进行描述,如果您已经就此问题非常熟练,大可以不看本文而去做更有意义的事情. 限于我本人的水平有限,本文难免有错误和不足之处,恳请

ZF2入门:Windows环境下从零开始Zend Framework 2.0 (ZF2)环境搭建

原文:http://avnpc.com/pages/zend-framework-2-installation-for-windows 日志未经声明,均为AlloVince原创.版权采用『 知识共享署名-非商业性使用 2.5 许可协议』进行许可. Zend Framework 2.0 (ZF2)正式发布之后不少朋友都进行了尝试,可能由于ZF2涉及到的新特性比较多,有朋友希望能有一篇从零开始Zend Framework 2.0 (ZF2)的教程,于是就有了本篇日志. 以下将记录在Windows环境