天天看点

《深入实践Spring Boot》一2.2 使用Redis

本节书摘来自华章出版社《深入实践spring boot》一书中的第2章,第2.2节,作者陈韶健,更多章节内容可以访问云栖社区“华章计算机”公众号查看。

关系型数据库在性能上总是存在一些这样那样的缺陷,所以大家有时候在使用传统关系型数据库时,会与具有高效存取功能的缓存系统结合使用,以提高系统的访问性能。在很多流行的缓存系统中,redis是一个不错的选择。redis是一种可以持久存储的缓存系统,是一个高性能的key-value数据库,它使用键-值对的方式来存储数据。

需要使用redis,可在工程的maven配置中加入spring-boot-starter-redis依赖,如代码清单2-9所示。其中gson是用来转换json数据格式的工具,mysql是引用了上一节的模块,这里使用2.1节定义的实体对象来存取数据,演示在redis中的存取操作。

代码清单2-9 redis模块的maven依赖配置

redis提供了下列几种数据类型可供存取:

string;

hash;

list;

set及zset。

在实例中,将使用string即字符串的类型来演示数据的存取操作。对于redis,spring boot没有提供像jpa那样相应的资源库接口,所以只能仿照上一节中repository的定义编写一个实体user的服务类,如代码清单2-10所示。这个服务类可以存取对象user以及由user组成的列表list,同时还提供了一个删除的方法。所有这些方法都是使用redistemplate来实现的。

代码清单2-10 用户实体的redis服务类

@repository

public class userredis {

minutes);

}

redis没有表结构的概念,所以要实现mysql数据库中表的数据(即普通java对象映射的实体数据)在redis中存取,必须做一些转换,使用json格式的文本作为redis与java普通对象互相交换数据的存储格式。这里使用gson工具将类对象转换为json格式的文本进行存储,要取出数据时,再将json文本数据转化为java对象。

因为redis使用了key-value的方式存储数据,所以存入时要生成一个唯一的key,而要查询或者删除数据时,就可以使用这个唯一的key进行相应的操作。

保存在redis数据库中的数据默认是永久存储的,可以指定一个时限来确定数据的生命周期,超过指定时限的数据将被redis自动清除。在代码清单2-10中我们以分钟为单位设定了数据的存储期限。

另外,为了能正确调用redistemplate,必须对其进行一些初始化工作,即主要对它存取的字符串进行一个json格式的系列化初始配置,如代码清单2-11所示。

代码清单2-11 redistemplate初始化

@configuration

public class redisconfig {

如果还没有安装redis服务器,可以参照本书附录c提供的方法安装,然后在工程的配置文件application.yml中配置连接redis服务器等参数,如代码清单2-12所示。其中host和port分别表示redis数据库服务器的ip地址和开放端口,database可以不用指定,由redis根据存储情况自动选定(注:测试时这些配置是集成在一个配置类中实现的)。

代码清单2-12 redis配置

spring:

现在编写一个juint测试程序,来演示如何在redis服务器中存取数据,如代码清单2-13所示。测试程序创建一个部门对象并将其命名为“开发部”,创建一个角色对象并把它命名为admin,创建一个用户对象并把它命名为user,同时设定这个用户属于“开发部”,并把admin这个角色分配给这个用户。接着测试程序使用类名等参数生成一个key,并使用这个key清空原来的数据,然后用这个key存储现在这个用户的数据,最后使用这个key查询用户,并将查到的信息打印出来。

代码清单2-13 redis测试程序

要运行这个测试程序,可以在idea的run/debug conf?iguration配置中增加一个juint配置项目,模块选择redis,工作目录选择模块所在的根目录,类选择这个测试程序即dbdemo.redis.test.redistest,并将配置保存为redistest。

使用debug方式运行测试项目redistest。如果测试通过,会输出一个用户的用户名、所属部门和拥有角色等简要信息,如下所示:

dbdemo.redis.test.redistest - ======user====== name:user, deparment:开发部, role:admin

对于redis的使用,还可以将注解方式与调用数据库的方法相结合,那样就不用再编写像上面那样的服务类,并且使用起来更加简单,这将在后面的章节中介绍。