Rumah  >  Artikel  >  pangkalan data  >  Apakah cara untuk mengunci redis?

Apakah cara untuk mengunci redis?

WBOY
WBOYke hadapan
2023-05-27 12:43:061374semak imbas

Arahan penguncian biasa redis ialah INCR, SETNX, SET

1, INCR

Idea penguncian jenis kunci ini ialah:

kunci tidak wujud, maka nilai kunci akan dimulakan kepada 0 dahulu, dan kemudian operasi INCR akan dilakukan untuk meningkatkannya sebanyak satu.

Kemudian apabila pengguna lain melakukan operasi INCR untuk menambah satu, jika nilai yang dikembalikan lebih besar daripada 1, ini bermakna kunci sedang dikunci untuk digunakan.

1 Klien A meminta pelayan untuk mendapatkan nilai kunci 1, menunjukkan bahawa kunci telah diperolehi

2 , menunjukkan bahawa pemerolehan kunci gagal

3 Klien A menyelesaikan pelaksanaan kod dan memadamkan kunci

4 1 apabila membuat permintaan, menunjukkan bahawa kunci berjaya diperoleh

5 Klien B melaksanakan kod dan memadamkan kunci

$redis->incr($key);
$redis->expire($key, $ttl); //设置生成时间为1秒

Arahan khusus ialah:

127.0.0.1:6379>INCR keyName

2. . SETNX

Idea di sebalik penguncian jenis ini ialah jika kunci Jika ia tidak wujud, tetapkan kunci kepada nilai Jika kunci itu wujud, SETNX tidak akan mengambil sebarang tindakan.

SETNX ialah singkatan SET if Not eXists.

1 Klien A meminta pelayan untuk menetapkan nilai kunci Jika tetapan berjaya, ia bermakna kunci berjaya

2 nilai kunci. Jika Jika pemulangan gagal, ini bermakna penguncian gagal

3 Klien A menyelesaikan pelaksanaan kod dan memadamkan kunci

4 nilai selepas menunggu untuk tempoh masa. Tetapan berjaya

5 Klien B melaksanakan kod dan memadamkan kunci

$redis->setNX($key, $value);
$redis->expire($key, $ttl);

Arahan khusus ialah:

redis> SETNX keyName value
(integer) 1

The. tetapan berjaya dan 1 dikembalikan; tetapan gagal dan 0 dikembalikan

3 SET

Dua kaedah di atas mempunyai masalah.

Jadi mengapa anda perlu menetapkan tamat tempoh kunci?

Jika pelaksanaan permintaan terkeluar tanpa diduga atas sebab tertentu, menyebabkan kunci dibuat tetapi tidak dipadamkan, maka kunci akan sentiasa wujud, supaya cache tidak akan dikemas kini pada masa hadapan.

Jadi kita perlu menambah masa tamat tempoh pada kunci untuk mengelakkan kemalangan.

Tetapi menetapkannya dengan Tamat Tempoh bukanlah operasi atom.

Jadi, anda juga boleh memastikan atomicity melalui transaksi, tetapi masih terdapat beberapa masalah, jadi pegawai itu memetik satu lagi dengan menggunakan arahan SET itu sendiri telah memasukkan fungsi menetapkan masa tamat tempoh bermula dari versi 2.6.12.

1 Klien A meminta pelayan untuk menetapkan nilai kunci Jika tetapan berjaya, kunci berjaya

2 pemulangan gagal, Maka ini bermakna kunci gagal

3 Klien A melengkapkan pelaksanaan kod dan memadamkan kunci

4 menunggu satu tempoh masa, dan tetapan berjaya

5 Klien B melaksanakan kod dan memadamkan kunci

$redis->set($key, $value, array('nx', 'ex' => $ttl));  //ex表示秒

Penggunaan khusus:

redis>set key value NX EX max-lock-time 实现加锁

Penjelasan arahan: <.>

  • : kunci ialah nilai kunci redis sebagai pengecam kunci dan nilai digunakan sebagai pengecam pelanggan di sini Hanya apabila nilai kunci sepadan, anda boleh mempunyai hak untuk memadam kunci [Keselamatan terjamin] key

  • : Tetapkan masa tamat tempoh melalui max-lock-time untuk memastikan tiada jalan buntu akan berlaku [Elakkan kebuntuan] max-lock-time

  • : Hanya apabila kunci ini tidak wujud Operasi akan dilakukan jika tidak wujud; daripada kunci kepada saat, masa tertentu ditentukan oleh parameter kelima NX

  • Kod kunci: EX

     Jedis jedis = new Jedis("127.0.0.1", 6379);
     private static final String SUCCESS = "OK";
     /**
      * 加锁操作
      * @param key 锁标识
      * @param value 客户端标识
      * @param timeOut 过期时间
      */
      
     public Boolean lock(String key,String value,Long timeOut){
         String var1 = jedis.set(key,value,"NX","EX",timeOut);
         if(LOCK_SUCCESS.equals(var1)){
             return true;
         }
         return false;
     }
Kod buka kunci:

 Jedis jedis = new Jedis("127.0.0.1", 6379); 
 private static final Long UNLOCK_SUCCESS = 1L;
 /**
  * 解锁操作
  * @param key 锁标识
  * @param value 客户端标识
  * @return
  */
  
 public static Boolean unLock(String key,String value){
     String luaScript = "if redis.call(\"get\",KEYS[1]) == ARGV[1] then return 
     redis.call(\"del\",KEYS[1]) else  return 0 end";
     Object var2 = jedis.eval(luaScript,Collections.singletonList(key), Collections.singletonList(value));
     if (UNLOCK_SUCCESS == var2) {
         return true;
     }
     return false;
}
luaScript Rentetan ini ialah skrip lua, yang bermaksud jika mengikut kekunci Jika nilai yang diperolehi adalah sama dengan nilai yang dihantar, laksanakan del, jika tidak ia akan mengembalikan 0 [Pastikan keselamatan]

jedis.eval(String, senarai, senarai); >Yang di atas menyedari cara menggunakan redis untuk melaksanakan kunci yang diedarkan dengan betul, tetapi terdapat kelemahan kecil kerana kunci tersebut tamat tempoh Seberapa sesuai masa yang perlu ditetapkan sebenarnya perlu dipertimbangkan berdasarkan senario perniagaan.

Atas ialah kandungan terperinci Apakah cara untuk mengunci redis?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:yisu.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam