Node-redis: bagaimana mengatur waktu kadaluwarsa

Dibuat pada 7 Mar 2016  ·  40Komentar  ·  Sumber: NodeRedis/node-redis

client.set(key, value)

bagaimana mengatur waktu kadaluwarsa

question

Komentar yang paling membantu

@BridgeAR : Dimengerti, tetapi Anda agak kehilangan intinya. Mungkin ini hanya saya yang malas, tetapi saya menolak untuk mempelajari seluruh API Redis asli hanya agar saya dapat memasukkan dan menarik semuanya. Mungkin sebaiknya saya tidak menggunakan perpustakaan node_redis . Mungkin saya harus menggunakan sesuatu yang lain yang berada di atasnya dan mengabstraksikannya dari saya. Namun, seperti yang saya katakan sebelumnya, saya pikir kebanyakan orang menggunakan Redis sebagai cache dan tidak ada dalam dokumentasi node_redis yang bahkan menyebutkan kata "expire" atau "expiration" (atau bahkan perintah "EX" atau TTL) jadi tanpa menggali dokumentasi resmi Redis, sulit untuk memahami cara benar-benar menetapkan TTL untuk sebuah kunci, sebuah tindakan yang saya harapkan perlu dilakukan oleh sebagian besar orang.

Semua 40 komentar

Silakan periksa dokumentasi perintah. Setiap bagian memiliki parameternya sendiri sehingga Anda akan menulis sesuatu seperti:

client.set(key, value, 'EX', 60 * 60 * 24, callback);

Terima kasih

@BridgeAR tautan dokumentasi tidak berfungsi

tidak berhasil .. redis versi 3.0

client.set(key, value, 'EX', 60 * 60 * 24, callback);

@sxyjijiji berfungsi dengan baik untuk saya. Jika Anda mengalami kesalahan, kirimkan pelacakan tumpukan Anda dan jelaskan apa yang tidak berfungsi.

@brucejcw Saya memperbaiki tautannya

Saya pikir itu tidak termasuk dalam dokumentasi node_redis, bahkan fungsi yang ditetapkan.
Mungkin itu akan membingungkan sebagian orang.

@bruceCzK Tidak ada dokumentasi perintah eksplisit. Dan ini bukan ide yang baik secara umum karena perintah mungkin berubah di Redis dan parameter baru mungkin ditambahkan seiring waktu.

Tetapi ada lebih dari satu referensi ke dokumentasi utama yang harus selalu Anda lihat untuk melihat bagaimana perintah bekerja. Jika Anda melihat kemungkinan untuk meningkatkan dokumentasi saat ini, jangan ragu untuk membuka permintaan pull untuk itu. Mungkin ide yang bagus untuk menambahkan tautan pada semua "perintah" yang muncul di README.md.

hai teman-teman, apakah ada cara untuk menyetel kedaluwarsa default di tingkat klien?

Mis: sesuatu seperti

  const redisClient = redis.createClient({
    host: process.env.REDIS_ENDPOINT,
    port: process.env.REDIS_PORT,
    expire: 60 
})

Hanya menggemakan bahwa ini adalah sintaks yang sangat membingungkan, terutama bagi pendatang baru. Tidak ada dalam dokumentasi node_redis tentang ekspirasi kunci / TTL. Saya membayangkan kebanyakan orang menggunakan Redis sebagai bagian dari lapisan cache dan waktu kedaluwarsa untuk kunci akan menjadi bagian yang sangat penting dari alur kerja itu. IMO, ini harus dimasukkan ke dalam API dasar (mungkin fungsi set dapat mengambil parameter opsional) atau dokumentasi setidaknya harus berbicara tentang API perintah yang berkaitan dengan kedaluwarsa kunci.

Sepertinya jawabannya adalah tidak, kami tidak dapat menyetel kedaluwarsa global di tingkat klien. Agak menyebalkan harus menyetel kedaluwarsa pada setiap kunci.

@ryanvanderpol fungsi set sudah mengambil parameter opsional seperti yang dijelaskan. Lihat saja dokumentasi dan komentar saya di atas.

@ kienpham2000 Tidak ada kedaluwarsa global pada tingkat klien dan ini akan sulit diterapkan. Setiap perintah harus diperiksa dan dimanipulasi. Sebaliknya, fitur baru untuk menambahkan pengait bisa menyelesaikannya.
Ini bukan perpustakaan cache dan kemungkinan Anda sedang mencari itu sebagai gantinya.

@BridgeAR : Dimengerti, tetapi Anda agak kehilangan intinya. Mungkin ini hanya saya yang malas, tetapi saya menolak untuk mempelajari seluruh API Redis asli hanya agar saya dapat memasukkan dan menarik semuanya. Mungkin sebaiknya saya tidak menggunakan perpustakaan node_redis . Mungkin saya harus menggunakan sesuatu yang lain yang berada di atasnya dan mengabstraksikannya dari saya. Namun, seperti yang saya katakan sebelumnya, saya pikir kebanyakan orang menggunakan Redis sebagai cache dan tidak ada dalam dokumentasi node_redis yang bahkan menyebutkan kata "expire" atau "expiration" (atau bahkan perintah "EX" atau TTL) jadi tanpa menggali dokumentasi resmi Redis, sulit untuk memahami cara benar-benar menetapkan TTL untuk sebuah kunci, sebuah tindakan yang saya harapkan perlu dilakukan oleh sebagian besar orang.

@ryanvanderpol Ini adalah pustaka klien Redis, bukan pustaka cache. Jika Anda menggunakan pustaka Redis, Anda diharapkan membaca dokumentasi Redis, terutama karena node_redis tidak mendokumentasikan cara kerja perintah, karena alasan ini. Bagaimanapun, node_redis hanya meneruskan parameter ke Redis hampir sepanjang waktu.

Jika Anda menginginkan pustaka cache, Anda dapat menggunakan salah satu dari banyak paket npm di luar sana, seperti cacheman-redis atau node-redis-cache , dalam dokumentasinya Anda akan menemukan penyebutan eksplisit "expire": smile:

Saya mengerti maksud Anda, tetapi menurut saya bukan tugas node_redis untuk menduplikasi dokumentasi Redis atau hal-hal abstrak lebih dari yang diperlukan ...

@CherryDT maksud Anda adil, itulah sebabnya saya mengawali komentar saya sebelumnya dengan "mungkin saya harus menggunakan sesuatu yang lain yang ada di atas node_redis", tetapi mengingat berapa banyak +1 yang diterima komentar saya sejauh ini, saya tidak ragu bahwa saya tidak sendirian dalam frustrasi ini.

Jika yang ingin saya lakukan hanyalah berkomunikasi langsung dengan Redis dalam format mentah, maka pembungkus ini tidak memberikan banyak nilai bagi saya. Saya pikir sangat adil untuk mengasumsikan bahwa sebagian besar orang yang menggunakan Redis melakukannya untuk tujuan penyimpanan dalam cache dan akan peduli dengan kedaluwarsa.

Seluruh percakapan ini bisa saja dinegasikan dengan "poin yang bagus, kita harus menambahkan sedikit ke dokumentasi tentang cara mengatur ekspirasi kunci, bersama dengan beberapa perintah yang umum digunakan". Saya kira saya juga bisa mengirimkan PR untuk itu juga, tetapi saya tidak terbiasa dengan Redis selain menggunakannya sebagai cache.

Yang mengatakan saya akan melihat perpustakaan lain yang Anda sebutkan dan saya mungkin pindah ke salah satu dari mereka jika mereka lebih sesuai dengan kasus penggunaan saya.

Maksud saya adalah bahwa ada lebih banyak fungsi daripada TTL. Ada tipe data yang berbeda (daftar, set, set yang diurutkan), sistem penerbit & pelanggan dan banyak lagi, dan pada dasarnya menduplikasi dokumentasi Redis (dan menjaganya tetap diperbarui), atau menambahkan lebih banyak gula pada parameter (dan menjaga _them_ diperbarui) adalah hal-hal yang saya yakini berada di luar cakupan klien ini. Saya tidak akan mengharapkan dari klien MySQL fitur ORM (atau referensi MySQL), bukan?

Saya percaya pada desain modular, dan karenanya saya juga percaya bahwa modul individu tidak boleh lebih besar dari yang seharusnya. Dan dalam kasus ini, klien ini melakukan pekerjaan yang baik dalam mengabstraksi bagian jaringan dan memberikan perintah sebagai metode untuk kenyamanan lapisan pertama, tetapi saya pikir hal-hal di atas itu harus menjadi pekerjaan perpustakaan yang lebih terspesialisasi untuk tujuan tertentu. (seperti yang saya tautkan sebelumnya untuk cache, atau yang lain untuk pubsub, dll.). Mereka sering menggunakan node_redis secara interally, jadi meskipun mungkin tidak banyak berguna untuk Anda secara langsung, itu bisa secara tidak langsung, karena perpustakaan yang lebih abstrak yang mungkin Anda gunakan mungkin menggunakan node_redis sebagai ketergantungan.

Jadi, saya setuju bahwa untuk kasus penggunaan Anda, Anda akan lebih baik dengan perpustakaan yang lebih "tingkat tinggi" di atas sesuatu seperti node_redis.

Ya, saya sangat tidak setuju dengan Anda di sini. Saya mengharapkan dokumentasi untuk klien MySQL menunjukkan kepada saya bagaimana melakukan beberapa hal umum yang dilakukan semua orang di MySQL, seperti bagaimana saya melakukan pemilihan dengan fungsi agregat atau bagaimana saya melakukan subquery. Saya tidak berharap itu menjelaskan bagaimana membangun ORM atau menjadi reproduksi dari seluruh dokumentasi MySQL, tetapi tunjukkan bagaimana saya melakukan hal-hal umum menggunakan perpustakaan.

Bagaimanapun, jelas Anda tidak akan melihat sudut pandang saya dan ini hanya membuang-buang waktu. Sejauh ini, 17 orang setuju dengan saya dan hanya Anda dan satu orang yang tidak setuju. Jadi, mungkin Anda harus mundur sejenak dan memikirkan bagaimana Anda dapat melihat sesuatu dari sudut pandang orang lain sesekali.

Mengapa Anda menjadikan ini pribadi? Saya sangat mengerti maksud Anda, saya hanya berpikir bahwa node_redis bukanlah alat yang tepat untuk pekerjaan itu. (Seperti yang Anda sepakati sendiri bahkan sebelum saya mulai menyampaikan maksud saya.) Pikirkanlah, menjaga hal-hal kecil dan mandiri menyederhanakan banyak hal. node_redis khawatir tentang jaringan, hal-hal seperti node-cache-redis (atau implementasi Anda sendiri) khawatir tentang penggunaan Redis API dengan benar. Dengan cara ini, tidak banyak dependensi. Pustaka "di atas" akan selalu ada dengan satu atau lain cara, dan dengan cara ini node_redis tidak perlu diperbarui (atau bahkan mendukung versi API yang berbeda) setiap kali Redis menambahkan atau mengubah beberapa fitur (hanya jika ia menambahkan keseluruhan _command_) .

Saya menawarkan solusi alternatif, dan saya berharap ini akan memenuhi kebutuhan Anda, dan jika tidak, luangkan waktu sejenak untuk mencari "redis" di npm dan Anda akan menemukan banyak perpustakaan lain juga.

Mari kita setuju saja bahwa kita tidak setuju dalam hal ini. (Dan tidak masalah jika 17 atau 1700 orang setuju dengan Anda atau saya. Setiap opini harus dihargai, menurut saya.)

Jika kita melihat pertanyaan asli dan jawabannya, saya tidak tahu saya harus menggunakan .set() dengan 'EX' dan pilihan waktu seperti itu di perpustakaan ini.

Melihat README.md saat ini, ini menjelaskan cara menggunakan client.hgetall (https://github.com/NodeRedis/node_redis#clienthgetallhash-callback), mungkin kita dapat menambahkan beberapa kasus yang lebih umum untuk SET dan GET dengan cara yang sama? Saya juga mengasumsikan orang menggunakan banyak GET dan SET dengan redis.

Saya tidak menyadari bahwa begitu banyak orang memiliki masalah dengan hal itu karena suka tidak muncul di kotak masuk saya.

Saya akan siap untuk PR yang mendokumentasikan perintah yang ditetapkan sebagai contoh sementara juga menyebutkan "kedaluwarsa".

Saya juga ingin memiliki PR yang mendokumentasikan bahwa ini bukan pustaka cache dan tidak dimaksudkan sebagai perpustakaan. Saya terbuka untuk setiap masukan tentang bagaimana membuat dokumentasi lebih baik untuk orang baru.

@ kienpham2000 Nah, ini juga merupakan perintah terpisah - setex :)

Hanya untuk berpadu di sini tentang menjelaskan _redis_ di readme modul _node_redis_. Saya tidak sepenuhnya percaya pada gagasan itu. Seperti yang diilustrasikan oleh contoh ini - menggunakan set dan expire dalam multi / exec , menggunakan setex atau menggunakan set dengan 'mantan' - ada banyak cara untuk melakukan banyak hal. Tidak ada yang ada hubungannya dengan node. Kami menjelaskan hgetall karena ini berangkat dari cara perintah lain mengembalikan nilai.

Bukan untuk mengatakan bahwa orang tidak memiliki pertanyaan, tetapi menurut saya menulis blog atau posting media atau sesuatu adalah cara yang lebih baik untuk memberi tahu orang daripada berkonsentrasi di sini. Jika kami mendapat pertanyaan, itu bisa saja ditautkan dalam masalah apa pun yang muncul. Mengubah readme modul _node_redis_ menjadi sumber semua untuk pengetahuan mungkin berada di luar cakupan.

@stockholmux Saya hanya ingin tahu bagaimana kita menggunakan setex di lib ini? Apakah hanya client.setex() ?

Jika lib ini pemetaan 1-1 dengan perintah redis maka saya pikir kita tidak perlu doc. Tetapi jika lib ini memiliki api khusus atau cara diff untuk meneruskan opsi, saya pikir memiliki beberapa jenis dokumen API akan sangat membantu bagi para pengembang.

@ kienpham2000 itu adalah pemetaan 1-ke-1. Itu selalu dimaksudkan untuk menjadi satu. Klien sederhana untuk menggunakan API. Ini level rendah, bukan level tinggi.

Dan @stockholmux benar bahwa hgetall hanya didokumentasikan karena Anda dapat menggunakannya dengan lebih banyak cara daripada perintah lainnya. Tapi ini masih pemetaan 1-ke-1.

Bagaimanapun: Saya mendukung menambahkan bagian tentang ini sehingga ini tidak muncul lagi.

@BridgeAR keren terima kasih sudah bersedia menerima dokumen PR ini, ini draf pertama saya: https://github.com/NodeRedis/node_redis/pull/1229/files

Sekarang saya menemukan ini dan sepertinya metode lain: https://dzone.com/articles/tutorial-working-nodejs-and

Saya juga tidak bisa mendapatkan metode itu berfungsi (tidak ada kesalahan, tidak ada efek jadi saya meninggalkan proyek ini dan beralih ke https://www.npmjs.com/package/node-cache yang tetap dapat menggunakan Redis.

Di bawah jendela tidak mungkin mengatur kedaluwarsa dalam metode "set" dengan 'EX', 20 karena hanya menerima 2 parameter saja o 3.

Mungkin Anda memiliki versi Redis lama? Dokumen mengatakan itu ditambahkan di Redis 2.6.12: https://redis.io/commands/set

Anda dapat menggunakan SETEX sebagai gantinya, yang ada sejak 2.0.0 ...

Mungkin Anda memiliki versi Redis lama? Dokumen mengatakan itu ditambahkan di Redis 2.6.12: https://redis.io/commands/set

Saya menggunakan redis dalam proyek node-express, dengan JS tidak mungkin menambahkan tiga parameter (atau saya tidak bisa .. :-()

redis.set("cache:" + req.originalUrl, JSON.stringify(result), 'EX', 25); -> ini adalah kode saya dengan kesalahan di area kedaluwarsa.

Versi Redis yang mana?

Redis 2.4.5 untuk windows redis-windows dan versi terbaru dari modul node.

Jadi sudah jelas, baca lagi pesan saya di atas dan periksa dokumentasi Redis! Parameter "EX" di SET hanya ditambahkan di 2.6.12, jadi Redis versi 2.4.5 Anda tidak memilikinya, tetapi Anda dapat menggunakan SETEX yang ada sejak 2.0.0.

redis.setex(key, seconds, value)
redis.setex(key, value, seconds)

redis.setex(key, value, expiration) -> itu tidak bekerja

... tetapi saya telah menemukan satu cara yang benar di tautan ini: redis windows

Jika Anda ingin mengubah versi Redis Anda, ya, cara Anda sudah benar.
Jika tidak, milik saya juga berfungsi, saya baru saja salah parameter (tetapi jika Anda telah memeriksa dokumen SETEX, Anda akan memperhatikan): itu kunci, detik, nilai dan bukan kunci, nilai, detik.

Bagaimanapun, senang mendengarnya bekerja untuk Anda sekarang.

Di bawah ini tidak berfungsi.

client.set('key', 'value', 'EX', 10, (error, replay)=>{
...
}

Ada kabar terbaru tentang ini?
Saya menggunakan client.expire(id,10) untuk saat ini.

PS: Saya menggunakan versi redis: Redis server v=5.0.0 dan node verison: v8.10.0

@kdthanvi Itu seharusnya berhasil. Periksa kembali apa yang sebenarnya terjadi menggunakan MONITOR dari redis-cli saat menjalankannya.

@kdm_bener benar. Ini tidak bekerja dengan redis 5:

client.set(key, value, 'EX', 60 * 60 * 24, callback);

Anda membutuhkan:

`
client.set (key, value, callback);

client.expire (key, TTL, callback);
`

untuk membuatnya benar-benar berfungsi.

@martinlevesque Saya yakin Anda salah. EX telah ditambahkan di 2.6.12 dan node_redis dengan benar meneruskan 'EX' apa pun versinya. Periksa dengan MONITOR dan Anda akan melihat.

SET + EXPIRE bisa sangat berbeda dari SET .. EX karena perbedaan atom.

Karena utas ini adalah nomor 1 ketika saya mencari "Redis node set expire", saya ingin menyimpulkan bahwa perintah follow set expire berfungsi dengan nodeJS redis pada hari ini.

setex(key, 60, value)

Dimana 60 adalah waktu kedaluwarsa dalam hitungan detik.

Karena utas ini adalah nomor 1 ketika saya mencari "Redis node set expire", saya ingin menyimpulkan bahwa perintah follow set expire berfungsi dengan nodeJS redis pada hari ini.

setex(key, 60, value)

Dimana 60 adalah waktu kedaluwarsa dalam hitungan detik.

Menemukan ini setelah 2 jam debugging dan pemecahan kesalahan. Terima kasih banyak ;)

Apakah halaman ini membantu?
0 / 5 - 0 peringkat