यूनिक्स के लिए मानक कुंजी / मूल्य डेटास्टोर


16

मैं के बारे में पता कुंजी / मान यूनिक्स के लिए पुस्तकालयों ( BerkeleyDB , gdbm , redis ...)। लेकिन इससे पहले कि मैं कोडिंग शुरू करूं, मुझे आश्चर्य है कि अगर यूनिक्स के लिए एक मानक उपकरण है जो मुझे निम्नलिखित संचालन करने की अनुमति देगा:

$ tool -f datastore.db put "KEY" "VALUE"
$ tool -f datastore.db put -f file_key_values.txt
$ tool -f datastore.db get "KEY"
$ tool -f datastore.db get -f file_keys.txt
$ tool -f datastore.db remove "KEY"
$ etc...

धन्यवाद

जवाबों:


10

मुझे नहीं लगता कि इसके लिए कोई मानक उपकरण है। को छोड़कर grep/ awk/ sedआदि लेकिन इसके उपयोग से आपको बहुत से अन्य मुद्दों जैसे लॉकिंग, प्रारूप, विशेष वर्ण इत्यादि के बारे में ध्यान रखने की आवश्यकता होगी।

मैं उपयोग करने का सुझाव देता हूं sqlite। एक साधारण तालिका को परिभाषित करें और फिर फ़ंक्शन tool_get()और tool_put()शेल फ़ंक्शन बनाएं । sqliteपोर्टेबल है, तेज है।

आपको मुफ्त में अतिरिक्त लचीलापन मिलेगा। आप अपनी स्क्रिप्ट को मोड़ने के लिए बाधाओं, सूचकांक को परिभाषित कर सकते हैं या किसी दिन अन्य भाषाओं में उस डीबी का उपयोग कर सकते हैं।


धन्यवाद । मैंने जल्दी से स्क्वैलाइट एपीआई के साथ एक टूल लिखा। यह बढ़िया काम करता है।
पियरे

9

यदि आपका डेटाबेस काफी छोटा है, तो आप फाइलसिस्टम का उपयोग कर सकते हैं। इस दृष्टिकोण का लाभ यह है कि यह बहुत कम तकनीक वाला है, और बहुत कम कोड के साथ हर जगह काम करेगा। यदि कुंजियाँ मुद्रण योग्य वर्णों से बनी होती हैं और उनमें शामिल नहीं होती हैं /, तो आप उन्हें फ़ाइल नामों के रूप में उपयोग कर सकते हैं:

put () { key=$1; value=$2; printf %s "$value" >"datastore.db/$key"; }
get () { key=$1; cat "datastore.db/$key"; }
remove () { key=$1; rm "datastore.db/$key"; }

मनमानी कुंजी को समायोजित करने के लिए, फ़ाइल नाम के रूप में कुंजी के एक चेकसम का उपयोग करें, और वैकल्पिक रूप से कुंजी की एक प्रति संग्रहीत करें (जब तक आप कुंजी को सूचीबद्ध करने में सक्षम नहीं होते हैं या किसी दिए गए प्रविष्टि के लिए कुंजी क्या है यह बताने में सक्षम नहीं होते हैं)।

put () {
  key=$1; value=$2; set $(printf %s "$key" | sha1sum); sum=$1
  printf %s "$key" >"datastore.db/$sum.key"
  printf %s "$value" >"datastore.db/$sum.value"
}
get () {
  key=$1; set $(printf %s "$key" | sha1sum); sum=$1
  cat "datastore.db/$1.value"
}
remove () {
  key=$1; set $(printf %s "$key" | sha1sum); sum=$1
  rm "datastore.db/$1.key" "datastore.db/$1.value"
}

ध्यान दें कि ऊपर दिए गए खिलौने का कार्यान्वयन पूरी कहानी नहीं है: उनके पास कोई उपयोगी लेन-देन की संपत्ति नहीं है जैसे कि परमाणु। फ़ाइल निर्माण और नाम बदलने जैसे बुनियादी फाइल सिस्टम संचालन हालांकि परमाणु हैं, और ऊपर के कार्यों के परमाणु संस्करणों का निर्माण संभव है।

ये प्रत्यक्ष-से-फ़ाइल सिस्टम कार्यान्वयन केवल छोटे डेटाबेस के लिए, कुछ हज़ार फ़ाइलों तक के विशिष्ट फ़ाइल सिस्टम के साथ उपयुक्त हैं। इस बिंदु से परे, अधिकांश फाइल सिस्टम में बड़ी निर्देशिकाओं का सामना करने में कठिन समय होता है। आप स्तरित लेआउट का उपयोग करके योजना को बड़े डेटाबेस में अनुकूलित कर सकते हैं। उदाहरण के लिए, सभी फ़ाइलों को एक निर्देशिका में संग्रहीत करने के बजाय, उन्हें उनके नामों के पहले कुछ वर्णों के आधार पर अलग-अलग उपनिर्देशिकाओं में संग्रहीत करें। उदाहरण के लिए, यह git क्या करता है: SHA-1 हैश द्वारा अनुक्रमित इसकी वस्तुएं, नामक फाइलों में संग्रहीत होती हैं .git/objects/01/2345679abcdef0123456789abcdef01234567। प्रोग्राम के अन्य उदाहरण जो सिमेंटिक लेयरिंग का उपयोग करते हैं वे हैं वेब कैशिंग प्रॉक्सिस Wwwoffle और पोलिपो ; दोनों एक URL की कैश्ड कॉपी को एक फ़ाइल में URL पर मिली फ़ाइल में संग्रहीत करते हैंwww.example.com/HASH जहाँ एचएएसएच URL के कुछ हैश की एन्कोडिंग है। encoding

अक्षमता का एक अन्य स्रोत यह है कि ज्यादातर फाइल सिस्टम छोटी फाइलों को स्टोर करते समय बहुत अधिक जगह बर्बाद करते हैं - फाइल के आकार से स्वतंत्र रूप से, विशिष्ट फाइल सिस्टम पर प्रति फ़ाइल 2kB तक की बर्बादी होती है।

यदि आप एक वास्तविक डेटाबेस के साथ जाना चुनते हैं, तो आपको पारदर्शी फाइल सिस्टम एक्सेस की सुविधा से गुजरने की जरूरत नहीं है। वहाँ कई हैं फ्यूज करने के लिए फ़ाइल सिस्टम का उपयोग डेटाबेस बर्कले डीबी (साथ सहित जेफ Garzik के dBFS ), ओरेकल (साथ ओरेकल dBFS ), MySQL (साथ mysqlfs ), आदि

¹ की तरह एक यूआरएल के लिए http://unix.stackexchange.com/questions/21943/standard-key-value-datastore-for-unix, Polipo फ़ाइल का उपयोग करता है unix.stackexchange.com/M0pPbpRufiErf4DLFcWlhw==, फ़ाइल स्पष्ट पाठ में वास्तविक URL का संकेत अंदर एक अतिरिक्त हेडर के साथ; फ़ाइल का नाम URL के MD5 हैश (बाइनरी में) का बेस 64 एन्कोडिंग है। Wwwoffle फ़ाइल का उपयोग करता है http/unix.stackexchange.com/DM0pPbpRufiErf4DLFcWlhw; फ़ाइल का नाम MD5 हैश की एक घर-निर्मित एन्कोडिंग है, और एक साथी फ़ाइल http/unix.stackexchange.com/UM0pPbpRufiErf4DLFcWlhwमें URL है।


7

dbmutilआपको जो चाहिए वो आपको मिल सकता है। यह आपके द्वारा प्रश्न में वर्णित संचालन के लिए शेल उपयोगिताओं है। मैं यह नहीं कहूंगा कि यह बिल्कुल मानक है, लेकिन इसमें वह सुविधाएं हैं जो आप चाहते हैं।


5

चूंकि आपने इसे नाम दिया है, मानक रेडिस क्लाइंट के माध्यम से एक कमांड लाइन इंटरफ़ेस है redis-cli। कुछ उदाहरण redis-cli -h:

 cat /etc/passwd | redis-cli -x set mypasswd
 redis-cli get mypasswd
 redis-cli -r 100 lpush mylist x

(और यदि आप फाइलसिस्टम के माध्यम से db को एक्सेस करना चाहते हैं, तो आप सॉकेट का उपयोग कर सकते हैं -s। एक उपकरण जो प्रत्येक इनवोकेशन पर सीधे db इंडेक्स को पढ़ेगा, वह बहुत ही अकुशल होगा।)

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.