public override void SetValueHandler(ElementRequestReader request) { long md5 = MD5Utility.GetMD5(request.element.key); if (Global.LocalStorage.Contains(md5)) { //the bucket already exsit using (var bucket = Global.LocalStorage.UseBucket(md5)) { //different keys may end up in the same bucket(Hash Collision) bucket.elements.ForEach(element_accessor => { if (element_accessor.key == request.element.key) { //if already in the bucket, update the value element_accessor.value = request.element.value; return; } }); //upon here,no entry for this key exist bucket.elements.Add(request.element); } } else { //no bucket is ever exist, creat for my own! Bucket newbucket = new Bucket(); Global.LocalStorage.SaveBucket(md5, newbucket); using (var bucket = Global.LocalStorage.UseBucket(md5)) { bucket.elements.Add(request.element); } } }
public override void GetValueHandler(StringRequestReader request, ValueResponseWriter response) { long md5 = MD5Utility.GetMD5(request.key); if (Global.LocalStorage.Contains(md5)) { //the bucket exists, very likely the key is in the bucket using (var bucket = Global.LocalStorage.UseBucket(md5)) { response.isFound = false; bucket.elements.ForEach(element_accessor => { //make sure one of the element matches the key if (element_accessor.key == request.key) { response.isFound = true; response.value = element_accessor.value; return; } }); return; } } else { //no entry for this key exist response.isFound = false; return; } }
static void DealWithCommand() { TrinityConfig.CurrentRunningMode = RunningMode.Client; slave_count = Global.SlaveCount; Console.WriteLine("You know you're playing with {0} slave machines", slave_count); Console.WriteLine("Begin Playing with the toy Redis:"); while (true) { Console.Write(" >"); string command = Console.ReadLine(); Regex setregex = new Regex(@"set\s+(\w*)\s+(.*)"); Regex getregex = new Regex(@"get\s+(\w*)"); Match setmatch = setregex.Match(command); Match getmatch = getregex.Match(command); #region it is a set command if (setmatch.Length > 0) { string key_raw = setmatch.Groups[1].ToString().Trim(); string value_raw = setmatch.Groups[2].ToString().Trim(); if (value_raw.StartsWith("[") && value_raw.EndsWith("]")) { Console.WriteLine("setting the value under \"{0}\" to a List", key_raw); value_raw = value_raw.TrimStart("[".ToCharArray()); value_raw = value_raw.TrimEnd("]".ToCharArray()); string[] numbers = value_raw.Split(",".ToCharArray()); List <int> list_value = new List <int>(); foreach (string s in numbers) { list_value.Add(int.Parse(s.Trim())); } //notice! since it's a list value, set the other two arguments to be null, so they won't take extraspace Element e = new Element(key_raw, new Value(null, null, list_value)); long md5 = MD5Utility.GetMD5(key_raw); Global.CloudStorage.SetValueToSlave(MD5Utility.GetSlaveID(md5, slave_count), new ElementRequestWriter(e)); } else if (value_raw.StartsWith("\"") && value_raw.EndsWith("\"")) { Console.WriteLine("setting the value under \"{0}\" to a string", key_raw); value_raw = value_raw.TrimStart("\"".ToCharArray()); value_raw = value_raw.TrimEnd("\"".ToCharArray()); string string_value = value_raw; //notice! since it's a string value, set the other two arguments to be null, so they won't take extraspace Element e = new Element(key_raw, new Value(null, string_value, null)); long md5 = MD5Utility.GetMD5(key_raw); Global.CloudStorage.SetValueToSlave(MD5Utility.GetSlaveID(md5, slave_count), new ElementRequestWriter(e)); } else { double double_value = 0; if (!double.TryParse(value_raw.Trim(), out double_value)) { Console.WriteLine("don't understand what you're talking about."); continue; } Console.WriteLine("setting the value under \"{0}\" to a double", key_raw); //notice! since it's a double value, set the other two arguments to be null, so they won't take extraspace Element e = new Element(key_raw, new Value(double_value, null, null)); long md5 = MD5Utility.GetMD5(key_raw); Global.CloudStorage.SetValueToSlave(MD5Utility.GetSlaveID(md5, slave_count), new ElementRequestWriter(e)); } } #endregion #region it is a get command else if (getmatch.Length > 0) { string key_raw = getmatch.Groups[1].ToString().Trim(); long md5 = MD5Utility.GetMD5(key_raw); ValueResponseReader reader = Global.CloudStorage.GetValueToSlave( MD5Utility.GetSlaveID(md5, slave_count), new StringRequestWriter(key_raw)); if (reader.isFound) { if (reader.value.Contains_int_list_value) { Console.WriteLine("the value under \"{0}\" is a List", key_raw); Console.Write("List of Int: ["); reader.value.int_list_value.ForEach(i => { Console.Write(i + ","); }); Console.WriteLine("]"); } else if (reader.value.Contains_string_value) { Console.WriteLine("the value under \"{0}\" is a string", key_raw); Console.WriteLine(reader.value.string_value); } else if (reader.value.Contains_double_value) { Console.WriteLine("the value under \"{0}\" is a double", key_raw); Console.WriteLine(reader.value.double_value); } } else { Console.WriteLine("no such object exist under the key: \"{0}\"", key_raw); } } #endregion else { Console.WriteLine("don't understand what you're talking about."); } } }