Giordani L. Rust Projects. Write A Redis Clone.... Apr 2026

pub fn exists(&self, key: &str) -> bool self.get(key).is_some()

let key = match &args[0] RespValue::BulkString(Some(k)) => String::from_utf8_lossy(k).to_string(), _ => return RespValue::Error("ERR invalid key".to_string()), ;

fn parse_integer(&mut self) -> Result<Option<RespValue>, String> let (value, bytes_read) = self.read_until_crlf(1)?; let num: i64 = value.parse().map_err(

pub fn parse(&mut self, data: &[u8]) -> Result<Option<Vec<RespValue>>, String> self.buffer.extend_from_slice(data); let mut commands = Vec::new(); while let Some(cmd) = self.parse_one()? commands.push(cmd); if commands.is_empty() Ok(None) else Ok(Some(commands)) Giordani L. Rust Projects. Write a Redis Clone....

fn handle_dbsize(store: &Store, _args: &[RespValue]) -> RespValue RespValue::Integer(store.dbsize() as i64)

use crate::resp::RespValue; use crate::store::Store; pub fn handle_command(store: &Store, cmd: &RespValue) -> RespValue { match cmd { RespValue::Array(args) if !args.is_empty() => { if let RespValue::BulkString(Some(cmd_bytes)) = &args[0] { let command = String::from_utf8_lossy(cmd_bytes).to_uppercase(); let args = &args[1..];

pub fn keys(&self, pattern: &str) -> Vec<String> let map = self.inner.lock().unwrap(); let now = SystemTime::now() .duration_since(UNIX_EPOCH) .unwrap() .as_millis() as u64; map.iter() .filter_map( pub fn exists(&self, key: &str) -&gt; bool self

fn handle_ttl(store: &Store, args: &[RespValue]) -> RespValue if args.len() != 1 return RespValue::Error("ERR wrong number of arguments for 'ttl' command".to_string());

> SET counter 100 EX 60 OK

match store.get(&key) Some(value) => RespValue::BulkString(Some(value)), None => RespValue::BulkString(None), pub fn exists(&self

#[tokio::main] async fn main() -> Result<(), Box<dyn std::error::Error>> { let addr = "127.0.0.1:6379"; let listener = TcpListener::bind(addr).await?; let store = Store::new();

if store.expire(&key, seconds) RespValue::Integer(1) else RespValue::Integer(0)

loop { let n = socket.read(&mut buffer).await?; if n == 0 break; match parser.parse(&buffer[..n]) { Ok(Some(commands)) => for cmd in commands let response = handle_command(&store, &cmd); let serialized = response.serialize(); socket.write_all(&serialized).await?; Ok(None) => // Incomplete frame, continue reading continue; Err(e) => { let error_resp = RespValue::Error(format!("ERR {}", e)); socket.write_all(&error_resp.serialize()).await?; break; } } }