前言
由于最近换(mang)了(de)家(yi)公(bi)司接触了新的东西所以很久没有更新了。
这次谈谈Redis,关于Redis
应该很多朋友就算没有用过也听过,算是这几年最流行的NoSql
之一了。
Redis
的应用场景非常多这里就不一一列举了,这次就以一个最简单的也最常用的 缓存数据 来举例。
先来看一张效果图:
作用就是在每次查询接口的时候首先判断Redis
中是否有缓存,有的话就读取,没有就查询数据库并保存到Redis
中,下次再查询的话就会直接从缓存中读取了。
Redis
中的结果:
之后查询redis发现确实是存进来了。
Redis安装与使用
首先第一步自然是安装Redis
。我是在我VPS
上进行安装的,操作系统是CentOS6.5
。
-
下载Redishttps://redis.io/download,我机器上安装的是
3.2.5
-
将下载下来的’reidis-3.2.5-tar.gz’上传到
usr/local
这个目录进行解压。 -
编译安装
12makemake install -
修改
redis.conf
配置文件。
这里我只是简单的加上密码而已。
|
|
- 启动Redis
启动时候要选择我们之前修改的配置文件才能使配置文件生效。
|
|
- 登陆redis
1./redis-cli -a 你的密码
Spring整合Redis
这里我就直接开始用Spring整合毕竟在实际使用中都是和Spring
一起使用的。
- 修改
Spring
配置文件
加入以下内容:12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970<!-- 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.crossoverJie.intercept.MethodCacheInterceptor"><property name="redisUtil" ref="redisUtil"/></bean><bean id="redisUtil" class="com.crossoverJie.util.RedisUtil"><property name="redisTemplate" ref="redisTemplate"/></bean><!--配置切面拦截方法 --><aop:config proxy-target-class="true"><!--将com.crossoverJie.service包下的所有select开头的方法加入拦截去掉select则加入所有方法w--><aop:pointcut id="controllerMethodPointcut" expression="execution(* com.crossoverJie.service.*.select*(..))"/><aop:pointcut id="selectMethodPointcut" expression="execution(* com.crossoverJie.dao..*Mapper.select*(..))"/><aop:advisor advice-ref="methodCacheInterceptor" pointcut-ref="controllerMethodPointcut"/></aop:config>```更多的配置可以直接在源码里面查看:[https://github.com/crossoverJie/SSM/blob/master/src/main/resources/spring-mybatis.xml](https://github.com/crossoverJie/SSM/blob/master/src/main/resources/spring-mybatis.xml)。以上都写有注释,也都是一些简单的配置相信都能看懂。下面我会着重说下如何配置缓存的。# Spring切面使用缓存Spring的`AOP`真是是一个好东西,还不太清楚是什么的同学建议先自行`Google`下吧。在不使用切面的时候如果我们想给某个方法加入缓存的话肯定是在方法返回之前就要加入相应的逻辑判断,只有一个或几个倒还好,如果有几十上百个的话那GG了,而且维护起来也特别麻烦。> 好在Spring的AOP可以帮我们解决这个问题。> 这次就在我们需要加入缓存方法的切面加入这个逻辑,并且只需要一个配置即可搞定,就是上文中所提到的配置文件,如下:```xml<!--配置切面拦截方法 --><aop:config proxy-target-class="true"><!--将com.crossoverJie.service包下的所有select开头的方法加入拦截去掉select则加入所有方法w--><aop:pointcut id="controllerMethodPointcut" expression="execution(* com.crossoverJie.service.*.select*(..))"/><aop:pointcut id="selectMethodPointcut" expression="execution(* com.crossoverJie.dao..*Mapper.select*(..))"/><aop:advisor advice-ref="methodCacheInterceptor" pointcut-ref="controllerMethodPointcut"/></aop:config>
这里我们使用表达式execution(* com.crossoverJie.service.*.select*(..))
来拦截service
中所有以select
开头的方法。这样只要我们要将加入的缓存的方法以select命名开头的话每次进入方法之前都会进入我们自定义的MethodCacheInterceptor
拦截器。
这里贴一下MethodCacheInterceptor
中处理逻辑的核心方法:
|
|
- 先是查看了当前方法是否在我们自定义的方法中,如果不是的话就直接返回,不进入拦截器。
- 之后利用反射获取的类名、方法名、参数生成
redis
的key
。 - 用key在redis中查询是否已经有缓存。
- 有缓存就直接返回缓存内容,不再继续查询数据库。
- 如果没有缓存就查询数据库并将返回信息加入到redis中。
使用PageHelper
这次为了分页方便使用了比较流行的PageHelper
来帮我们更简单的进行分页。
首先是新增一个mybatis的配置文件mybatis-config
:
|
|
接着在mybatis的配置文件中引入次配置文件:
|
|
接着在service方法中:
|
|
只需要使用PageHelper.startPage(pageNum, pageSize);
方法就可以帮我们简单的分页了。
这里我自定义了一个分页工具类PageEntity
来更方便的帮我们在之后生成JSON
数据。
|
|
更多PageHelper
的使用请查看一下链接:
https://github.com/pagehelper/Mybatis-PageHelper
前端联调
接下来看下控制层RedisController
:
|
|
这里就不做过多解释了,就是从redis或者是service中查询出数据并返回。
前端的显示界面在https://github.com/crossoverJie/SSM/blob/master/src/main/webapp/redis/showRedis.jsp中(并不是前端,将就看)。
其中核心的redis_list.js
的代码如下:
|
|
其实就是一个简单的请求接口,并根据返回数据动态生成Dom
而已。
总结
以上就是一个简单的redis
的应用。
redis的应用场景还非常的多,比如现在我所在做的一个项目就有用来处理短信验证码的业务场景,之后有时间可以写一个demo。