Heim  >  Artikel  >  Datenbank  >  Detaillierte Beispiele, wie Redis Schnittmenge, Vereinigung und Ergänzung von Daten implementiert

Detaillierte Beispiele, wie Redis Schnittmenge, Vereinigung und Ergänzung von Daten implementiert

WBOY
WBOYnach vorne
2022-06-02 12:01:452709Durchsuche

Dieser Artikel vermittelt Ihnen relevantes Wissen über Redis, das hauptsächlich verwandte Probleme zur Realisierung der Schnittmenge, Vereinigung und Komplementierung von Daten vorstellt. Wenn alle Berechnungen im JVM-Speicher ausgeführt werden, kann es leicht zu Speicherproblemen kommen Ich hoffe, dass die OOM-Ausnahme aufgrund von unzureichendem Speicherplatz für alle hilfreich ist.

Detaillierte Beispiele, wie Redis Schnittmenge, Vereinigung und Ergänzung von Daten implementiert

Empfohlenes Lernen: Redis-Video-Tutorial

Szenenbeschreibung

Heute haben wir mehrere Textdateien lokal und jede Datei speichert viele 32-Bit-Zeichenfolgen als eindeutige Kennung Wenn wir jeden Tag eine sehr große Anzahl von Benutzern haben, müssen wir möglicherweise eine Schnitt-, Vereinigungs- oder Komplementverarbeitung für diese Benutzer durchführen. Die einfachste Methode besteht darin, Operationen durchzuführen Sammlungen in Java, z. B. die Verwendung von HashSet zum Ausführen einiger entsprechender Vorgänge. Bei solchen Vorgängen gibt es jedoch eine Einschränkung, das heißt, dass wir während der Ausführung der JVM im Allgemeinen nur über einen begrenzten Anfangsspeicher verfügen OOM-Ausnahmen können leicht durch unzureichenden Speicherplatz verursacht werden. Deshalb stellen wir heute eine skalierbarere Methode zur Durchführung solcher Schnitt- und Komplementoperationen vor: Implementierung von Daten über Redis. Umgebungsbeschreibung Redis-Version: Redis 6.0.6. Jedis-Version: 4.2.2 und Komplementberechnung


    Initialisierungskonstanten
  • <dependencies>
            <dependency>
                <groupId>redis.clients</groupId>
                <artifactId>jedis</artifactId>
                <version>4.2.2</version>
            </dependency>
    
            <dependency>
                <groupId>cn.hutool</groupId>
                <artifactId>hutool-all</artifactId>
                <version>5.8.0.M3</version>
            </dependency></dependencies>
  • Daten in der angegebenen Datei initialisieren

    public class RedisCalculateUtils {
        static String oneFileString = "/Users/tmp/test-1.txt";
        static String twoFileString = "/Users/tmp/test-2.txt";
    
        static String diffFileString = "/Users/tmp/diff-test.txt";
    
        static String interFileString = "/Users/tmp/inter-test.txt";
    
        static String unionFileString = "/Users/tmp/union-test.txt";
    
        static String oneFileCacheKey = "oneFile";
    
        static String twoFileCacheKey = "twoFile";
    
        static String diffFileCacheKey = "diffFile";
    
        static String interFileCacheKey = "interFile";
    
        static String unionFileCacheKey = "unionFile";
        }
  • Geben Sie die Datei an, die in Redis geschrieben werden soll rreee

    Differenzsatzberechnungsergebnisse werden geschrieben Die angegebene Datei
  • /**
    * 初始化数据并写入文件中
    */public static void writeFile() {
            File oneFile = new File(oneFileString);
            List<String> fs = new ArrayList<>(10000);
            for (int i = 10000; i < 15000; i++) {
                String s = SecureUtil.md5(String.valueOf(i));
                fs.add(s);
            }
    
            FileUtil.writeUtf8Lines(fs, oneFile);
    
            File twoFile = new File(twoFileString);
            fs.clear();
            for (int i = 12000; i < 20000; i++) {
                String s = SecureUtil.md5(String.valueOf(i));
                fs.add(s);
            }
    
            FileUtil.writeUtf8Lines(fs, twoFile);
        }

  • Redis-Befehlsbeschreibung

SDIFFSTORE-Zielschlüssel [Schlüssel …]


Beispiel:
/**
* 读取文件数据并写入Redis
*/public static void writeCache() {
    try(Jedis jedis = new Jedis("127.0.0.1", 6379)) {
        Pipeline p = jedis.pipelined();
        List<String> oneFileStringList = FileUtil.readLines(oneFileString, "UTF-8");

        for (String s : oneFileStringList) {
            p.sadd(oneFileCacheKey, s);
        }
        p.sync();

        List<String> twoFileStringList = FileUtil.readLines(twoFileString, "UTF-8");

        for (String s : twoFileStringList) {
            p.sadd(twoFileCacheKey, s);
        }
        p.sync();

    } catch (Exception e) {
        throw new RuntimeException(e);
    }}
SDIFFSTORE-Befehl ähnelt SDIFF. Der Unterschied besteht darin, dass er die Ergebnisse in der Zielsammlung speichert und das Ergebnis zurückgibt auf den Client eingestellt.


Wenn die Zielsammlung bereits vorhanden ist, überschreiben Sie sie.

Rückgabewert

Anzahl der Mitglieder im Ergebnissatz


SINTERSTORE-Zielschlüssel [Schlüssel …]

Beispiel:

    /**
     * oneKey对应的Set 与 twoKey对应的Set 的差集 并写入 threeKey
     * @param oneKey 差集前面的集合Key
     * @param twoKey 差集后面的集合Key
     * @param threeKey 差集结果的集合Key
     */
    public static void diff(String oneKey, String twoKey, String threeKey) {
        try(Jedis jedis = new Jedis("127.0.0.1", 6379)) {
            long result = jedis.sdiffstore(threeKey, oneKey, twoKey);
            System.out.println("oneKey 与 twoKey 的差集的个数:" + result);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

Der SINTERSTORE-Befehl ähnelt dem SINTER-Befehl, außer dass er nicht direkt zurückgibt die Ergebnismenge, aber das Ergebnis wird in der Zielsammlung gespeichert. Wenn die Zielsammlung vorhanden ist, wird sie überschrieben.


Rückgabewert Die Anzahl der Mitglieder im Ergebnissatz

SUNIONSTORE-Zielschlüssel [Schlüssel …]


Beispiel:
    /**
     * 将计算的差集数据写入到指定文件
     */
    public static void writeDiffToFile() {
        File diffFile = new File(diffFileString);
        try(Jedis jedis = new Jedis("127.0.0.1", 6379)) {
            Set<String> result = jedis.smembers(diffFileCacheKey);
            FileUtil.writeUtf8Lines(result, diffFile);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
Die Funktion des Befehls SUNIONSTORE ähnelt der von SUNION gibt die Ergebnismenge nicht zurück, sondern wird im Ziel gespeichert.

Wenn das Ziel bereits existiert, wird es überschrieben.

Rückgabewert
Anzahl der Mitglieder im Ergebnissatz

Empfohlenes Lernen:

Redis-Video-Tutorial

Das obige ist der detaillierte Inhalt vonDetaillierte Beispiele, wie Redis Schnittmenge, Vereinigung und Ergänzung von Daten implementiert. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:csdn.net. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen