উত্তর:
রেডিসকে সরল রাখার খাতিরে এটি সম্ভব নয় ।
কোথ আন্টেরেজ, রেডিসের স্রষ্টা:
হাই, এটি সম্ভব নয়, হয় নির্দিষ্ট ক্ষেত্রের জন্য একটি আলাদা শীর্ষ-স্তরের কী ব্যবহার করুন, অথবা ফাইলের সাথে ফাইলের সাথে একটি মেয়াদ উত্তীর্ণের সময় সঞ্চয় করুন, উভয়ই আনুন এবং অ্যাপ্লিকেশনটি এখনও বৈধ কিনা তা অবধি ভিত্তিতে না থাকলে বুঝতে দিন বর্তমান সময়.
রেডিস 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
কমান্ড প্রয়োগ করে এই পদক্ষেপগুলি করার জন্য একটি স্ক্রিপ্ট লিখতে পারি । আবার আপনার নিজের নির্দিষ্ট দৃশ্যের জন্য আপনাকে এই পদ্ধতির কার্যকারিতাটি বিবেচনা করা উচিত।
আরও কিছু উল্লেখ:
একটি রেডিসন জাভা ফ্রেমওয়ার্ক রয়েছে যা Map
প্রবেশের টিটিএল সমর্থন সহ হ্যাশ অবজেক্টটি প্রয়োগ করে । এটি হুডের নিচে অবজেক্টগুলি ব্যবহার করে hmap
এবং zset
রেডিস করে। ব্যবহারের উদাহরণ:
RMapCache<Integer, String> map = redisson.getMapCache('map');
map.put(1, 30, TimeUnit.DAYS); // this entry expires in 30 days
এই পদ্ধতির বেশ কার্যকর।
এটি কিডিবিতে সম্ভব যা রেডিসের একটি কাঁটাচামচ। কারণ এটি একটি কাঁটাচামচ এটি রেডিসের সাথে সম্পূর্ণ সুসংগত এবং প্রতিস্থাপনের ড্রপ হিসাবে কাজ করে।
শুধু এক্সপায়ার্মেবার কমান্ডটি ব্যবহার করুন। এটি সেট, হ্যাশ এবং সাজানো সেটগুলির সাথে কাজ করে।
এক্সপায়ার্মেবার কী-নাম সাবকি [সময়]
মেয়াদ শেষ হওয়ার জন্য আপনি টিটিএল এবং পিটিটিএলও ব্যবহার করতে পারেন
টিটিএল কী-নাম সাবকি
আরও ডকুমেন্টেশন এখানে উপলব্ধ: https://docs.keydb.dev/docs/commands/#expiremember
একটি নোডজেএস বাস্তবায়ন সম্পর্কিত, আমি এইচএএসএসএমে 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);
আপনি পারেন। এখানে একটি উদাহরণ।
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
এটি অর্জনের জন্য আপনি রেডিসে কী / মানগুলি আলাদাভাবে সঞ্চয় করতে পারেন, যখন আপনি কীগুলি সংরক্ষণ করেন যেমন আপনার কীগুলিতে কেবলমাত্র একটি উপসর্গ বা নেমস্পেস যুক্ত করে "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
hashset
.. ও (1) সেট হে (1) সমস্ত ও (এন) পান
O(n)
সংখ্যার জিনিসগুলিতে KEYS
things
scan 0 match namespace:*
যতক্ষণ না এটি সার্ভারটিকে অবরুদ্ধ করে রাখে ততক্ষণ ভাল হতে পারে
আমাদের এখানেও একই সমস্যাটি আলোচনা হয়েছিল।
আমাদের কাছে রেডিস হ্যাশ রয়েছে, হ্যাশ এন্ট্রিগুলির একটি চাবি (নাম / মান জোড়া) এবং আমাদের প্রতিটি হ্যাশ এন্ট্রিতে পৃথক মেয়াদোত্তীর্ণ সময় রাখা দরকার।
আমরা হ্যাশ এন্ট্রি মান লিখলে এনকোডেড মেয়াদোত্তীর্ণ তথ্য সমেত তথ্য উপসর্গের ডেটা বাইট যোগ করে এটি প্রয়োগ করেছি, আমরা মানটি লেখার সময়টিতে মেয়াদ শেষ হওয়ার জন্য কীটি সেট করেছিলাম।
তারপরে, পড়ার সময় আমরা উপসর্গটি ডিকোড করি এবং মেয়াদোত্তীর্ণ হওয়ার জন্য পরীক্ষা করি check এটি অতিরিক্ত ওভারহেড, তবে, রিডগুলি এখনও ও (এন) থাকে এবং শেষ হ্যাশ প্রবেশের সময় শেষ হয়ে গেলে পুরো কীটি শেষ হয়ে যায়।
আপনি ব্যবহার করে 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 সন্ধান করুন)
স্কোর হিসাবে টাইমস্ট্যাম্প সহ টিটিএল ধারক পাওয়ার জন্য আপনি রেডিসে সাজানো সেট ব্যবহার করতে পারেন । উদাহরণস্বরূপ, আপনি যখনই কোনও ইভেন্টের স্ট্রিংটি সেটে .োকান আপনি ইভেন্টের সময়টিতে এর স্কোর সেট করতে পারেন। এইভাবে আপনি কল করে যে কোনও সময় উইন্ডোর ডেটা পেতে পারেন
zrangebyscore "your set name" min-time max-time
তদুপরি, আমরা zremrangebyscore "your set name" min-time max-time
পুরানো ইভেন্টগুলি সরিয়ে ব্যবহার করে মেয়াদ শেষ করতে পারি ।
এখানে কেবলমাত্র অপূর্ণতা হ'ল সেটটির আকার বজায় রাখতে আপনাকে বহিরাগত প্রক্রিয়া থেকে গৃহকর্মী করতে হবে।
রেডিস হ্যাশগুলি আপনি স্বাচ্ছন্দ্যে শেষ করতে পারেন, উদাহরণস্বরূপ পাইথন ব্যবহার করে
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)
hset
পূর্ণ মেয়াদ শেষ না হওয়া সম্পর্কে hset
।