কিভাবে "এক্সপায়ার" "এইচএসইটি" চাইল্ড চাবি redis?


107

আমার রেডিস হ্যাশগুলিতে সমস্ত কীগুলি শেষ করতে হবে, যা 1 মাসের চেয়ে বেশি পুরানো।

উত্তর:


117

রেডিসকে সরল রাখার খাতিরে এটি সম্ভব নয়

কোথ আন্টেরেজ, রেডিসের স্রষ্টা:

হাই, এটি সম্ভব নয়, হয় নির্দিষ্ট ক্ষেত্রের জন্য একটি আলাদা শীর্ষ-স্তরের কী ব্যবহার করুন, অথবা ফাইলের সাথে ফাইলের সাথে একটি মেয়াদ উত্তীর্ণের সময় সঞ্চয় করুন, উভয়ই আনুন এবং অ্যাপ্লিকেশনটি এখনও বৈধ কিনা তা অবধি ভিত্তিতে না থাকলে বুঝতে দিন বর্তমান সময়.


8
এই কারণেই আবার redis হল সফটওয়্যারটির দুর্দান্ত একটি অংশ। তারা জানে কোথায় এটি সহজ রাখা যায়
21

20

রেডিস TTLশীর্ষ কী ছাড়া অন্য হ্যাশগুলিকে সমর্থন করে না , যা পুরো হ্যাশটির মেয়াদ শেষ করবে। আপনি যদি ধারালো ক্লাস্টার ব্যবহার করে থাকেন তবে আপনি ব্যবহার করতে পারেন এমন আরও একটি পদ্ধতি রয়েছে। এই পদ্ধতিটি সমস্ত পরিস্থিতিতে কার্যকর হতে পারে না এবং পারফরম্যান্সের বৈশিষ্ট্যগুলি প্রত্যাশিত তুলনায় পৃথক হতে পারে। এখনও উল্লেখযোগ্য:

একটি হ্যাশ থাকার সময় কাঠামোটি মূলত:

hash_top_key
  - child_key_1 -> some_value
  - child_key_2 -> some_value
  ...
  - child_key_n -> some_value

যেহেতু আমরা TTLচাইল্ড কীগুলিতে যুক্ত করতে চাই তাই আমরা তাদের শীর্ষ কীগুলিতে স্থানান্তর করতে পারি। মূল বিষয়টি হ'ল কীটি এখন hash_top_keyএবং শিশু কী এর সমন্বয় হওয়া উচিত :

{hash_top_key}child_key_1 -> some_value
{hash_top_key}child_key_2 -> some_value
...
{hash_top_key}child_key_n -> some_value

আমরা {}উদ্দেশ্য হিসাবে স্বরলিপি ব্যবহার করছি । এটি সেই সমস্ত কী একইভাবে পড়তে দেয় hash slot। আপনি এটি সম্পর্কে এখানে আরও পড়তে পারেন: https://redis.io/topics/cluster- টিউটোরিয়াল

এখন যদি আমরা হ্যাশগুলির একই ক্রিয়াকলাপ করতে চাই তবে আমরা এটি করতে পারি:

HDEL hash_top_key child_key_1 => DEL {hash_top_key}child_key_1

HGET hash_top_key child_key_1 => GET {hash_top_key}child_key_1

HSET hash_top_key child_key_1 some_value => SET {hash_top_key}child_key_1 some_value [some_TTL]

HGETALL hash_top_key => 
  keyslot = CLUSTER KEYSLOT {hash_top_key}
  keys = CLUSTER GETKEYSINSLOT keyslot n
  MGET keys

আকর্ষণীয় একটি এখানে HGETALL। প্রথমে আমরা hash slotআমাদের সমস্ত বাচ্চাদের কীগুলি পাই । তারপরে আমরা সেই নির্দিষ্টটির জন্য কীগুলি hash slotপাই এবং শেষ পর্যন্ত আমরা মানগুলি পুনরুদ্ধার করি। আমাদের এখানে সতর্কতা অবলম্বন করা উচিত যেহেতু এর nজন্য কীগুলির চেয়ে আরও বেশি hash slotকিছু থাকতে পারে এবং এমন কীগুলিও থাকতে পারে যাগুলিতে আমরা আগ্রহী নই তবে সেগুলি একই রয়েছে hash slot। আমরা আসলে Luaসার্ভারে কোনও নির্দেশ EVALবা EVALSHAকমান্ড প্রয়োগ করে এই পদক্ষেপগুলি করার জন্য একটি স্ক্রিপ্ট লিখতে পারি । আবার আপনার নিজের নির্দিষ্ট দৃশ্যের জন্য আপনাকে এই পদ্ধতির কার্যকারিতাটি বিবেচনা করা উচিত।

আরও কিছু উল্লেখ:


এই পদ্ধতির মেয়াদোত্তীর্ণ সময়ের সাথে সাধারণ কীগুলির চেয়ে বেশি মেমরি ব্যবহার করা হয়।
ভাসিলিম

3

একটি রেডিসন জাভা ফ্রেমওয়ার্ক রয়েছে যা Mapপ্রবেশের টিটিএল সমর্থন সহ হ্যাশ অবজেক্টটি প্রয়োগ করে । এটি হুডের নিচে অবজেক্টগুলি ব্যবহার করে hmapএবং zsetরেডিস করে। ব্যবহারের উদাহরণ:

RMapCache<Integer, String> map = redisson.getMapCache('map');
map.put(1, 30, TimeUnit.DAYS); // this entry expires in 30 days

এই পদ্ধতির বেশ কার্যকর।


তবে আপনি কীভাবে একটি মানচিত্র তৈরি করতে পারেন? কারণ আমি কোনও টিউটোরিয়াল বা একটি তৈরি / সেট পদ্ধতি খুঁজে পাই না
ফ্যানআট

@ জোল্টননেমেথ রেডিস মানচিত্রে স্বয়ংক্রিয়ভাবে তৈরি করা হবে যখন প্রথম মান .োকানো হয়।
নিকিতা কোকশারভ

3

এটি কিডিবিতে সম্ভব যা রেডিসের একটি কাঁটাচামচ। কারণ এটি একটি কাঁটাচামচ এটি রেডিসের সাথে সম্পূর্ণ সুসংগত এবং প্রতিস্থাপনের ড্রপ হিসাবে কাজ করে।

শুধু এক্সপায়ার্মেবার কমান্ডটি ব্যবহার করুন। এটি সেট, হ্যাশ এবং সাজানো সেটগুলির সাথে কাজ করে।

এক্সপায়ার্মেবার কী-নাম সাবকি [সময়]

মেয়াদ শেষ হওয়ার জন্য আপনি টিটিএল এবং পিটিটিএলও ব্যবহার করতে পারেন

টিটিএল কী-নাম সাবকি

আরও ডকুমেন্টেশন এখানে উপলব্ধ: https://docs.keydb.dev/docs/commands/#expiremember


2

একটি নোডজেএস বাস্তবায়ন সম্পর্কিত, আমি এইচএএসএসএমে expiryTimeসংরক্ষণ করা বস্তুটিতে একটি কাস্টম ফিল্ড যুক্ত করেছি। তারপরে একটি নির্দিষ্ট সময়সীমার পরে, আমি নিম্নলিখিত কোডটি ব্যবহার করে মেয়াদোত্তীর্ণ এইচএএসএইচ এন্ট্রিগুলি সাফ করব:

client.hgetall(HASH_NAME, function(err, reply) {
    if (reply) {
        Object.keys(reply).forEach(key => {
            if (reply[key] && JSON.parse(reply[key]).expiryTime < (new Date).getTime()) {
                client.hdel(HASH_NAME, key);
            }
        })
    }
});

আপনি হ্যাশ থেকে মোছার Array.filterজন্য একটি অ্যারে তৈরির মাধ্যমে এটি আরও দক্ষ করে তুলতে পারেন keysতারপরে client.hdel(HASH_NAME, ...keys)এটি একটি কলটিতে পাস করুন।
ডাবলশার্প

const keys = Object.keys(reply).filter(key => reply[key] && JSON.parse(reply[key]).expiryTime < Date.now()); client.hdel(HASH_NAME, ...keys);
ডাবলশার্প

1

আপনি পারেন। এখানে একটি উদাহরণ।

redis 127.0.0.1:6379> hset key f1 1
(integer) 1
redis 127.0.0.1:6379> hset key f2 2
(integer) 1
redis 127.0.0.1:6379> hvals key
1) "1"
2) "1"
3) "2"
redis 127.0.0.1:6379> expire key 10
(integer) 1
redis 127.0.0.1:6379> hvals key
1) "1"
2) "1"
3) "2"
redis 127.0.0.1:6379> hvals key
1) "1"
2) "1"
3) "2"
redis 127.0.0.1:6379> hvals key

এক্সপায়ার বা এক্সপায়ারেট কমান্ডটি ব্যবহার করুন ।

আপনি যদি 1 বছরের বেশি বয়সী হ্যাশের নির্দিষ্ট কীগুলির মেয়াদ শেষ করতে চান। যদি সম্ভব না হয়. রেডিস এক্সপায়ার কমান্ড হ্যাশের সমস্ত কীগুলির জন্য। আপনি যদি প্রতিদিনের হ্যাশ কী সেট করেন তবে আপনি বাঁচার জন্য কীগুলির সময় সেট করতে পারেন।

hset key-20140325 f1 1
expire key-20140325 100
hset key-20140325 f1 2

24
আমি মনে করি না যে তিনি হ্যাশের সমস্ত কীগুলি শেষ করতে চান , বরং 1 মাসের চেয়ে পুরানো হ্যাশের সমস্ত কীগুলি , তাই কেবলমাত্র কয়েকটি। কোন আফাইক সম্ভব নয়।
আপক্রিক

1
প্রশ্নটি IMHO আসুন আমরা এটি ধরে নিই। সুতরাং জোনাথন আমার কাছ থেকে +1 পান, কারণ তিনি আমাকে সাহায্য করেছিলেন! ধন্যবাদ!
লংলাইভেন্ডুরো

আপনি কীভাবে "এফ 1" এবং "এফ 2" এর মেয়াদ শেষ করবেন?
vgoklani

4
এটি প্রশ্নের উত্তর দেয় না বা কিছুটা সহায়তা করে না। প্রয়োজন হ্যাশের উপাদানগুলির মেয়াদ শেষ করতে হবে, হ্যাশ নিজেই নয়।
রন

@ ইউপি দ্য ক্রিক আপনাকে ধন্যবাদ!
জোনাথন কিম

1

এটি অর্জনের জন্য আপনি রেডিসে কী / মানগুলি আলাদাভাবে সঞ্চয় করতে পারেন, যখন আপনি কীগুলি সংরক্ষণ করেন যেমন আপনার কীগুলিতে কেবলমাত্র একটি উপসর্গ বা নেমস্পেস যুক্ত করে "hset_"

  • একটি কী / মান GET hset_keyসমান পানHGET hset key

  • একটি কী / মান SET hset_key valueসমান যোগ করুনHSET hset key

  • সমস্ত কী KEYS hset_*সমান হয়HGETALL hset

  • সমস্ত ভ্যালসটি 2 টি অপ্সে করা উচিত, প্রথমে সমস্ত কীগুলি KEYS hset_*পান এবং তারপরে প্রতিটি কীটির মান পান

  • টিটিএল এর সাথে একটি কী / মান যুক্ত করুন বা মেয়াদ উত্তীর্ণ যা প্রশ্নের বিষয়:

 SET hset_key value
 EXPIRE hset_key

দ্রষ্টব্য : KEYSপুরো ডাটাবেসে কীটি মিলিয়ে দেখার জন্য অনুসন্ধান করবে যা কার্য সম্পাদনকে প্রভাবিত করতে পারে বিশেষত আপনার কাছে যদি বড় ডেটাবেস থাকে।

বিঃদ্রঃ:

  • KEYSপুরো ডাটাবেসে কীটি মিলিয়ে দেখার জন্য অনুসন্ধান করবে যা কার্য সম্পাদনকে প্রভাবিত করতে পারে বিশেষত আপনার কাছে যদি বড় ডেটাবেস থাকে। যদিও SCAN 0 MATCH hset_*এটি আরও ভাল হতে পারে যতক্ষণ এটি সার্ভারটিকে অবরুদ্ধ করে না তবে তবুও পারফরম্যান্স একটি বড় ডাটাবেসের ক্ষেত্রে সমস্যা।

  • আপনি এই কীগুলি আলাদাভাবে সংরক্ষণের জন্য একটি নতুন ডাটাবেস তৈরি করতে পারেন যা আপনি কীগুলির ছোট সেট হয়ে থাকেন বিশেষত যদি exp

@ ড্যানফারেলকে ধন্যবাদ যারা সম্পর্কিত পারফরম্যান্স ইস্যুটি হাইলাইট করেছে KEYS


1
পারফরম্যান্স বৈশিষ্ট্যগুলিতে এটি একটি উল্লেখযোগ্য পরিবর্তন
ডেনিয়েল ফারেল

কিভাবে! আপনি যদি সময়ের জটিলতার কথা বলছেন তবে এই সমস্ত ক্রিয়াকলাপের একই সময়ের জটিলতা রয়েছে hashset.. ও (1) সেট হে (1) সমস্ত ও (এন) পান
মুহাম্মদ সোলিমান

"KEYS কে একটি কমান্ড হিসাবে বিবেচনা করুন যা কেবলমাত্র চরম যত্ন সহ উত্পাদন পরিবেশে ব্যবহার করা উচিত" " redis.io/commands/KEYS । এইচজিইটিএল হ'ল ডিবিতে থাকা O(n)সংখ্যার জিনিসগুলিতে KEYSthings
ড্যানিয়েল ফারেল

এটি সত্য, scan 0 match namespace:*যতক্ষণ না এটি সার্ভারটিকে অবরুদ্ধ করে রাখে ততক্ষণ ভাল হতে পারে
মুহাম্মদ সোলিমান

1
এছাড়াও, এই কীগুলি যদি ছোট সেট হয় তবে বিভিন্ন ডাটাবেসে আলাদা করুন। ধন্যবাদ @ ড্যানফ্যারেল
মুহাম্মদ

1

আমাদের এখানেও একই সমস্যাটি আলোচনা হয়েছিল।

আমাদের কাছে রেডিস হ্যাশ রয়েছে, হ্যাশ এন্ট্রিগুলির একটি চাবি (নাম / মান জোড়া) এবং আমাদের প্রতিটি হ্যাশ এন্ট্রিতে পৃথক মেয়াদোত্তীর্ণ সময় রাখা দরকার।

আমরা হ্যাশ এন্ট্রি মান লিখলে এনকোডেড মেয়াদোত্তীর্ণ তথ্য সমেত তথ্য উপসর্গের ডেটা বাইট যোগ করে এটি প্রয়োগ করেছি, আমরা মানটি লেখার সময়টিতে মেয়াদ শেষ হওয়ার জন্য কীটি সেট করেছিলাম।

তারপরে, পড়ার সময় আমরা উপসর্গটি ডিকোড করি এবং মেয়াদোত্তীর্ণ হওয়ার জন্য পরীক্ষা করি check এটি অতিরিক্ত ওভারহেড, তবে, রিডগুলি এখনও ও (এন) থাকে এবং শেষ হ্যাশ প্রবেশের সময় শেষ হয়ে গেলে পুরো কীটি শেষ হয়ে যায়।


0

আপনি ব্যবহার করে Redis Keyspace বিজ্ঞপ্তিগুলি ব্যবহার করতে পারে psubscribeএবং "__keyevent@<DB-INDEX>__:expired"

এটির সাথে, প্রতিবার একটি কীটির মেয়াদ শেষ হবে, আপনি আপনার redis সংযোগে একটি বার্তা প্রকাশিত পাবেন।

আপনার প্রশ্নটি সম্পর্কে মূলত আপনি setএস / এমএসে মেয়াদোত্তীর্ণ সময় ব্যবহার করে একটি অস্থায়ী "সাধারণ" কী তৈরি করেন। এটি আপনার সেটটিতে মুছতে চাওয়ার কীটির নামের সাথে মেলে।

আপনার অস্থায়ী কীটি আপনার পুনরায় সংযোগে প্রকাশিত হবে "__keyevent@0__:expired"যখন এটি শেষ হয়ে যাবে তখন আপনি নিজের মূল সেট থেকে সহজেই আপনার কীটি মুছতে পারেন কারণ বার্তায় কীটির নাম থাকবে।

সেই পৃষ্ঠায় অনুশীলনের একটি সাধারণ উদাহরণ: https://medium.com/@micah1powell/using-redis-keyspace-notifications-for-a-reminder-service-with-node-c05047befec3

দস্তাবেজ: https://redis.io/topics/notifications (পতাকা XE সন্ধান করুন)


0

স্কোর হিসাবে টাইমস্ট্যাম্প সহ টিটিএল ধারক পাওয়ার জন্য আপনি রেডিসে সাজানো সেট ব্যবহার করতে পারেন । উদাহরণস্বরূপ, আপনি যখনই কোনও ইভেন্টের স্ট্রিংটি সেটে .োকান আপনি ইভেন্টের সময়টিতে এর স্কোর সেট করতে পারেন। এইভাবে আপনি কল করে যে কোনও সময় উইন্ডোর ডেটা পেতে পারেন zrangebyscore "your set name" min-time max-time

তদুপরি, আমরা zremrangebyscore "your set name" min-time max-timeপুরানো ইভেন্টগুলি সরিয়ে ব্যবহার করে মেয়াদ শেষ করতে পারি ।

এখানে কেবলমাত্র অপূর্ণতা হ'ল সেটটির আকার বজায় রাখতে আপনাকে বহিরাগত প্রক্রিয়া থেকে গৃহকর্মী করতে হবে।


-1

রেডিস হ্যাশগুলি আপনি স্বাচ্ছন্দ্যে শেষ করতে পারেন, উদাহরণস্বরূপ পাইথন ব্যবহার করে

import redis
conn = redis.Redis('localhost')
conn.hmset("hashed_user", {'name': 'robert', 'age': 32})
conn.expire("hashed_user", 10)

এই সব এর মেয়াদ শেষ হবে শিশু কি মধ্যে হ্যাশ hashed_user 10 সেকেন্ড পরে

রেডিস-ক্লাইম থেকে একই,

127.0.0.1:6379> HMSET testt username wlc password P1pp0 age 34
OK
127.0.0.1:6379> hgetall testt
1) "username"
2) "wlc"
3) "password"
4) "P1pp0"
5) "age"
6) "34"
127.0.0.1:6379> expire testt 10
(integer) 1
127.0.0.1:6379> hgetall testt
1) "username"
2) "wlc"
3) "password"
4) "P1pp0"
5) "age"
6) "34"

10 সেকেন্ড পরে

127.0.0.1:6379> hgetall testt
(empty list or set)

6
প্রশ্ন hsetপূর্ণ মেয়াদ শেষ না হওয়া সম্পর্কে hset
thangdc94

জিজ্ঞাসিত প্রশ্নের উত্তর দেয় না
peteclark3
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.