Saya menggunakan senarai redis untuk membuat pengehad dan ia berfungsi seperti yang dijangkakan pada kebanyakan masa, tetapi baru-baru ini saya mendapati bahawa terdapat beberapa kunci yang tidak mempunyai masa tamat tempoh. Sebaik-baiknya saya akan "menolak" nilai ke dalam senarai dan menetapkan masa tamat dalam transaksi dan saya juga akan menggunakan "jam tangan" sebelum transaksi bermula.
Pepijat ini tidak membiak dalam persekitaran setempat saya, walaupun saya menggunakan jmeter untuk membatch permintaan API berkaitan, seperti 500 permintaan dalam 1 saat
Ramalan: v2.1.2 PHP 7.4 Pelayan Redis 5.0.10
$redisClient->watch($key); $current = $redisClient->llen($key); // Transaction start $tx = $redisClient->transaction(); if ($current >= $limitNum) { $redisClient->unwatch(); return false; } else { if ($redisClient->exists($key)) { $tx->rpush($key, $now); try { $replies = $tx->execute(); return true; } catch (\Exception $e) { return false; } } else { // Using transaction to let rpush and expire to be an atomic operation $tx->rpush($key, $now); $tx->expire($key, $expiryTime); try { $replies = $tx->execute(); return true; } catch (\Exception $e) { return false; } } }
Ini adalah operasi yang dijangkakan dalam pelayan Redis tempatan saya
Urus niaga Redis bersifat atom. Atom bermakna sama ada semua arahan diproses atau tiada arahan diproses. Jadi dalam kes saya kunci harus mempunyai tarikh luput.
Urus niaga Redis bukanlah transaksi atom sebegitu. Mereka adalah atom kerana tiada proses lain boleh mengakses ruang utama semasa urus niaga dalam arahan sedang dilaksanakan. Jika arahan dalam urus niaga gagal, arahan berikutnya akan dilaksanakan dan tidak akan ditarik balik.
Sebagai contoh, mari kita laksanakan transaksi yang mengandungi arahan yang salah:
Di sini kami menyemak sama ada senarai itu wujud dan menambah beberapa item awal padanya. Kemudian, dalam urus niaga, kami mengeluarkan item daripada senarai dan tersilap cuba menambah item baharu memikirkan kunci
mylist
拥有一个集合,然后设置键mylist。第一个和第三个命令成功,最后,
mylist
设置了生存时间。第二个命令失败。为此,Redis 中没有内置回滚功能 - 您的应用程序需要通过watch
perintah menggunakan penguncian optimistik... Ini adalah untuk mengesan perubahan oleh proses lain sebelum transaksi anda mendapat apa yang transaksi anda inginkan Kunci yang diubah mempunyai akses eksklusif ke pelayan. Ia bukan mekanisme rollback.Butiran: https://redis.io/docs/interact/transactions/