Artikel ini membawakan anda pengetahuan yang berkaitan tentang Redis, yang terutamanya memperkenalkan isu berkaitan tentang merealisasikan persilangan, penyatuan dan pelengkap data Jika semua pengiraan dilakukan dalam memori JVM Jika ya, ia adalah mudah untuk menyebabkan Pengecualian OOM disebabkan oleh ruang ingatan yang tidak mencukupi Mari kita lihat. Saya harap ia akan membantu semua orang.
Pembelajaran yang disyorkan: Tutorial video Redis
Hari ini kami akan mensimulasikan senario sedemikian, Kami mempunyai berbilang fail teks secara setempat. Setiap fail menyimpan banyak rentetan 32-bit sebagai pengecam unik pengguna Setiap pengguna menyimpan satu baris Jika kita mempunyai bilangan pengguna yang sangat besar setiap hari, kita mungkin Dalam bekerja, ada keperluan untuk melakukan pemprosesan persilangan, kesatuan atau pelengkap pada pengguna ini Cara paling mudah ialah melaksanakan operasi melalui set dalam Java, seperti menggunakan HashSet untuk melaksanakan operasi yang sepadan, tetapi operasi sedemikian wujud Satu batasan ialah kita biasanya mempunyai memori awal yang terhad semasa operasi JVM. Jika semua pengiraan dilakukan dalam memori JVM, adalah mudah untuk menyebabkan pengecualian OOM disebabkan oleh ruang memori yang tidak mencukupi Jadi hari ini kami akan memperkenalkan sambungan Cara yang lebih fleksibel untuk melaksanakan operasi persimpangan dan pelengkap tersebut: Gunakan Redis untuk merealisasikan persimpangan, kesatuan. , dan pelengkap data
Versi Redis: Redis 6.0.6
Versi Jedis: 4.2.2
Versi hutool alatan: 5.8.0.M3
fail pom:
<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); }}
/** * 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); } }
/** * * @param cacheKeyArray 交集集合Key * @param destinationKey 交集集合结果Key */ public static void inter(String[] cacheKeyArray, String destinationKey) { try(Jedis jedis = new Jedis("127.0.0.1", 6379)) { long result = jedis.sinterstore(destinationKey, cacheKeyArray); System.out.println("cacheKeyArray 的交集的个数:" + result); } catch (Exception e) { throw new RuntimeException(e); } }
/** * 将计算的交集数据写入到指定文件 */ public static void writeInterToFile() { File interFile = new File(interFileString); try(Jedis jedis = new Jedis("127.0.0.1", 6379)) { Set<String> result = jedis.smembers(interFileCacheKey); FileUtil.writeUtf8Lines(result, interFile); } catch (Exception e) { throw new RuntimeException(e); } }
/** * 计算多个Key的并集并写入到新的Key * @param cacheKeyArray 求并集的Key * @param destinationKey 并集结果写入的KEY */ public static void union(String[] cacheKeyArray, String destinationKey) { try(Jedis jedis = new Jedis("127.0.0.1", 6379)) { long result = jedis.sunionstore(destinationKey, cacheKeyArray); System.out.println("cacheKeyArray 的并集的个数:" + result); } catch (Exception e) { throw new RuntimeException(e); } }
/** * 将计算的并集数据写入到指定文件 */ public static void writeUnionToFile() { File unionFile = new File(unionFileString); try(Jedis jedis = new Jedis("127.0.0.1", 6379)) { Set<String> result = jedis.smembers(unionFileCacheKey); FileUtil.writeUtf8Lines(result, unionFile); } catch (Exception e) { throw new RuntimeException(e); } }
Contoh:
key1 = {a,b,c,d} key2 = {c} key3 = {a,c,e} SDIFF key1 key2 key3 = {b,d}
Arahan SDIFFSTORE Fungsi ini serupa dengan SDIFF, kecuali ia menyimpan hasil ke koleksi destinasi dan mengembalikan keputusan ditetapkan kepada pelanggan.
Jika koleksi destinasi sudah wujud, tulis gantinya.
Contoh Nota:
key1 = {a,b,c,d} key2 = {c} key3 = {a,c,e} SINTER key1 key2 key3 = {c}
Arahan SINTERSTORE adalah serupa dengan arahan SINTER, kecuali ia tidak mengembalikan set hasil secara langsung, tetapi menyimpan hasil dalam koleksi destinasi.
Jika koleksi destinasi wujud, ia akan ditimpa.
Contoh Nota:
key1 = {a,b,c,d} key2 = {c} key3 = {a,c,e} SUNION key1 key2 key3 = {a,b,c,d,e}
Fungsi arahan SUNIONSTORE adalah serupa dengan SUNION Perbezaannya ialah set hasil tidak dikembalikan tetapi disimpan di destinasi.
Jika destinasi sudah wujud, ia akan ditimpa.
Pembelajaran yang disyorkan: Tutorial video Redis
Atas ialah kandungan terperinci Contoh terperinci tentang cara Redis melaksanakan persilangan, penyatuan dan pelengkap data. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!