什么是Redis?
“Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。从2010年3月15日起,Redis的开发工作由VMware主持。从2013年5月开始,Redis的开发由Pivotal赞助。”
上面的这段对redis的描述来自百度词条。个人理解,redis就是一个键值对类型的数据库,暂时先理解这点就够。至于redis原理实现,那些后续我们慢慢一起探究,我们先从实战的角度来看,SSM框架本身就引入了MyBatis作为架构的持久层,redis整合到ssm框架后要承担什么角色?下面我们从一个实际案例来一起讨论redis整合到ssm框架中的意义:
一个接口日常的访问次数是每日10万次左右,而这个接口主要的功能是从数据库获取用户需要的数据(更新频率较低)拼装成一定格式返回给客户端。这正常流程是:用户请求接口→接口调用数据库查询→数据库返回结果→接口返回响应结果。这样的话对数据库的读取操作就很频繁,对数据库的压力就会很大,这时我们就需要引入缓存。将已经查询到结果交给redis去管理,没有的数据再去数据库读取出来交给redis管理,而新增、更新或删除的依旧交给Mybatis操作,必要的时候刷新redis。当然,这部分的功能很多spring-data-redis都帮我们封装好了,下面我们就自己来实践一遍吧。
Redis安装
使用redis首先要先安装个redis的服务器,可以从https://redis.io/下载,目前redis的最新版本是4.0.6版本。
下载下来的是一个redis-4.0.6.tar.gz的压缩包,解压它得到一个文件夹,里面有17个文件或文件夹。
但这还没完,你可以把这个文件夹拷贝到你想放的位置,然后打开terminal切换到你刚放的文件夹的那个路径下,输入:
make
然后等待即可了,下面熟悉下redis常用的几个指令
1)启动redis
src/redis-server
2)进入命令行客户端
src/redis-cli
3)设置一个键值
redis> set key value
4)获取一个键值
redis> get key
下面我们就将redis服务器打开src/redis-server
,继续我们的整合吧。
SSM整合Redis
首先,还是基于上一篇文章最后的成果上进行整合。在pom.xml声明依赖的jar包。
<!-- redis -->
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.4.2</version>
</dependency>
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-redis</artifactId>
<version>1.4.0.RELEASE</version>
</dependency>
然后在src/main/resources目录下配置redis连接信息redis.properties。
redis.host={redis服务器地址}
redis.port={redis服务器端口号}
redis.maxIdle=2000
redis.maxActive=60000
redis.maxWait=1000
redis.testOnBorrow=true
redis.timeout=100000
redis.password={redis服务器密码}
defaultCacheExpireTime=60
接着在spring-context.xml中添加redis的配置,但是这边会用到2个类,用来解决RedisCache.jedisConnectionFactory静态注入的问题,这里先实现下,建议在原本的目录结构下新建个utils的package存放这类文件。
public class RedisCache implements Cache {
private static final Logger logger = LoggerFactory.getLogger(RedisCache.class);
private static JedisConnectionFactory jedisConnectionFactory;
private final String id;
private final ReadWriteLock readWriteLock = new ReentrantReadWriteLock();
public RedisCache(final String id) {
if (id ==