Dengan pembangunan berterusan teknologi Internet, sistem teragih menjadi semakin biasa dalam pembangunan, terutamanya dalam pemprosesan serentak tinggi dan senario pemprosesan data berskala besar boleh meningkatkan kebolehskalaan sistem dan meningkatkan kecekapan prestasi dan keselarasan sistem. Walau bagaimanapun, dalam sistem teragih, kerana data bertaburan merentasi berbilang mesin, adalah mudah untuk menghadapi masalah seperti ketidakkonsistenan data atau operasi berulang. Untuk menyelesaikan masalah ini, kita sering perlu menggunakan kunci yang diedarkan.
Kunci teragih ialah mekanisme kunci yang dicadangkan untuk mengekalkan konsistensi data dalam sistem teragih Ia digunakan terutamanya untuk mengelakkan masalah seperti persaingan data dan ketidakkonsistenan data dalam sistem teragih. Dalam mekanisme kunci bersendirian tradisional, ia biasanya dilaksanakan menggunakan disegerakkan atau ReentrantLock Walau bagaimanapun, dalam sistem yang diedarkan, penyelesaian pelaksanaan kunci perlu mempertimbangkan isu seperti kelewatan rangkaian dan keselarasan, yang memerlukan penggunaan teknologi kunci teragih khas.
Redis, sebagai pangkalan data storan nilai kunci berprestasi tinggi, sering digunakan untuk melaksanakan mekanisme penguncian sistem teragih. Redis menyediakan pelbagai kaedah pelaksanaan kunci yang diedarkan, seperti kunci berdasarkan arahan SETNX, kunci berdasarkan algoritma Redlock dan kunci berdasarkan skrip Lua. Di bawah, kami akan memperkenalkan kepada anda penyelesaian pelaksanaan kunci yang diedarkan Redis berdasarkan arahan SETNX.
Arahan SETNX Redis digunakan untuk menetapkan nilai kunci tertentu dalam Redis Jika kunci tidak wujud, tetapan berjaya dan 1 akan dikembalikan dikembalikan. Kami boleh menggunakan ciri ini untuk melaksanakan kunci yang diedarkan.
Apabila kita perlu mengunci data tertentu, kita menggunakan arahan SETNX untuk cuba menetapkan nilai kunci tertentu kepada 1. Jika tetapan berjaya, ini bermakna tiada pelanggan lain yang memegang kunci pada masa ini, dan penguncian berjaya jika tetapan gagal, ini bermakna pelanggan lain sedang memegang kunci dan penguncian gagal. Apabila membuka kunci, kami hanya perlu memadamkan kunci yang sepadan dengan kunci.
Di bawah ini kami akan memperkenalkan cara melaksanakan kunci yang diedarkan melalui Redis untuk memastikan keselamatan data. Langkah-langkah berikut hanyalah contoh dan perlu diselaraskan mengikut syarat tertentu dalam aplikasi sebenar.
Di Jawa, kami boleh menggunakan sama ada Jedis atau Lettuce, dua kit alat klien Redis, untuk melaksanakan operasi berkaitan Redis. Anda boleh menambah kebergantungan berikut dalam fail pom.xml:
<dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>3.0.1</version> </dependency>
Sebelum menggunakan Redis, anda perlu membuat sambungan dengan perkhidmatan Redis. Anda boleh menggunakan objek JedisPool yang disediakan oleh Jedis Parameter maxTotal menentukan bilangan maksimum sambungan dalam kumpulan sambungan, parameter maxIdle menentukan bilangan maksimum sambungan melahu dalam kumpulan sambungan dan tamat masa ditetapkan kepada 5000 milisaat.
JedisPool jedisPool = new JedisPool(new GenericObjectPoolConfig(), "localhost", 6379, 5000, "password");
Kami melaksanakan logik penguncian dan buka kunci dengan merangkum kelas LockUtil. Dalam operasi mengunci, kami cuba menggunakan arahan SetNx untuk menetapkan nilai kunci tertentu kepada 1. Jika tetapan berjaya, benar dikembalikan jika tetapan gagal, ini bermakna kunci telah diduduki oleh benang lain, dan palsu dikembalikan. Perlu diingat bahawa selepas berjaya mengunci, tamat masa mesti ditetapkan untuk mengelakkan kebuntuan disebabkan beberapa sebab.
public class LockUtil { private static final String LOCK_KEY_PREFIX = "lock:"; public static boolean lock(String key, int timeout) { Jedis jedis = null; try { jedis = jedisPool.getResource(); String lockKey = LOCK_KEY_PREFIX + key; long start = System.currentTimeMillis(); while (true) { // 使用SETNX命令来设置key的值为1 long result = jedis.setnx(lockKey, "1"); // 设置成功 if (result == 1) { jedis.expire(lockKey, timeout); return true; } // 设置失败 else { // 检查是否超时 long end = System.currentTimeMillis(); if (end - start > timeout) { return false; } } Thread.sleep(1000); } } catch (Exception e) { return false; } finally { if (jedis != null) { jedis.close(); } } } }
Dalam operasi buka kunci, kami menggunakan arahan del untuk memadamkan kunci dan melepaskan sumber.
public class LockUtil { public static boolean unlock(String key) { Jedis jedis = null; try { jedis = jedisPool.getResource(); String lockKey = LOCK_KEY_PREFIX + key; jedis.del(lockKey); return true; } catch (Exception e) { return false; } finally { if (jedis != null) { jedis.close(); } } } }
Akhir sekali, sahkan bahawa kunci yang diedarkan kami berfungsi dengan baik dengan ujian mudah, seperti yang ditunjukkan di bawah:
@Test public void testLock() throws InterruptedException { ExecutorService executorService = Executors.newFixedThreadPool(10); for (int i = 0; i < 10; i++) { executorService.submit(new Runnable() { @Override public void run() { boolean lockResult = LockUtil.lock("test", 5000); if (lockResult) { System.out.println(Thread.currentThread().getName() + " get lock"); try { // 处理业务 Thread.sleep(5000); } catch (InterruptedException e) { e.printStackTrace(); } finally { LockUtil.unlock("test"); } } else { System.out.println(Thread.currentThread().getName() + " fail to get lock"); } } }); } sleep(100000); }
Kod di atas akan menghasilkan 10 utas, setiap utas akan cuba memperoleh kunci kunci yang sama, lakukan beberapa operasi perniagaan dan lepaskan sumber kunci selepas 5 saat. Jika kunci yang diedarkan berjaya dilaksanakan, setiap utas boleh berjaya memperoleh kunci dan pemprosesan perniagaan yang lengkap.
Melalui contoh di atas, kita dapat melihat bahawa menggunakan arahan SETNX Redis, mekanisme kunci teragih yang mudah dan cekap boleh dilaksanakan untuk memastikan keselamatan data dalam sistem yang diedarkan dengan berkesan. Dalam proses permohonan sebenar, kami perlu melaraskan dan mengoptimumkan pelan pelaksanaan kunci berdasarkan senario dan keperluan perniagaan sebenar.
Atas ialah kandungan terperinci Gunakan Redis untuk melaksanakan kunci yang diedarkan untuk memastikan keselamatan data. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!