কীভাবে কীভাবে রেডিস ব্যবহার করে কোনও প্যাটার্নের সাথে মেলে কী কীভাবে মুছে ফেলা যায়


575

আমার রেডিস ডিবিতে আমার হাতে প্রচুর prefix:<numeric_id>হ্যাশ রয়েছে।

কখনও কখনও আমি এগুলি পরমাণুভাবে মুছে ফেলতে চাই। কিছু বিতরণ লকিং মেকানিজম ব্যবহার না করে আমি কীভাবে এটি করব?


হাই স্টিভ, আমার ওয়েবসাইটটিতে কিছু সমস্যা আছে, আমি এটিকে আমার অন্যান্য ব্লগ- মাইন্ড-গেক ডটকম / নোসকিএল / রেডিস / ডিলিট -কিজ-স্পেসিফিক-এক্সপায়ার-টাইমে যুক্ত করেছি , আশা করি এটি সাহায্য করবে।
গৌরব তেওয়ারি

43
এটি এমন একটি সাধারণ দৃশ্য যা আমি আশা করি যে রেডিস টিম এটির জন্য দেশীয় কমান্ড যুক্ত করার বিষয়টি বিবেচনা করবে।
টড মেনিয়ার

আজকাল আপনি কেবল লুয়ার সাথে এটি করতে পারেন, নীচে দেখুন।
আলেকজান্ডার গ্ল্যাডিশ

3
@ টডমিনিয়ার সবেমাত্র পরামর্শ দিয়েছেন, কেন এমনটি হবে না তার জন্য এই যুক্তি ফিরে পেয়েছে: github.com/antirez/redis/issues/2042
রায়

1
প্রচুর লোক কীভাবে কী কী বিশেষ সংখ্যা, কী কী বিশেষ অক্ষর সহ কীগুলি পরিচালনা করতে হয় সে সম্পর্কে সম্পর্কিত প্রশ্ন জিজ্ঞাসা করেছিলাম separate এখানে অন্যান্য প্রশ্ন হল stackoverflow.com/questions/32890648/...
jakejgordon

উত্তর:


431

রেডিস ২. with.০ দিয়ে শুরু করে আপনি লুয়া স্ক্রিপ্টগুলি চালাতে পারেন যা পরমাণুর সাথে চালিত হয়। আমি কখনই একটি লিখিনি, তবে আমি মনে করি এটি দেখতে এরকম কিছু হবে

EVAL "return redis.call('del', unpack(redis.call('keys', ARGV[1])))" 0 prefix:[YOUR_PREFIX e.g delete_me_*]

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

দেখুন Eval ডকুমেন্টেশন


23
গুরুত্বপূর্ণ দ্রষ্টব্য: আপনার যদি উপসর্গের সাথে মিলছে কয়েক হাজারেরও বেশি কী থাকে তবে এটি ব্যর্থ হয়।
নাথান ওসমান

93
এটি এক বিশাল সংখ্যক কীগুলির জন্য কাজ করছে:EVAL "local keys = redis.call('keys', ARGV[1]) \n for i=1,#keys,5000 do \n redis.call('del', unpack(keys, i, math.min(i+4999, #keys))) \n end \n return keys" 0 prefix:*
শেরুন

181
খুব ... redis সরল কী / স্টোর ক্যাশে হিসাবে প্রচুর ব্যবহৃত হয়। এটি del prefix:* একটি মৌলিক অপারেশন হওয়া উচিত বলে মনে হচ্ছে : /
রায়

5
@ রে খোলামেলাভাবে, যদি আপনার এই বৈশিষ্ট্যের প্রয়োজন হয় তবে আপনার কেবলমাত্র নিউম্যাটিক ডাটাবেস বা সার্ভার দ্বারা ডেটা ভাগ করা উচিত এবং ফ্লাশ / ফ্লাশডবি ব্যবহার করা উচিত
মার্ক গ্র্যাভেল

9
হ্যাঁ এটি ব্যর্থ হয় যদি কোনও কী প্যাটার্নের সাথে মেলে না। আমি একটি ডিফল্ট কী যুক্ত করেছি তা ঠিক করতে:EVAL "return redis.call('del', 'defaultKey', unpack(redis.call('keys', ARGV[1])))" 0 prefix:*
ম্যানুয়েলমিটার

706

বাশে কার্যকর করুন:

redis-cli KEYS "prefix:*" | xargs redis-cli DEL

হালনাগাদ

ওকে আমি বুঝতে পেরেছি. এই উপায় সম্পর্কে কী: বর্তমান অতিরিক্ত বর্ধিত উপসর্গ সঞ্চয় করুন এবং আপনার সমস্ত কীতে এটি যুক্ত করুন। উদাহরণ স্বরূপ:

আপনার মত মান আছে:

prefix_prefix_actuall = 2
prefix:2:1 = 4
prefix:2:2 = 10

আপনার যখন ডেটা পরিষ্কার করতে হবে, আপনি প্রথমে উপসর্গ_্যাক্টুয়াল পরিবর্তন করুন (উদাহরণস্বরূপ উপসর্গ_প্রিফিক্স_্যাক্টুয়াল = 3 সেট করুন), সুতরাং আপনার অ্যাপ্লিকেশনটি কী উপসর্গ: 3: 1 এবং উপসর্গ: 3: 2 তে নতুন ডেটা লিখবে। তারপরে আপনি উপসর্গ: 2: 1 এবং উপসর্গ: 2: 2 থেকে নিরাপদে পুরানো মানগুলি নিতে পারেন এবং পুরানো কীগুলি সাফ করতে পারেন।


14
দুঃখিত, তবে এটি পারমাণবিক মোছা নয়। কেইওয়াইএস এবং ডেল এর মধ্যে নতুন কী যুক্ত করতে পারে। আমি সেগুলি মুছতে চাই না।
আলেকজান্ডার গ্ল্যাডিশ

36
কীগুলি, যা KEYS কমান্ড মোছার পরে তৈরি হবে।
কেসি

6
আমার কিছু খারাপ কী সাফ করার দরকার ছিল, তাই ক্যাসির প্রথম উত্তরটি স্পট ছিল, ব্যতীত আমাকে উদ্ধৃতিগুলির বাইরে কীগুলি স্থানান্তর করতে হবে: redis-cli KEYS "উপসর্গ: *" | xargs redis-cli DEL
15-10 এ

19
প্রথম উত্তরটিও আমাকে সাহায্য করেছিল। আরেকটি বৈকল্পিক যদি আপনার redis কী কোট বা অন্যান্য অক্ষর xargs আপ জগাখিচুড়ি যে:redis-cli KEYS "prefix:*" | xargs --delim='\n' redis-cli DEL
চিন্তা কোরো

18
: আপনাকে db3 অপসারণ কী প্রয়োজন বলে আপনি multible ডাটাবেস (keyspaces) থাকতে তাহলে এই কৌতুকredis-cli -n 3 KEYS "prefix:*" | xargs redis-cli -n 3 DEL
Christoffer

73

লুয়ায় প্রয়োগ করা একটি ওয়াইল্ডকার্ড মোছার সম্পূর্ণ কার্যকারী এবং পারমাণবিক সংস্করণ এখানে। অনেক কম নেটওয়ার্ক ব্যাক-অ্যান্ড-ওয়ার্ল্ড হওয়ার কারণে এটি xargs সংস্করণের চেয়ে অনেক দ্রুত চলবে এবং এটি সম্পূর্ণ পারমাণবিক, এটি শেষ না হওয়া পর্যন্ত রেডিসের বিরুদ্ধে অন্য কোনও অনুরোধকে অবরুদ্ধ করে। আপনি যদি রেডিস ২.6.০ বা তার চেয়ে বড় সংকেতগুলি কীভাবে মুছে ফেলতে চান তবে অবশ্যই এটি যাওয়ার উপায়:

redis-cli -n [some_db] -h [some_host_name] EVAL "return redis.call('DEL', unpack(redis.call('KEYS', ARGV[1] .. '*')))" 0 prefix:

এটি এই প্রশ্নের উত্তরে @ এমসিডিজিলের ধারণার একটি কার্যকারী সংস্করণ। ধারণার জন্য ক্রেডিট 100% তার কাছে যায়।

সম্পাদনা: নীচে কিকিটোর মন্তব্য অনুসারে, আপনার যদি রেডিস সার্ভারে ফ্রি মেমরির চেয়ে মুছতে আরও কী থাকে তবে আপনি "আনপ্যাক করার জন্য অনেকগুলি উপাদান" ত্রুটিতে চলে যাবেন । সেক্ষেত্রে, করুন:

for _,k in ipairs(redis.call('keys', ARGV[1])) do 
    redis.call('del', k) 
end

কিকিতো যেমন পরামর্শ দিয়েছে।


10
উপরের কোডটি যদি আপনার কাছে উল্লেখযোগ্য সংখ্যক কী থাকে (ত্রুটিটি "আনপ্যাক করার জন্য অনেকগুলি উপাদান রয়েছে") তখন ট্যাঙ্ক হয়ে যাবে। আমি লুয়া অংশে একটি লুপ ব্যবহার করার পরামর্শ দিচ্ছি:for _,k in ipairs(redis.call('keys', KEYS[1])) do redis.call('del', k) end
কিকিতো

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

1
লুয়ার unpackএকটি "স্বতন্ত্র ভেরিয়েবলের তালিকায়" একটি টেবিলে রূপান্তরিত হয় (অন্যান্য ভাষাগুলি explodeএটিকে ডাকছে ) তবে সর্বাধিক সংখ্যাটি সিস্টেম মেমরির উপর নির্ভর করে না; এটি LUAI_MAXSTACKধ্রুবক মাধ্যমে লুয়া স্থির। লুয়া 5.1 এবং লুয়াজিটিতে এটি 8000 এবং লুয়া 5.2 এ 100000 রয়েছে for লুপ বিকল্পটি আইএমওর জন্য প্রস্তাবিত।
কিকিতো

1
এটি লক্ষণীয় যে লুয়া স্ক্রিপ্টিং কেবলমাত্র রেডিস ২.6 আপ থেকে পাওয়া যায়
ওয়াল্যাকার

1
যে কোনও লুয়া-ভিত্তিক সমাধান সেমেন্টিকস লঙ্ঘন করবে EVALযেহেতু এটি কীগুলি চালিত করবে তা আগাম নির্দিষ্ট করে দেয় না। এটি একটি একক ক্ষেত্রে কাজ করা উচিত তবে এটি রেডিস ক্লাস্টারের সাথে কাজ করবে বলে আশা করবেন না।
কেভিন ক্রিস্টোফার হেনরি

66

দাবি অস্বীকার : নিম্নলিখিত সমাধানটি পারমাণবিকতা সরবরাহ করে না

V2.8 দিয়ে শুরু করে আপনি সত্যই KYYS [1] এর পরিবর্তে SCAN কমান্ডটি ব্যবহার করতে চান । নিম্নলিখিত বাশ স্ক্রিপ্টটি প্যাটার্ন অনুসারে কী মোছার চিত্র প্রদর্শন করে:

#!/bin/bash

if [ $# -ne 3 ] 
then
  echo "Delete keys from Redis matching a pattern using SCAN & DEL"
  echo "Usage: $0 <host> <port> <pattern>"
  exit 1
fi

cursor=-1
keys=""

while [ $cursor -ne 0 ]; do
  if [ $cursor -eq -1 ]
  then
    cursor=0
  fi

  reply=`redis-cli -h $1 -p $2 SCAN $cursor MATCH $3`
  cursor=`expr "$reply" : '\([0-9]*[0-9 ]\)'`
  keys=${reply##[0-9]*[0-9 ]}
  redis-cli -h $1 -p $2 DEL $keys
done

[1] KEYS হ'ল একটি বিপজ্জনক কমান্ড যা সম্ভবত কোনও ডস-এর ফলাফল দিতে পারে। নিম্নলিখিতটি এর ডকুমেন্টেশন পৃষ্ঠা থেকে একটি উদ্ধৃতি:

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

আপডেট: একই বেসিক প্রভাবের জন্য একটি লাইনার -

$ redis-cli --scan --pattern "*:foo:bar:*" | xargs -L 100 redis-cli DEL

9
তবুও, কেইওয়াইএস এড়ানো নিখুঁতভাবে সেরা অনুশীলন হিসাবে বিবেচিত হয়, তাই অ-পারমাণবিক মুছে ফেলা সম্ভব যেখানেই এটি এটি একটি দুর্দান্ত সমাধান।
মারাত্মক_অরর

এটি আমার পক্ষে কাজ করেছিল; যাইহোক, আমার কীগুলি ডাটাবেস 1 এ ছিল So সুতরাং আমাকে -n 1প্রতিটি redis-cliঅনুরোধে যুক্ত করতে হয়েছিল :redis-cli -n 1 --scan --pattern "*:foo:bar:*" | xargs -L 100 redis-cli -n 1 DEL
রব জোহেনসান

মনে রাখবেন যে আপনার কীগুলিতে বিশেষ অক্ষর রয়েছে
mr1031011

আকর্ষণীয় এবং মূল্যবান সন্ধান ... আমি অবাক হয়েছি xargs এর জন্য জিনিস উদ্ধৃত করার কোনও উপায় আছে কিনা ...
Itamar Haber

-এল 100 কি করে ??
অপর্ণা

41

যাঁরা অন্যান্য উত্তরগুলির বিশ্লেষণ করতে সমস্যায় পড়ছিলেন তাদের জন্য:

eval "for _,k in ipairs(redis.call('keys','key:*:pattern')) do redis.call('del',k) end" 0

key:*:patternআপনার নিজস্ব প্যাটার্ন দিয়ে প্রতিস্থাপন করুন এবং এটি প্রবেশ করুন redis-cliএবং আপনি যেতে ভাল।

ক্রেডিট লিসকো থেকে: http://redis.io/commands/del


37

আমি redis 3.2.8 এ নীচের কমান্ডটি ব্যবহার করছি

redis-cli KEYS *YOUR_KEY_PREFIX* | xargs redis-cli DEL

আপনি কীগুলি প্যাটার্ন অনুসন্ধান সম্পর্কিত আরও সহায়তা পেতে পারেন এখান থেকে: - https://redis.io/commands/keys । আপনার প্রয়োজন মতো *YOUR_KEY_PREFIX*বা আপনার পছন্দ অনুযায়ী সুবিধাজনক গ্লোব-স্টাইলের প্যাটার্নটি ব্যবহার করুনYOUR_KEY_PREFIX?? অন্য কোনও ।

এবং যদি কারও নীচের ফাংশনের চেয়ে রেডিস পিএইচপি লাইব্রেরি সংহত করে থাকে তবে আপনাকে সহায়তা করবে।

flushRedisMultipleHashKeyUsingPattern("*YOUR_KEY_PATTERN*"); //function call

function flushRedisMultipleHashKeyUsingPattern($pattern='')
        {
            if($pattern==''){
                return true;
            }

            $redisObj = $this->redis;
            $getHashes = $redisObj->keys($pattern);
            if(!empty($getHashes)){
                $response = call_user_func_array(array(&$redisObj, 'del'), $getHashes); //setting all keys as parameter of "del" function. Using this we can achieve $redisObj->del("key1","key2);
            }
        }

ধন্যবাদ :)


23

@ এমসিডিজলের সমাধানটি কাজ করছে না এটি কেবল একটি প্রবেশের জন্য কাজ করে।

এটি একই উপসর্গ সহ সমস্ত কীগুলির জন্য কাজ করে

EVAL "for i, name in ipairs(redis.call('KEYS', ARGV[1])) do redis.call('DEL', name); end" 0 prefix*

দ্রষ্টব্য: আপনার কী উপসর্গের সাথে 'উপসর্গ' প্রতিস্থাপন করা উচিত ...


2
লুয়া ব্যবহার করা xargs ব্যবহারের চেয়ে 10 ^ 4 ক্রমান্বয়ে দ্রুততর হয়।
দীপক

22

আপনি কীগুলি মুছতে এই আদেশটি ব্যবহার করতে পারেন: -

ধরুন আপনার রেডিসে অনেক ধরণের কী রয়েছে যেমন-

  1. 'Xyz_category_fpc_12'
  2. 'Xyz_category_fpc_245'
  3. 'Xyz_category_fpc_321'
  4. 'Xyz_product_fpc_876'
  5. 'Xyz_product_fpc_302'
  6. 'Xyz_product_fpc_01232'

সাবেক ' xyz_category_fpc ' এখানে Xyz একটি হল SITENAME , এবং এই কী-পণ্য এবং একটি ই-কমার্স সাইটের বিভাগ এর সাথে সম্পর্কিত এবং FPC দ্বারা তৈরি হয়।

আপনি যদি এই আদেশটি নীচের হিসাবে ব্যবহার করেন-

redis-cli --scan --pattern 'key*' | xargs redis-cli del

অথবা

redis-cli --scan --pattern 'xyz_category_fpc*' | xargs redis-cli del

এটি ' xyz_category_fpc ' (1, 2 এবং 3 কী মুছুন) এর মতো সমস্ত কী মুছে ফেলে । অন্যান্য 4, 5 এবং 6 নম্বর কীগুলি মুছতে ' xyz_product_fpc ব্যবহার করুন জন্য উপরের কমান্ডে ' ।

যদি আপনি চাই প্রতি সবকিছু মুছে মধ্যে Redis , তবে এই Commands- অনুসরণ

রেডিস-ক্লাই্ট সহ:

  1. FLUSHDB - আপনার সংযোগের বর্তমান ডাটাবেস থেকে ডেটা সরায়।
  2. ফ্লাশ - সমস্ত ডাটাবেস থেকে ডেটা সরায়।

উদাহরণস্বরূপ: - আপনার শেলের মধ্যে:

redis-cli flushall
redis-cli flushdb

3
ধন্যবাদ, তবে পাইপিং আউটপুট redis-cli delপারমাণবিক নয়।
আলেকজান্ডার গ্ল্যাডিশ

13

কীগুলির নামে আপনার কাছে স্থান থাকলে আপনি এটিকে ব্যাশে ব্যবহার করতে পারেন:

redis-cli keys "pattern: *" | xargs -L1 -I '$' echo '"$"' | xargs redis-cli del

10

@ ইটামারের উত্তর দুর্দান্ত, তবে উত্তরের পার্সিং আমার পক্ষে কাজ করছে না, এসএসপি। যে ক্ষেত্রে কোনও প্রদত্ত স্ক্যানে কোনও কী পাওয়া যায় না। সরাসরি কনসোল থেকে একটি সম্ভবত সহজ সমাধান:

redis-cli -h HOST -p PORT  --scan --pattern "prefix:*" | xargs -n 100 redis-cli DEL

এটি স্ক্যানও ব্যবহার করে যা উত্পাদনে কেইএসএসের চেয়ে পছন্দসই, তবে এটি পারমাণবিক নয়।


8

আমি ঠিক একই সমস্যা। আমি বিন্যাসে ব্যবহারকারীর জন্য সেশন ডেটা সংরক্ষণ করেছি:

session:sessionid:key-x - value of x
session:sessionid:key-y - value of y
session:sessionid:key-z - value of z

সুতরাং, প্রতিটি এন্ট্রি একটি পৃথক কী-মান যুগল ছিল। সেশনটি নষ্ট হয়ে গেলে, আমি প্যাটার্নটি দিয়ে কীগুলি মুছে ফেলে সমস্ত সেশন ডেটা সরিয়ে ফেলতে চেয়েছিলামsession:sessionid:* - তবে রেডিসের কোনও ফাংশন নেই।

আমি যা করেছি: একটি হ্যাশের মধ্যে সেশন ডেটা সংরক্ষণ করুন । আমি শুধু এর হ্যাশ আইডি সহ একটি হ্যাশ তৈরি session:sessionidএবং তারপর আমি ধাক্কা key-x, key-y, key-zযে হ্যাশ মধ্যে (ক্রম না ব্যাপার আমার কি) এবং যদি আমি প্রয়োজন যে হ্যাশ আর আমি শুধু একটি না আত DEL session:sessionidএবং যে হ্যাশ আইডি সাথে সম্পর্কিত সকল ডেটা সর্বস্বান্ত হয়। DELপারমাণবিক এবং হ্যাশে ডেটা / লেখার ডেটা অ্যাক্সেস করা হ'ল ও (1)।


ভাল সমাধান, তবে আমার মানগুলি নিজেরাই হ্যাশ। এবং রেডিস অন্য হ্যাশের ভিতরে হ্যাশ সঞ্চয় করে।
আলেকজান্ডার গ্ল্যাডিশ

3
তবে, একটি হ্যাশের মধ্যে থাকা ক্ষেত্রগুলির মেয়াদ শেষ হওয়ার কার্যকারিতা নেই, যা কখনও কখনও সত্যই কার্যকর।
এভি গান

আমার কাছে এটি এখন পর্যন্ত সবচেয়ে পরিষ্কার / সহজ উত্তর
সেবাস্তিয়ান এইচ।

একটি সেট কি আরও বেশি অর্থবোধ করে না?
জ্যাক টক

5

আমি মনে করি যা আপনাকে মাল্টি / এক্সেক / ডিসকার্ডে সহায়তা করতে পারে । যদিও 100% লেনদেনের সমতুল্য নয় , আপনার অন্য আপডেটগুলি থেকে মুছে ফেলা পৃথক করতে সক্ষম হওয়া উচিত।


4
তবে এগুলি এখানে কীভাবে ব্যবহার করবেন তা আমি বুঝতে পারি না। ডেল নিজে থেকেই পারমাণবিক (বা তাই আমি মনে করি)। এবং আমি এক্সইসি না করা পর্যন্ত আমি কেইএস এর কাছ থেকে মান পেতে পারি না, তাই আমি একই মাল্টিতে কেইএস এবং ডেল ব্যবহার করতে পারি না।
আলেকজান্ডার গ্ল্যাডিশ

5

অবগতির জন্য।

  • শুধুমাত্র বাশ এবং ব্যবহার করে redis-cli
  • ব্যবহার না করা keys(এটি ব্যবহার করে scan)
  • ক্লাস্টার মোডে ভাল কাজ করে
  • পারমাণবিক নয়

হতে পারে আপনার কেবলমাত্র মূল অক্ষরগুলি সংশোধন করতে হবে।

scan-match.sh

#!/bin/bash
rcli=“/YOUR_PATH/redis-cli" 
default_server="YOUR_SERVER"
default_port="YOUR_PORT"
servers=`$rcli -h $default_server -p $default_port cluster nodes | grep master | awk '{print $2}' | sed 's/:.*//'`
if [ x"$1" == "x" ]; then 
    startswith="DEFAULT_PATTERN"
else
    startswith="$1"
fi
MAX_BUFFER_SIZE=1000
for server in $servers; do 
    cursor=0
    while 
        r=`$rcli -h $server -p $default_port scan $cursor match "$startswith*" count $MAX_BUFFER_SIZE `
        cursor=`echo $r | cut -f 1 -d' '`
        nf=`echo $r | awk '{print NF}'`
        if [ $nf -gt 1 ]; then
            for x in `echo $r | cut -f 1 -d' ' --complement`; do 
                echo $x
            done
        fi
        (( cursor != 0 ))
    do
        :
    done
done

clear-redis-key.sh

#!/bin/bash
STARTSWITH="$1"

RCLI=YOUR_PATH/redis-cli
HOST=YOUR_HOST
PORT=6379
RCMD="$RCLI -h $HOST -p $PORT -c "

./scan-match.sh $STARTSWITH | while read -r KEY ; do
    $RCMD del $KEY 
done

বাশ প্রম্পটে রান করুন

$ ./clear-redis-key.sh key_head_pattern

5

আপনার কীতে বিশেষ অক্ষর রয়েছে - অন্য উত্তরগুলি কাজ করতে পারে না - Guide$CLASSMETADATA][1]উদাহরণস্বরূপ। প্রতিটি কীগুলিকে উদ্ধৃতিতে মুড়িয়ে দেওয়া নিশ্চিত করবে যে তারা সঠিকভাবে মোছা হবে:

redis-cli --scan --pattern sf_* | awk '{print $1}' | sed "s/^/'/;s/$/'/" | xargs redis-cli del

2
এই স্ক্রিপ্টটি 25000 টিরও বেশি কী সহ পরীক্ষিত, নিখুঁতভাবে কাজ করে।
জর্দি

1
আপনি এই মজার অভিব্যক্তি `awk '{মুদ্রণ"' "" "" "$ 1" "" "" "" "} '` ব্যবহার করে একক উদ্ধৃতি যুক্ত করতে পারেন
রবার্তো কঙ্গিউ

3

KEYS (প্রোডাকশন সার্ভারগুলির জন্য প্রস্তাবিত) এর পরিবর্তে স্ক্যান ব্যবহার করে এমন একটি সংস্করণ --pipe

আমি xargs এর চেয়ে পাইপ পছন্দ করি কারণ এটি আরও কার্যকর এবং যখন আপনার কীগুলিতে কোট বা অন্য বিশেষ অক্ষর থাকে যা চেষ্টা করে এবং ব্যাখ্যা দিয়ে আপনার শেল থাকে works এই উদাহরণস্বরূপ রেজেক্সের বিকল্পটি কীটি ডাবল কোটে মুড়ে ফেলে এবং কোনও ডাবল উদ্ধৃতি ভিতরে insideুকে যায়।

export REDIS_HOST=your.hostname.com
redis-cli -h "$REDIS_HOST" --scan --pattern "YourPattern*" > /tmp/keys
time cat /tmp/keys | perl -pe 's/"/\\"/g;s/^/DEL "/;s/$/"/;'  | redis-cli -h "$REDIS_HOST" --pipe

এই সমাধানটি প্রায় 7 মি কী এমনকি আমার পক্ষে ভাল কাজ করেছে!
ড্যানি

2

এটি প্রশ্নের সরাসরি উত্তর নয়, তবে যেহেতু আমি আমার নিজের উত্তর অনুসন্ধান করতে গিয়ে এখানে এসেছি, আমি এটি এখানে ভাগ করব।

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

নিম্নলিখিত পদ্ধতিরটি অনস্বীকার্যভাবে কুৎসিত, তবে আমি এর চেয়ে ভাল আর খুঁজে পাইনি। পারমাণবিকতা এখানে প্রশ্নবিদ্ধ নয়, এক্ষেত্রে মূল লক্ষ্য হ'ল রেডিসকে আপ এবং প্রতিক্রিয়াশীল 100% সময় রাখা। এটি একদম কার্যকরভাবে কাজ করবে যদি আপনার কোনও কী ডাটাবেসে আপনার কী থাকে এবং আপনার কোনও প্যাটার্নের সাথে মিলের প্রয়োজন না হয় তবে এটি প্রকৃতির অবরুদ্ধতার কারণে http://redis.io/commands/FLUSHDB ব্যবহার করতে পারবেন না ।

আইডিয়াটি সহজ: একটি স্ক্রিপ্ট লিখুন যা একটি লুপে চলে এবং O (1) অপারেশন যেমন http://redis.io/commands/SCAN বা http://redis.io/commands/RANDOMKEY ব্যবহার করে কীগুলি প্রাপ্ত করে, যদি তারা পরীক্ষা করে প্যাটার্নটি মেলে (যদি আপনার এটি প্রয়োজন হয়) এবং http://redis.io/commands/Del একে একে করুন।

এটি করার আরও ভাল উপায় যদি থাকে তবে দয়া করে আমাকে জানান, আমি উত্তরটি আপডেট করব।

রবিতে র্যান্ডমকি দিয়ে উদাহরণ প্রয়োগকরণ, রেক টাস্ক হিসাবে, এর মতো কোনও অ-অবরুদ্ধ বিকল্প redis-cli -n 3 flushdb:

desc 'Cleanup redis'
task cleanup_redis: :environment do
  redis = Redis.new(...) # connection to target database number which needs to be wiped out
  counter = 0
  while key = redis.randomkey               
    puts "Deleting #{counter}: #{key}"
    redis.del(key)
    counter += 1
  end
end

2

এটি ফাস্টোরেডিসে "শাখা সরান" কার্যকারিতার মাধ্যমে সহজভাবে প্রয়োগ করা হয় , কেবল যে শাখাটি আপনি মুছে ফেলতে চান তা নির্বাচন করুন।

এখানে চিত্র বর্ণনা লিখুন


এটি কি এটি পরমাণুভাবে করে? এবং কোডে এটি কীভাবে সহায়তা করে ?
ম্যাথু

2

দয়া করে এই আদেশটি ব্যবহার করুন এবং চেষ্টা করুন:

redis-cli --raw keys "$PATTERN" | xargs redis-cli del

পারমাণবিক নয় এবং অন্যান্য উত্তরগুলির সদৃশ।
ম্যাথু

1

আমি উপরে উল্লিখিত বেশিরভাগ পদ্ধতি চেষ্টা করেছি তবে সেগুলি আমার পক্ষে কার্যকর হয়নি, কিছু অনুসন্ধানের পরে আমি এই পয়েন্টগুলি পেয়েছি:

  • যদি আপনার রেডিসে একাধিক ডিবি থাকে তবে আপনার ব্যবহার করে ডাটাবেস নির্ধারণ করা উচিত -n [number]
  • আপনার যদি কয়েকটি কী ব্যবহার হয় delতবে যদি হাজার বা মিলিয়ন কী থাকে তবে এটি ব্যবহার করা ভাল unlinkকারণ ডিল ব্লক করার সময় আনলিংক অ-ব্লক করা হয়, আরও তথ্যের জন্য এই পৃষ্ঠায় দেখুন আনলিংক বনাম দেলটি দেখুন
  • এছাড়াও keysডেল মত এবং অবরুদ্ধ হয়

সুতরাং আমি এই কোডটি প্যাটার্ন অনুসারে কীগুলি মুছতে ব্যবহার করেছি:

 redis-cli -n 2 --scan --pattern '[your pattern]' | xargs redis-cli -n 2 unlink 

0

দরিদ্র মানুষের পারমাণবিক ভর-মুছা?

ভবিষ্যতে কয়েক মিনিটের মতো - আপনি হয়ত তাদের সকলকে একই দ্বিতীয়টি এক্সপায়ারেটে সেট করতে পারেন এবং তারপরে সেই সময়ের জন্য অপেক্ষা করুন এবং একই সাথে তাদের সকলকে "স্ব-ধ্বংসাত্মক" দেখুন।

তবে কীভাবে পারমাণবিক হবে তা আমি নিশ্চিত নই।


0

এখনকার বিজ্ঞাপনে, আপনি একটি রেডিস ক্লায়েন্ট ব্যবহার করতে পারেন এবং প্রথমে স্ক্যান করতে পারেন (প্যাটার্ন মেলানো সমর্থন করে) এবং তারপরে প্রতিটি কী পৃথকভাবে দেল করতে পারেন।

যাইহোক, সরকারী redis উপর একটি বিষয় একটি বিড়বিড়-ম্যাচিং-দেল তৈরি করতে GitHub হয় এখানে , চলতে চলতে কিছু ভালবাসা প্রদর্শন আপনি এটি লাভজনক কিনা!


-1

আমি কিছু সরঞ্জাম থাকা বা লুয়া এক্সপ্রেশন কার্যকর করতে সম্পর্কিত সমস্ত উত্তরকে সমর্থন করি।

আমার পক্ষ থেকে আরও একটি বিকল্প:

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

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

public class DataCleaner {

    public static void main(String args[]) {
        String keyPattern = args[0];
        String host = args[1];
        int port = Integer.valueOf(args[2]);
        int dbIndex = Integer.valueOf(args[3]);

        Jedis jedis = new Jedis(host, port);

        int deletedKeysNumber = 0;
        if(dbIndex >= 0){
            deletedKeysNumber += deleteDataFromDB(jedis, keyPattern, dbIndex);
        } else {
            int dbSize = Integer.valueOf(jedis.configGet("databases").get(1));
            for(int i = 0; i < dbSize; i++){
                deletedKeysNumber += deleteDataFromDB(jedis, keyPattern, i);
            }
        }

        if(deletedKeysNumber == 0) {
            System.out.println("There is no keys with key pattern: " + keyPattern + " was found in database with host: " + host);
        }
    }

    private static int deleteDataFromDB(Jedis jedis, String keyPattern, int dbIndex) {
        jedis.select(dbIndex);
        Set<String> keys = jedis.keys(keyPattern);
        for(String key : keys){
            jedis.del(key);
            System.out.println("The key: " + key + " has been deleted from database index: " + dbIndex);
        }

        return keys.size();
    }

}


-3

স্প্রিং রেডিসটেম্পলেট নিজেই কার্যকারিতা সরবরাহ করে। সর্বশেষতম সংস্করণে রেডিসনক্লিয়েন্ট "মুছে ফেলা প্যাটার্ন" কার্যকারিতা হ্রাস করেছে।

Set<String> keys = redisTemplate.keys("geotag|*");
redisTemplate.delete(keys);

2
আমি রেডিসন নমুনা কোড আপডেট করেছি। আপনার কোডটি রেডিসনের মতো পারমাণবিক পদ্ধতির নয়। নতুন কীগুলি keysএবং deleteপদ্ধতির আমন্ত্রণের মধ্যে উপস্থিত হতে পারে ।
নিকিতা কোকশারভ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.