成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

如何使用Redis作為關系數據庫

數據庫
下面是一個Spring應用程序小案例,分別使用Mysql和Redis作為數據庫。在數據庫中存儲的是一個包含內部聯接的關系數據庫對象。

Redis可以用作關系數據庫嗎?

相信大多數人在使用Redis時都把它作為服務的緩存。而在Java + Spring中使用Redis有卻可以實現關系數據庫的功能。

要在Redis中實現這一點,首先,我們需要在Redis中安裝插件,包括:RedisJSON和RediSearch。其中RedisJSON允許我們以JSON格式存儲對象,RediSearch允許我們通過對象的任何字段進行搜索,甚至是嵌套字段。

為了在java端使用Redis,可以選擇Spring Data JPA,使用優秀的Redis OM Spring庫(https://github.com/redis/redis-om-spring),它允許我們使用數據庫的抽象。Redis OM Spring擁有Spring和Jedis使用數據庫所需的所有依賴。

下面是一個Spring應用程序小案例,分別使用Mysql和Redis作為數據庫。在數據庫中存儲的是一個包含內部聯接的關系數據庫對象。

實現案例

我們假設需要將一個名為"downtime"(停機記錄)的實體寫入數據庫。在這個實體中,添加了其他對象,如"place"(位置)、"reason"(原因)等。

關系數據庫的實體:

Mysql ,Java對象:


@Entity
@Table(schema = "test", name = "downtime")
public class Downtime {


    @Id
    private String id;
    private LocalDateTime beginDate;
    private LocalDateTime endDate;
    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "area")
    private Place area;
    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "cause")
    private Cause cause;
    ...

Redis,Java對象:

@Document
public class DowntimeDoc {
    @Id
    @Indexed
    private String id;
    @Indexed
    private LocalDateTime beginDate;
    private LocalDateTime endDate;
    @Indexed
    private PlaceDoc area;
    @Indexed
    private CauseDoc cause;
    ....

在上面的例子中,我們使用@Entity代替@Document。這個注解表示對象是一個實體。它將存儲在關鍵字為 “包路徑+類名+ Idx”的數據庫中。

添加@Indexed注解的字段將被建立索引以供搜索。如果不指定此注釋,則這個字段將只是保存在數據庫中,而搜索該字段將返回空結果。所以,我們可以根據需要添加此注釋。數據庫中已存在的數據將被異步執行建立索引。

接下來,創建一個java庫(repository),用于從數據庫中獲取數據。

Mysql,Java示例:

public interface DowntimeRepository extends JpaRepository<Downtime, String> {

}

Redis,Java示例:

public interface DowntimeRedisRepository extends RedisDocumentRepository<DowntimeDoc, String> {

}

以上Redis示例的不同之處在于它從RedisDocumentRepository接口擴展,這實現了Spring的標準CRUD接口。

Let's add a method to find the first downtime for the reason we specified.

接下來添加一個方法,通過cause(原因)查找第一個downtime。

Mysql,Java示例:

public interface DowntimeRepository extends JpaRepository<Downtime, String> {

    Downtime findFirstByCauseIdOrderByBeginDate(String causeId);
}

Redis,Java示例:

public interface DowntimeRedisRepository extends RedisDocumentRepository<DowntimeDoc, String> {

    DowntimeDoc findTopByCause_IdOrderByBeginDateAsc(String causeId);

}

 我們注意到,如果通過抽象來編寫數據庫操作的Java代碼,幾乎沒有什么差異。此外,Redis OM Spring允許我們使用@Query注解自定義查詢語句,實現起來就像Spring Data JPA中的那樣。

下面是一個HQL查詢的示例:

Mysql,Java示例:

@Query("SELECT d FROM Downtime d" +
        " JOIN FETCH d.area " +
        " JOIN FETCH d.cause" +
        " JOIN FETCH d.fixer" +
        " JOIN FETCH d.area.level " +
        " WHERE d.area IN ?1 AND (d.beginDate BETWEEN ?2 AND ?3 OR d.cause IN ?4) ")
List<Downtime> findAllByParams(List<Place> workPlace, LocalDateTime start, LocalDateTime end, List<Cause> causes);

Redis,Java示例: 

@Query("(@area_id:{$areas} ) & (@beginDate:[$start $end] | @cause_id:{$causes})")
Page<DowntimeDoc> findByParams(@Param("areas") List<String> areas,
                               @Param("start") long start,
                               @Param("end") long end,
                               @Param("causes") List<String> causes, Pageable pageable);

在Redis的例子中,我們只是簡單地指定了“WHERE”部分的條件。無需指出需要附加哪些字段,這是因為它總是從指定的Redis庫中提取數據。但是,我們不能調出所有字段,而是通過“returnFields”參數指定我們需要哪些字段,還可以指定排序、Limit和Offset。在HQL中并沒有這些功能的。在這個例子中,還傳遞了一個Pageable參數,這個參數將在數據庫級別執行,使得數據庫不用將所有數據拉入應用程序。這一點和Hibernate不同,hibernate實在應用程序中進行修剪。

另外,Redis OM Spring 類似于Stream API,允許我們使用EntityStream編寫查詢。

下面是使用EntityStream查詢的示例。

…
entityStream
        .of(DowntimeDoc.class)
        .filter(DowntimeDoc$.AREA_ID.in(filter.getWorkPlace().toArray(String[]::new)))
        .filter(between + " | " + causes)
        .map(mapper::toEntity)
        .collect(Collectors.toList());

在這個例子中,我使用了元模型的過濾器,將字符串參數傳遞給第二個過濾器,以表示兩個過濾選項都有效。EntityStream接受一組中間操作,并在調用時執行這一組操作。

使用Redis OM Spring的一些注意事項

無法使用UUID作為主鍵。可以將UUID作為字符串賦值給指定字段,并將其加入索引。但是在搜索時,你需要轉義空格

{2e5af82m\-02af\-553b\-7961\-168878aa521е}

另外,如果在RedisDocumentRepository中進行搜索,不會起作用,因為代碼中有這樣一個表達式:

String regex = "(\\$" + key + ")(\\W+|\\*|\\+)(.*)";

因此,為了通過這些字段進行搜索,您必須直接在RediSearch中編寫查詢。

在通過RedisDocumentRepository方法搜索時,如果希望返回一個集合,那么必須傳遞一個Pageable,指定行的大小或在@Query中指定大小;否則,最多返回10條記錄。

方法FT.SEARCH (@Query)只支持一個排序。這可以通過編寫FT.AGGREGATE (@Aggregation)查詢來解決。

總之

以上是使用Redis存儲、搜索一個帶有嵌套對象的。通過Repository抽象來處理數據,和Spring Data JPA沒有太大區別,特別是使用一些簡單的函數,如:save、delete、findAllBy,以及通過方法名稱進行查詢等等。

責任編輯:趙寧寧 來源: andflow
相關推薦

2011-10-11 17:07:12

數據庫Internet文件數據庫

2023-10-16 13:26:00

RDBMS關系數據庫

2009-07-10 09:28:41

NoSQL關系數據庫

2023-01-06 08:00:00

關系數據庫數據庫機器學習

2024-06-26 19:14:53

2018-10-15 13:57:38

Hadoop數據庫MySQL

2020-03-14 16:37:09

數據庫IT技術

2023-05-22 11:20:27

數據庫MySQL關系數據

2009-03-26 11:10:13

關系數據庫關系型數據庫數據庫

2018-04-12 12:45:02

數據庫MySQL構建架構

2011-07-18 09:54:47

云計算分片關系數據庫關系數據庫

2010-09-15 14:09:01

GraphDataba

2011-08-15 10:02:02

LEIDomino附件關系數據庫

2011-03-15 14:54:08

NoSQL

2009-03-03 09:54:41

云計算關系數據庫數據庫

2020-03-04 10:05:33

關系數據庫居住權

2011-09-27 13:41:09

數據庫

2009-10-29 11:01:52

Amazon RDSMySQL關系數據庫

2023-08-01 14:35:00

關系數據庫排列

2011-05-19 10:29:40

對象數據庫關系數據庫
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 午夜天堂精品久久久久 | 欧美日韩精品国产 | 精精国产xxxx视频在线 | 免费在线性爱视频 | 在线日韩中文字幕 | www午夜视频 | 成人在线一区二区三区 | 久久久在线视频 | 亚洲精品一二区 | 久久久一区二区三区 | 午夜影院在线观看视频 | 伊人99| 久草网址| 18gay男同69亚洲网站 | 亚洲在线免费 | 国产精品影视在线观看 | 日韩一级免费电影 | 国产在线一区二区 | 久草在线在线精品观看 | 成人在线精品视频 | 国产一区91精品张津瑜 | 国产亚洲精品美女久久久久久久久久 | 成人伊人网 | 久久国产精品一区二区三区 | 欧美成人猛片aaaaaaa | www.国产日本 | 国产精品1区2区3区 男女啪啪高潮无遮挡免费动态 | 男人天堂网址 | 欧美一级片a| 黄色一级片视频 | 久久中文网 | 91中文字幕在线观看 | 国产精品一区二区av | 黄频免费| 99精品国自产在线 | 中文字幕91 | 亚洲欧洲成人在线 | 日韩av在线中文字幕 | 综合久久亚洲 | 国产精品性做久久久久久 | 日本视频中文字幕 |