阅读 131

在Spring Boot 2.0中使用Spring Data Redis编写自定义查询

简单的介绍

· Redis(远程字典服务器)是一个内存数据结构项目,实现了具有可选持久性的分布式内存键值数据库。Redis支持各种抽象数据结构,例如字符串、列表、映射、集合、排序集合、HyperLogLogs、流和空间索引。

· Spring Boot是Spring的基于约定的配置解决方案,用于创建可以“运行”的独立的、生产级的基于Spring的应用程序。它是由Spring团队针对最佳配置以及Spring平台和第三方库的最佳使用的“意见视图”预先配置的。大多数Spring Boot应用程序只需要很少的Spring配置。

· Spring的数据访问框架解决了开发人员在应用程序中使用数据库时遇到的常见困难。提供了对Java中所有流行数据访问框架的支持:JDBC,iBatis / MyBatis,Hibernate,Java数据对象(JDO),Java持久性API(JPA),Oracle TopLink,Apache OJB和Apache Cayenne等。

下载并安装Redis

·对于Linux,您可以从此处轻松下载最新版本(5.0)。

·如果您使用Windows 10,则可以受益于Docker映像,可从此处访问。

然后运行它:

$ docker run -d  --name redis -p  6379:6379 redis复制代码

6379是默认端口,您可以将其更改为所需的任何端口。

·如果使用Windows 7,则只能使用Redis 4.0版及以下版本,但不能使用最新版本(5.0)。可从此处下载Redis版本4.0.2的.msi和zip文件。

安装.msi版本后,您将看到redis-server和redis-cli,它们将分别运行Redis的服务器和客户端模块。

开启Spring Boot项目

如果您使用maven来启动一个新的Spring Boot项目,只需要一个pom.xml,如下所示:

<?xml version="1.0" encoding="UTF-8"?><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 https://maven.apache.org/xsd/maven-4.0.0.xsd">    <modelVersion>4.0.0</modelVersion>    <groupId>org.springframework</groupId>    <artifactId>gs-spring-boot</artifactId>    <version>0.1.0</version>    <parent>        <groupId>org.springframework.boot</groupId>        <artifactId>spring-boot-starter-parent</artifactId>        <version>2.1.6.RELEASE</version>    </parent>    <dependencies>        <dependency>            <groupId>org.springframework.boot</groupId>            <artifactId>spring-boot-starter-web</artifactId>        </dependency>    </dependencies>    <properties>        <java.version>1.8</java.version>    </properties>    <build>        <plugins>            <plugin>                <groupId>org.springframework.boot</groupId>                <artifactId>spring-boot-maven-plugin</artifactId>            </plugin>        </plugins>    </build></project>复制代码

对于清晰的代码,我建议使用Lombok。有关更多信息,请参见this

<dependency>   <groupId>org.projectlombok</groupId>   <artifactId>lombok</artifactId>   <version>1.18.0</version>   <optional>true</optional></dependency>复制代码

准备Redis项目

将Spring Boot项目连接到Redis的一种简单方法是使用Spring Data Redis,因此我们需要将其添加到pom.xml中:

<dependency>   <groupId>org.springframework.boot</groupId>   <artifactId>spring-boot-starter-data-redis</artifactId></dependency>复制代码

我们有两种选择作为连接器:

1. Lettuce

2. Jedis

如果您选择Lettuce,则不需要向Maven添加任何其他依赖项,因为默认情况下,Spring Data使用该依赖项,并且该依赖项已嵌入到上述依赖项中。因此,我们选择更简单的方法。

为了启用Spring Data Redis存储库,我们需要有一个配置类,必须使用@Configuration和@EnableRedisRepositories进行注释。

在此类中,我们必须声明RedisTemplate bean,该CRUD存储库将其用于与Redis集成。我们还将使用它来执行自定义查询。

您可以轻松地使用LettuceConnectionFactory()创建factory,或者如果您想要进行其他配置(例如选择服务器地址和端口),则必须使用RedisStandaloneConfiguration(),如下所示:

@Beanpublic LettuceConnectionFactory redisConnectionFactory() {    RedisStandaloneConfiguration redisStandaloneConfiguration = new RedisStandaloneConfiguration(hostName, port);    return new LettuceConnectionFactory(redisStandaloneConfiguration);}复制代码

创建restTemplate时,可以配置序列化和反序列化,为此我们使用JdkSerializationRedisSerializer:

@Beanpublic RedisTemplate<?, ?> redisTemplate() {    RedisTemplate<String, Object> template = new RedisTemplate<>();    RedisSerializer<String> stringSerializer = new StringRedisSerializer();    JdkSerializationRedisSerializer jdkSerializationRedisSerializer = new JdkSerializationRedisSerializer();    template.setConnectionFactory(redisConnectionFactory());    template.setKeySerializer(stringSerializer);    template.setHashKeySerializer(stringSerializer);    template.setValueSerializer(jdkSerializationRedisSerializer);    template.setHashValueSerializer(jdkSerializationRedisSerializer);    template.setEnableTransactionSupport(true);    template.afterPropertiesSet();    return template;}复制代码

实施DAO

首先,我们需要创建一些实体类,这些实体类将映射到Redis数据结构。为此,我们需要使用
@RedisHash注释类。

另外,为了定义id字段,我们使用@Id。如果要索引除id以外的其他某些字段,则可以使用@Indexed对其进行注释,该索引也可以是list或map。

@Data@NoArgsConstructor@RedisHash("User")public class User implements Serializable{    @Id    private Long id;    private String name;    private String surname;    private String age;    public User(Long id, String name, String surname, String age) {        this.id = id;        this.name = name;        this.surname = surname;        this.age = age;    }}复制代码

实施仓库

Spring Data已经为我们实现了CRUD方法。我们只需创建扩展CrudRepository的接口即可轻松使用它们。

通过使用Spring Data的此功能,我们还可以声明比findById()或Save()更复杂的查询。

支持的关键字列表在这里:


如果您想拥有更多的自定义查询,则可以使用redisTemplate自己完成,如下所示:

@Repositorypublic class UserDaoImpl implements UserDao {    @Autowired    UserRepository userRepository;    @Autowired    RedisTemplate redisTemplate;    private static final String KEY = "user";    public Boolean saveRule(User user) {        try {            Map ruleHash = new ObjectMapper().convertValue(user, Map.class);            redisTemplate.opsForHash().put(KEY, user.getName(), ruleHash);            return true;        } catch (Exception e) {            e.printStackTrace();            return false;        }    }    public User findByName(String name) {        Map userMap = (Map) redisTemplate.opsForHash().get(KEY, name);        User user = new ObjectMapper().convertValue(userMap, User.class);        return user;    }}复制代码

当然,我们的控制器是这样的:

@RestController@RequestMapping("/api")public class UserController {    @Autowired    AuthorizationService authorizationService;    @RequestMapping(value = "/addUser", method = RequestMethod.POST)    public ResponseEntity<String> addUser(@RequestBody User User) {        ModelMapper modelMapper = new ModelMapper();        User user = modelMapper.map(User, User.class);        Boolean result = authorizationService.saveRule(user);        if (result) {            return ResponseEntity.ok("A new user is saved!!!");        } else {            return ResponseEntity.ok("An error occured!!!");        }    }    @RequestMapping(value = "/findUser", method = RequestMethod.POST)    public ResponseEntity<User> findUser(@RequestBody User User) {        ModelMapper modelMapper = new ModelMapper();        User user = modelMapper.map(User, User.class);        User result = authorizationService.findByName(user.getName());        return ResponseEntity.ok(result);   }    复制代码

本人创业团队产品MadPecker,主要做BUG管理、测试管理、应用分发
网址:www.madpecker.com,有需要的朋友欢迎试用、体验!
本文为MadPecker团队译制,转载请标明出处