Build Redis With Rust πŸ¦€

Day 3 μ½”λ“œ command.rs use crate::{Config, Db, ValueEntry}; use tokio::io::AsyncWriteExt; use tokio::net::TcpStream; pub enum Command { PING, ECHO(String), GET(String), SET { key: String, value: String, px: Option<u64>, ex: Option<u64> }, CONFIG(ConfigCommand), } pub enum ConfigCommand { GET(String), } impl Command { pub fn parse_message(message: &str) -> Result<Command, String> { let mut lines = message.lines(); let first_line = lines.next().ok_or("Argument Error : Empty message")?; if first_line.starts_with('*') { let num_args: usize = first_line[1..].parse().map_err(|_| "Invalid array size")?...

November 2, 2024

데이터 쀑심 μ• ν”Œλ¦¬μΌ€μ΄μ…˜ 섀계 5μž₯

About Part 2 μ €μž₯μ†Œμ™€ 데이터 검색에 μ—¬λŸ¬ μž₯λΉ„κ°€ κ΄€μ—¬ν•œλ‹€λ©΄ μ–΄λ–»κ²Œ 될까? 이번 μž₯μ—μ„œλŠ” λΆ„μ‚° 데이터에 λŒ€ν•΄ 닀룬닀. μ—¬λŸ¬ μž₯λΉ„κ°€ ν•„μš”ν•œ 이유 ν™•μž₯μ„± : λΆ€ν•˜λ₯Ό λΆ„μ‚°μ‹œν‚¬μˆ˜ μžˆλ‹€. 내결함성/κ³ κ°€μš©μ„± : μž₯μ• κ°€ λ°œμƒν•΄λ„ μ‹œμŠ€ν…œμ΄ 계속 λ™μž‘ν•  수 μžˆλ‹€. μ§€μ—°μ‹œκ°„ : μ‚¬μš©μž κ°€κΉŒμ΄ 데이터λ₯Ό λΆ„μ‚°μ‹œν‚¬ 수 μžˆλ‹€. 곡유 λ©”λͺ¨λ¦¬ μ•„ν‚€ν…μ²˜, 곡유 λ””μŠ€ν¬ μ•„ν‚€ν…μ²˜ λ§Žμ€ CPU, λ©”λͺ¨λ¦¬, λ””μŠ€ν¬λ₯Ό ν•˜λ‚˜μ˜ 운영체제둜 ν•©μΉœλ‹€. λ‹¨μˆœν•œ ꡬ쑰에 μ–΄λŠμ •λ„ 내결함성을 κ°€μ§„λ‹€. μ„ ν˜•μ μ΄μ§€ μ•Šμ€ λΉ„μš©μ¦κ°€, μ œν•œμ μΈ 내결함성이 단점이닀. λΉ„κ³΅μœ  μ•„ν‚€ν…μ²˜ 각 μž₯λΉ„λ₯Ό λ…Έλ“œλ‘œ λΆ„λ₯˜ν•˜κ³ , 각각의 μ»΄ν“¨νŒ… μžμ›μ„ λ…λ¦½μ μœΌλ‘œ μ‚¬μš©ν•œλ‹€....

October 31, 2024

Rust-Redis-D2

1. Code use regex::Regex; use std::collections::HashMap; use std::sync::Arc; use tokio::io::{AsyncReadExt, AsyncWriteExt}; use tokio::net::{TcpListener, TcpStream}; use tokio::sync::RwLock; use tokio::task; type Db = Arc<RwLock<HashMap<String, String>>>; enum Command { PING, ECHO(String), GET(String), SET(String, String), } impl Command { fn parse_message(message: &str) -> Result<Command, String> { let re_ping = Regex::new(r"^\*1\r\n\$4\r\nPING\r\n$").unwrap(); let re_echo = Regex::new(r"^\*2\r\n\$4\r\nECHO\r\n\$(\d+)\r\n(.+)\r\n$").unwrap(); let re_get = Regex::new(r"^\*2\r\n\$3\r\nGET\r\n\$(\d+)\r\n(.+)\r\n$").unwrap(); let re_set = Regex::new(r"^\*3\r\n\$3\r\nSET\r\n\$(\d+)\r\n(.+)\r\n\$(\d+)\r\n(.+)\r\n$").unwrap(); if re_ping.is_match(message) { Ok(Command::PING) } else if let Some(captures) = re_echo.captures(message) { let length: usize = captures[1]....

October 31, 2024

Rust-Redis-D1

0. PreRequisite ν•΄λ‹Ή λ¬Έμ„œμ˜ μ°Έκ³ μž…λ‹ˆλ‹€! https://app.codecrafters.io/concepts/rust-tcp-server std::net λͺ¨λ“ˆμ€ TCP μ„œλ²„λ₯Ό λ§Œλ“€κΈ° μœ„ν•œ λͺ¨λ“ˆμ΄λ‹€. 그리고 μ•„λž˜μ˜ λ‹€μ„―κ°€μ§€ λ©”μ…”λ“œλ₯Ό μ£Όμš”ν•˜κ²Œ μ΄μš©ν•œλ‹€. TcpListener::bind : pub fn bind<A: ToSocketAddrs>(addr: A) -> Result<TcpListener> - μ£Όμ–΄μ§„ μ£Όμ†Œμ— λ°”μΈλ”©λœ μƒˆλ‘œμš΄ TcpListener μΈμŠ€ν„΄μŠ€λ₯Ό λ°˜ν™˜ν•œλ‹€ TcpListener::incoming : pub fn incoming(&self) -> Incoming - 이 λ¦¬μŠ€λ„ˆλ‘œ λ“€μ–΄μ˜€λŠ” coneection에 λŒ€ν•œ iteratorλ₯Ό λ°˜ν™˜ν•œλ‹€. TcpStream::connect : pub fn connect<A: ToSocketAddrs>(addr: A) -> Result<TcpStream> - μ£Όμ–΄μ§„ μ£Όμ†Œλ‘œ μ—°κ²°λœ μƒˆλ‘œμš΄ TcpStream μΈμŠ€ν„΄μŠ€λ₯Ό λ°˜ν™˜ν•œλ‹€. TcpStream::read : pub fn read(&mut self, buf: &mut [u8]) -> Result<usize> - μŠ€νŠΈλ¦Όμ—μ„œ 데이터λ₯Ό μ½μ–΄μ„œ μ£Όμ–΄μ§„ 버퍼에 μ €μž₯ν•œλ‹€....

October 30, 2024

Build Redis With Rust πŸ¦€

Build Redis With Rust πŸ¦€ 이건 μ½”λ“œν¬λž˜ν”„ν„°μŠ€ μ—μ„œ μ§„ν–‰ν•˜λŠ” ν”„λ‘œμ νŠΈλ₯Ό λ”°λΌν•˜λ©΄μ„œ μž‘μ„±ν•œ λ¬Έμ„œμž…λ‹ˆλ‹€. μ „μ μœΌλ‘œ μ œκ°€ μž‘μ„±ν•œ μ½”λ“œμ™€ μ €μ˜ μƒκ°λ§Œ ν¬μŠ€νŒ…μ„ ν•  μ˜ˆμ •μž…λ‹ˆλ‹€. μ£Όμš”ν•œ κ°€μ΄λ“œλŠ” 직접 μœ„ μ‚¬μ΄νŠΈμ—μ„œ ν™•μΈν•΄μ£Όμ„Έμš”. Github-Repo Redis-Protocol [[Rust-Redis-D1]] [[Rust-Redis-D2]] [[Rust-Redis-D3]] [[Rust-Redis-D4]] Trouble Shootings [[Redis-Handshake-For-Replicas]] : λ ˆν”Œλ¦¬μΉ΄(슬레이브) 등둝을 μœ„ν•œ HandShake쀑 ν΄λΌμ΄μ–ΈνŠΈλ₯Ό μ‹λ³„ν•˜λŠ” 이슈 [[Redis-Stream-Issue]]

October 30, 2024

데이저 쀑심 μ• ν”Œλ¦¬μΌ€μ΄μ…˜ 4μž₯ μŠ€ν„°λ””

4μž₯ λΆ€ν˜Έν™”μ™€ λ°œμ „ μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ λ³€κ²½κ³Ό 변화에 λŒ€μ‘ν•˜λŠ” 방법을 μ†Œκ°œν•˜λŠ” μž₯. 일단 λ¨Όμ € λŒ€κ·œλͺ¨ μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜ 변화에 μžˆμ–΄ μž₯애물이 λ˜λŠ” 뢀뢄은 크게 μ•„λž˜μ™€κ°™λ‹€. λ°μ΄ν„°νƒ€μž…μ΄λ‚˜ μŠ€ν‚€λ§ˆκ°€ λ³€κ²½λ˜λŠ” 경우 μ„œλ²„μΈ‘μ—μ„œλŠ” μˆœνšŒμ‹ μ—…κ·Έλ ˆμ΄λ“œλ₯Ό μ§„ν–‰ν•œλ‹€. ν΄λΌμ΄μ–ΈνŠΈμΈ‘ μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜μ€ μ‚¬μš©μžμ— μ „μ μœΌλ‘œ μ’Œμš°λœλ‹€. μ–΄λ–€ μ‚¬μš©μžλŠ” ν•œλ™μ•ˆ μ—…κ·Έλ ˆμ΄λ“œλ₯Ό ν•˜μ§€ μ•Šμ„ μˆ˜λ„ μžˆλ‹€. 즉 μ˜ˆμ „λ²„μ „μ˜ μ½”λ“œμ™€ μƒˆλ‘œμš΄ λ²„μ „μ˜ μ½”λ“œ, μ΄μ „μ˜ λ°μ΄ν„°νƒ€μž…κ³Ό μƒˆλ‘œμš΄ λ°μ΄ν„°νƒ€μž… 이 μ‹œμŠ€ν…œμ— 곡쑴 ν•  수 μžˆλ‹€λŠ” 것이닀. κ·Έλž˜μ„œ μ‹œμŠ€ν…œμ—λŠ” μ–‘λ°©ν–₯의 ν˜Έν™˜μ„±μ΄ ν•„μš”ν•˜λ‹€. ν•˜μœ„ ν˜Έν™˜μ„± : μƒˆλ‘œμš΄ μ½”λ“œλŠ” 이전 μ½”λ“œκ°€ κΈ°λ‘ν•œ 데이터λ₯Ό 읽을 수 μžˆμ–΄μ•Ό ν•œλ‹€....

October 26, 2024

Rust πŸ¦€

러슀트 κ΄€λ ¨ λͺ¨λ“  λ¬Έμ„œμ˜ Index πŸ—‚οΈ

October 26, 2024

데이터 쀑심 μ• ν”Œλ¦¬μΌ€μ΄μ…˜ 섀계 μŠ€ν„°λ””3μž₯

μ €μž₯μ†Œμ™€ 검색 λ°μ΄ν„°λ² μ΄μŠ€μ˜ κ°€μž₯ μ€‘μš”ν•œ 두가지 μΆ”μƒν™”λŠ” μ“°κΈ°/읽기이닀. 그리고 이 두가지 μ„±λŠ₯은 항상 Trade-off 관계에 μžˆλ‹€. κ·Έ Trade-off 관계λ₯Ό μ΄ν•΄ν•˜λŠ” 것과, κ°€μž₯ λŒ€ν‘œμ μΈ μ €μž₯μ†Œ 엔진인 둜그ꡬ쑰(Log-Structured) μ €μž₯μ†Œ μ—”μ§„κ³Ό B-트리 같은 νŽ˜μ΄μ§€μ§€ν–₯(page-oriented) μ €μž₯μ†Œ 엔진을 λΉ„κ΅ν•˜λŠ” 것이 이 μž₯의 λͺ©ν‘œμ΄λ‹€. λ°μ΄ν„°λ² μ΄μŠ€λ₯Ό κ°•λ ₯ν•˜κ²Œ λ§Œλ“œλŠ” 데이터 ꡬ쑰 #!/bin/bash db_set () { echo "$1,$2" >> database } db_get () { grep "^$1," database | sed -e "s/^$1,//" | tail -n 1 // νŠΉμ • 킀에 λŒ€ν•œ λ§ˆμ§€λ§‰ 값을 κ°€μ Έμ˜¨λ‹€....

October 20, 2024

러슀트의 ν•¨μˆ˜μ˜ μ–Έμ–΄ νŠΉμ§•

13.0.0 Functional Languages Features: Iterators and Closures Rust의 λ””μžμΈκ³Ό κΈ°λŠ₯은 ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ°μ—μ„œ μ˜κ°μ„ λ°›μ•˜μŠ΅λ‹ˆλ‹€. ν•¨μˆ˜ν˜• μŠ€νƒ€μΌλ‘œ ν”„λ‘œκ·Έλž˜λ°ν•˜λŠ” 것은 μ’…μ’… ν•¨μˆ˜λ₯Ό κ°’μœΌλ‘œ μ‚¬μš©ν•˜μ—¬ 인수둜 μ „λ‹¬ν•˜κ±°λ‚˜, λ‹€λ₯Έ ν•¨μˆ˜μ—μ„œ λ°˜ν™˜ν•˜κ±°λ‚˜, λ‚˜μ€‘μ— μ‹€ν–‰ν•˜κΈ° μœ„ν•΄ λ³€μˆ˜μ— ν• λ‹Ήν•˜λŠ” λ“±μ˜ μž‘μ—…μ„ ν¬ν•¨ν•©λ‹ˆλ‹€. 이 μž₯μ—μ„œλŠ” ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ°μ΄ 무엇인지 μ•„λ‹Œμ§€μ— λŒ€ν•΄ λ…ΌμŸν•˜μ§€ μ•Šκ³ , λŒ€μ‹  ν•¨μˆ˜ν˜•μ΄λΌκ³  λΆˆλ¦¬λŠ” λ§Žμ€ μ–Έμ–΄μ˜ κΈ°λŠ₯κ³Ό μœ μ‚¬ν•œ Rust의 일뢀 κΈ°λŠ₯에 λŒ€ν•΄ λ…Όμ˜ν•  κ²ƒμž…λ‹ˆλ‹€. μš”μ•½ν•˜μžλ©΄ 러슀트의 λ””μžμΈκ³Ό κΈ°λŠ₯은 ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ°μ—μ„œλ„ μ˜κ°μ„ λ°›μ•˜λ‹€. ν•˜μ§€λ§Œ 뭐가 ν•¨μˆ˜ν˜•μΈμ§€ λ…Όμ˜ν•˜λŠ”κ²ƒλ³΄λ‹€λŠ” λ§Žμ€ μ–Έμ–΄λ“€μ—μ„œ ν•¨μˆ˜ν˜• μ–Έμ–΄λ‘œ μΌμ»«μ–΄μ§€λŠ” κΈ°λŠ₯듀이 λŸ¬μŠ€νŠΈμ—μ„œ μ–΄λ–»κ²Œ μ‚¬μš©ν•  수 μžˆλŠ”μ§€ μ•Œμ•„λ³Έλ‹€κ³  ν•œλ‹€....

October 19, 2024

Effective Rust Item 2 곡톡 μ’…μž‘μ€ νƒ€μž… μ‹œμŠ€ν…œμœΌλ‘œ ν‘œν˜„ν•˜λΌ

곡톡 μ’…μž‘μ€ νƒ€μž… μ‹œμŠ€ν…œμœΌλ‘œ ν‘œν˜„ν•˜λΌ

October 19, 2024