Untuk mengubah suai String, redis mempunyai: set, setex, append , incr, decr, dan lain-lain. Antaranya, menggunakan set dan setex untuk mengubah suai String sedia ada akan menetapkan semula masa tamat yang ditetapkan pada asalnya, set dan setex bukanlah "pengubahsuaian" tetapi menulis ganti tetapan asal Jika nilai kunci telah diluluskan, tetapkan/setex kekunci ini sekali lagi akan menimpa yang asal. Keputusan ujian menggunakan try redis adalah seperti berikut:
Jika anda menggunakan append, incr, decr dan perintah lain untuk mengubah suai, masa tamat tempoh asal tidak akan ditetapkan semula:
Jadi, untuk struktur rentetan, selagi perintah set /setex dilaksanakan, masa tamat tempoh akan ditetapkan semula, dan arahan set akan terus menukar masa tamat tempoh kepada tidak pernah. tamat tempoh.
Sebagai contoh, jika saya menetapkan {key1:value} pada 7:00, masa tamat tempoh ialah 30 minit dan jika saya menetapkan/menetapkan nilai kunci ini beberapa kali antara 7:00-7:30, masa tamat tempoh key1 akan ditetapkan semula dan akhirnya tidak akan tamat pada 7:30. Bagaimana untuk memastikan bahawa masa tamat tempoh tidak dimuat semula setiap kali selepas menetapkan kunci tamat tempoh ini, dan tamat tempoh adalah stabil pada 7:30?
Kaedah 1:
Gunakan Pemasa, buat pemasa apabila menetapkan buat kali pertama dan padamkan kekunci apabila tamat tempoh. Kaedah ini akan menduduki lebih banyak sumber CPU apabila jumlah data adalah besar, dan tidak disyorkan.
Kaedah 2:
Sebelum menetapkan nilai kunci setiap kali, kembalikan baki masa tamat tempoh kunci pada masa ini dan tetapkan baki masa tamat tempoh kepada kunci sebagai tamat tempoh baharu semasa setex Masa akan menyelesaikannya.
Mengambil projek Spring sebagai contoh, baki cap masa tamat tempoh (tahap milisaat) yang dikembalikan oleh kaedah redisTemplate.getExpire(Kunci rentetan) boleh digunakan untuk menyelesaikan masalah pada asasnya, ia menghantar PTTL perintah untuk redis untuk mengembalikan milisaat Baki masa tamat kunci unit.
Contoh kod:
Biar key1 mengekalkan masa tamat tempoh apabila ia pertama kali ditetapkan setiap kali ia diubah suai
//获取key1的剩余时间的时间戳 Long expire = redisTemplate.getExpire("key1"); //最后一个参数可以选秒、毫秒(TimeUnit.MILLISECONDS),Redis最多只能返回毫秒级别的key的剩余过期时间 redisTemplate.opsForValue().set(key, value, expire, TimeUnit.SECONDS);
Tempoh sah K-V jenis String akan dimasa semula apabila nilainya diubah suai:
Jika ada K-V, masa tamat tempoh ialah 30 saat diubah suai, Kemudian masa tamat tempoh akan ditetapkan semula kepada 30 saat, bukannya menolak masa yang hilang daripada masa yang ditetapkan asal.
Kecuali untuk struktur data rentetan, pengubahsuaian kepada struktur data lain tidak akan menetapkan semula masa tamat tempoh
Contohnya, cincang, set, Zset, senarai, dsb.:
Ambil cincang sebagai contoh:
Tempoh sah cincang tidak akan ditetapkan semula kerana nilai medan cincang diubah suai.
Jika anda perlu membuat masa semula, anda perlu menentukan semula tempoh sah semasa mengubah suai nilai medan.
Atas ialah kandungan terperinci Bagaimana untuk menyelesaikan masalah masa tamat redis. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!