Giordani L. Rust Projects. Write A Redis Clone.... Online
out } } } } use std::collections::HashMap; use std::sync::Arc, Mutex; use std::time::SystemTime, UNIX_EPOCH; #[derive(Clone)] struct ValueWithExpiry data: Vec<u8>, expires_at: Option<u64>,
store.set(key, value, ttl_ms); RespValue::SimpleString("OK".to_string())
RespValue::Integer(store.ttl(&key))
pub fn keys(&self, pattern: &str) -> Vec<String> (k, v) Giordani L. Rust Projects. Write a Redis Clone....
Ok(()) } use bytes::Bytes, BytesMut; use std::collections::VecDeque; #[derive(Debug, PartialEq)] pub enum RespValue SimpleString(String), Error(String), Integer(i64), BulkString(Option<Vec<u8>>), Array(Vec<RespValue>),
let original_buffer = self.buffer.clone(); let temp_buffer = &mut self.buffer[offset..].to_vec(); let mut temp_parser = RespParser buffer: BytesMut::from(temp_buffer.as_slice()), ; match temp_parser.parse_one()? Some(value) => let consumed = original_buffer.len() - temp_parser.buffer.len() - offset; Ok(Some((value, consumed))) None => Ok(None),
pub fn ttl(&self, key: &str) -> i64 let map = self.inner.lock().unwrap(); if let Some(value) = map.get(key) if let Some(expires_at) = value.expires_at let now = SystemTime::now() .duration_since(UNIX_EPOCH) .unwrap() .as_millis() as u64; if now >= expires_at return -2; ((expires_at - now) / 1000) as i64 else -1 else -2 out } } } } use std::collections::HashMap; use
let key = match &args[0] RespValue::BulkString(Some(k)) => String::from_utf8_lossy(k).to_string(), _ => return RespValue::Error("ERR invalid key".to_string()), ;
let key = match &args[0] RespValue::BulkString(Some(k)) => String::from_utf8_lossy(k).to_string(), _ => return RespValue::Error("ERR invalid key".to_string()), ;
Ok(()) } 1. Start the server: cargo run --release 2. Test with redis-cli (install Redis CLI first): redis-cli -p 6379 3. Or use netcat: # SET command echo "*3\r\n$3\r\nSET\r\n$3\r\nkey\r\n$5\r\nvalue\r\n" | nc localhost 6379 GET command echo "*2\r\n$3\r\nGET\r\n$3\r\nkey\r\n" | nc localhost 6379 4. Example commands to try: redis-cli -p 6379 > PING PONG Test with redis-cli (install Redis CLI first): redis-cli
fn parse_array(&mut self) -> Result<Option<RespValue>, String> let (len, bytes_read) = self.read_until_crlf(1)?; let count: i64 = len.parse().map_err(
RespValue::Integer(count)