আমি ক্যাসান্দ্রার অনুরূপ একটি ডেটাবেস সার্ভার বিকাশ করছি।
সিতে বিকাশ শুরু হয়েছিল, কিন্তু ক্লাস ছাড়াই জিনিসগুলি খুব জটিল হয়ে ওঠে।
বর্তমানে আমি সি ++ 11 এ সমস্ত কিছু পোর্ট করেছি তবে আমি এখনও "আধুনিক" সি ++ শিখছি এবং প্রচুর বিষয়ে সন্দেহ আছে।
কী / মান জোড়া নিয়ে ডেটাবেস কাজ করবে। প্রতিটি জুটির আরও কিছু তথ্য থাকে - কখন তৈরি হয় যখন এটি শেষ হয় (0 টি মেয়াদ শেষ না হলে)। প্রতিটি জুড়ি অপরিবর্তনীয়।
কীটি হ'ল সি স্ট্রিং, মানটি শূন্য *, তবে কমপক্ষে মুহূর্তের জন্য আমি সি স্ট্রিংয়ের মতো মানটিও পরিচালনা করছি।
বিমূর্ত IList
ক্লাস আছে। এটি তিনটি শ্রেণী থেকে উত্তরাধিকারসূত্রে প্রাপ্ত
VectorList
- সি ডায়নামিক অ্যারে - স্ট্যান্ড :: ভেক্টর এর অনুরূপ, তবে ব্যবহারrealloc
LinkList
- চেক এবং পারফরম্যান্স তুলনা জন্য তৈরিSkipList
- শেষ পর্যন্ত যে ক্লাসটি ব্যবহার করা হবে।
ভবিষ্যতে আমি Red Black
গাছও করতে পারি ।
প্রতিটি IList
জোতে শূন্য বা আরও বেশি পয়েন্টার যুক্ত করে কী অনুসারে বাছাই করে।
যদি IList
খুব দীর্ঘ হয়ে যায় তবে এটি একটি বিশেষ ফাইলে ডিস্কে সংরক্ষণ করা যায়। এই বিশেষ ফাইলটি ধরণের read only list
।
আপনার যদি কোনও কীটি অনুসন্ধান করতে হয়,
- মেমরি প্রথম
IList
অনুসন্ধান করা হয় (SkipList
,SkipList
বাLinkList
)। - তারপরে অনুসন্ধানের তারিখ অনুসারে বাছাই করা ফাইলগুলিতে প্রেরণ করা হয়
(সর্বশেষতম ফাইল, প্রাচীনতম ফাইল - শেষ)।
এই সমস্ত ফাইল স্মৃতিতে এমএমএপ-এড। - যদি কিছু না পাওয়া যায় তবে কীটি পাওয়া যায় না।
IList
জিনিসগুলির বাস্তবায়ন সম্পর্কে আমার কোনও সন্দেহ নেই ।
বর্তমানে যা আমাকে বিস্মিত করছে তা অনুসরণ করছে:
জোড়াগুলি বিভিন্ন আকারের হয়, তাদের দ্বারা বরাদ্দ করা হয় new()
এবং তারা তাদের std::shared_ptr
দিকে নির্দেশ করে।
class Pair{
public:
// several methods...
private:
struct Blob;
std::shared_ptr<const Blob> _blob;
};
struct Pair::Blob{
uint64_t created;
uint32_t expires;
uint32_t vallen;
uint16_t keylen;
uint8_t checksum;
char buffer[2];
};
"বাফার" সদস্যের পরিবর্তনশীল হ'ল বিভিন্ন আকারের। এটি কী + মান সঞ্চয় করে।
উদাহরণস্বরূপ যদি কীটি 10 টি অক্ষর হয় এবং মানটি 10 টি বাইট হয় তবে পুরো বস্তুটি হবে sizeof(Pair::Blob) + 20
(দুটি নাল টার্মিনেটিং বাইটের কারণে বাফারের প্রাথমিক আকার 2 হবে)
এই একই লেআউটটি ডিস্কটিতেও ব্যবহৃত হয়, তাই আমি এরকম কিছু করতে পারি:
// get the blob
Pair::Blob *blob = (Pair::Blob *) & mmaped_array[pos];
// create the pair, true makes std::shared_ptr not to delete the memory,
// since it does not own it.
Pair p = Pair(blob, true);
// however if I want the Pair to own the memory,
// I can copy it, but this is slower operation.
Pair p2 = Pair(blob);
তবে এই ভিন্ন আকারটি সি ++ কোড সহ প্রচুর জায়গায় সমস্যা।
উদাহরণস্বরূপ আমি ব্যবহার করতে পারি না std::make_shared()
। এটি আমার পক্ষে গুরুত্বপূর্ণ, কারণ আমার যদি 1 এম পেয়ার হয় তবে আমার 2 এম বরাদ্দ থাকবে।
অন্যদিকে, যদি আমি গতিশীল অ্যারেতে "বাফার" করি (উদাহরণস্বরূপ নতুন চর [123]), আমি এমএম্যাপ "কৌশল" হারাব, আমি কীটি পরীক্ষা করতে চাইলে আমি দুটি ডিरेফারেন্স করব এবং আমি একক পয়েন্টার যুক্ত করব - ক্লাসে 8 বাইট।
আমিও "পুল" থেকে সকল সদস্যদের করার চেষ্টা Pair::Blob
মধ্যে Pair
, তাই Pair::Blob
শুধু বাফার হতে, কিন্তু আমি এটা পরীক্ষিত, এটা সম্ভবত কারণ প্রায় অবজেক্ট ডেটা কপি বেশ ধীর ছিল।
আমি আরও একটি পরিবর্তন সম্পর্কে ভাবছি যা হ'ল Pair
শ্রেণিটি সরিয়ে নেওয়া এবং এটিকে প্রতিস্থাপন করা std::shared_ptr
এবং সমস্ত পদ্ধতিগুলিতে ফিরে "ধাক্কা" দেওয়া Pair::Blob
, তবে এটি আমাকে ভেরিয়েবল সাইজের Pair::Blob
শ্রেণিতে সহায়তা করবে না ।
আমি আরও ভাবছি যে আরও সি ++ বান্ধব হওয়ার জন্য আমি কীভাবে অবজেক্ট ডিজাইনের উন্নতি করতে পারি।
সম্পূর্ণ উত্স কোডটি এখানে:
https://github.com/nmmmnu/HM3
IList::remove
বা আইএলিস্ট ধ্বংস হয় তখন ডিওলোকেশন এবং কল-ডি-টর্স করা হয় । এটি অনেক সময় নেয় তবে আমি আলাদা থ্রেডে যাচ্ছি। এটি সহজ হবে কারণ আইলিস্ট std::unique_ptr<IList>
যাইহোক হবে। সুতরাং আমি এটি নতুন তালিকার সাথে "স্যুইচ" করতে সক্ষম হব এবং পুরানো অবজেক্টটি কোথাও রাখি যেখানে আমি ডি-টর কল করতে পারি।
C string
এবং ডেটা সবসময় কিছুটা বাফার হয় void *
বা char *
তাই আপনি চর অ্যারে পাস করতে পারেন। আপনি একই redis
বা খুঁজে পেতে পারেন memcached
। এক পর্যায়ে আমি std::string
কীর জন্য চর অ্যারে ব্যবহার করার বা স্থির করার সিদ্ধান্ত নিতে পারি তবে আন্ডারলাইন করে এটি সি স্ট্রিং হবে।
std::map
বা ব্যবহার করবেন না কেনstd::unordered_map
? মানগুলি কিছু (কীগুলির সাথে সম্পর্কিত) কেনvoid*
? আপনার সম্ভবত কোনও সময় তাদের ধ্বংস করা প্রয়োজন; কিভাবে এবং কখন? আপনি টেমপ্লেট ব্যবহার করবেন না কেন?