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.
Empfohlenes Lernen: Redis-Video-Tutorial
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
<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>
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"; }
/** * 初始化数据并写入文件中 */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 */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.
/** * 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); } }
/** * 将计算的差集数据写入到指定文件 */ 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.
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!