在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團隊譯製,轉載請標明出處

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章