在Spring Boot 2.0中使用Spring Data Redis編寫自定義查詢

簡單的介紹

· Redis(遠程字典服務器)是一個內存數據結構項目,實現了具備可選持久性的分佈式內存鍵值數據庫。Redis支持各類抽象數據結構,例如字符串、列表、映射、集合、排序集合、HyperLogLogs、流和空間索引。java

· Spring Boot是Spring的基於約定的配置解決方案,用於建立能夠「運行」的獨立的、生產級的基於Spring的應用程序。它是由Spring團隊針對最佳配置以及Spring平臺和第三方庫的最佳使用的「意見視圖」預先配置的。大多數Spring Boot應用程序只須要不多的Spring配置。web

· Spring的數據訪問框架解決了開發人員在應用程序中使用數據庫時遇到的常見困難。提供了對Java中全部流行數據訪問框架的支持:JDBC,iBatis / MyBatis,Hibernate,Java數據對象(JDO),Java持久性API(JPA),Oracle TopLink,Apache OJB和Apache Cayenne等。redis

下載並安裝 Redis

·對於Linux,您能夠今後處輕鬆下載最新版本(5.0)。spring

·若是您使用Windows 10,則能夠受益於Docker映像,可今後處訪問。docker

而後運行它:

$ docker run -d  --name redis -p  6379:6379 redis複製代碼

6379是默認端口,您能夠將其更改成所需的任何端口。數據庫

·若是使用Windows 7,則只能使用Redis 4.0版及如下版本,但不能使用最新版本(5.0)。可今後處下載Redis版本4.0.2的.msi和zip文件。apache

安裝.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. Lettuceapi

2. Jedisbash

若是您選擇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團隊譯製,轉載請標明出處

相關文章
相關標籤/搜索