# Redis Client for V This module provides a Redis client implementation in V that supports the Redis Serialization Protocol (RESP) versions 2 (RESP2) and 3 (RESP3) with a type-safe interface for common Redis commands. ## Features - **Type-Safe Commands**: Auto-detects value types at compile time - **Pipeline Support**: Group commands for batch execution - **Connection Pooling**: Efficient resource management - **RESP Protocol Support**: Full Redis Serialization Protocol implementation - **Memory Efficient**: Pre-allocated buffers for minimal allocations ## Quick Start ```v module main import db.redis fn main() { // Connect to Redis // Uncomment passwod line if authentication is needed mut db := redis.connect(redis.Config{ // Available Config options (none of which need to be specified if you want the defauilts): // host: 'localhost' - default // password: 'your_password' - no default, you need to supply password if your redis server // is set up to need one // port: 6379 - default // tls: false - default, set to true for ssl connection })! println('Server supports RESP${db.version} protocol') // Set and get values db.set('name', 'Alice')! name := db.get[string]('name')! println('Name: ${name}') // Output: Name: Alice // Integer operations db.set('counter', 42)! db.incr('counter')! counter := db.get[int]('counter')! println('Counter: ${counter}') // Output: Counter: 43 // Clean up db.close()! } ``` ## Supported Commands ### Key Operations ```v ignore // Set value db.set('key', 'value')! db.set('number', 42)! db.set('binary', []u8{len: 4, init: 0})! // Get value str_value := db.get[string]('key')! int_value := db.get[int]('number')! bin_value := db.get[[]u8]('binary')! // Delete key db.del('key')! // Set expiration db.expire('key', 60)! // 60 seconds ``` ### Hash Operations ```v ignore // Set hash fields db.hset('user:1', { 'name': 'Bob', 'age': '30', })! // Get single field name := db.hget[string]('user:1', 'name')! // Get all fields user_data := db.hgetall[string]('user:1')! println(user_data) // Output: {'name': 'Bob', 'age': '30'} ``` ### Pipeline Operations ```v ignore // Start pipeline db.pipeline_start() // Queue commands db.incr('counter')! db.set('name', 'Charlie')! db.get[string]('name')! // Execute and get responses responses := db.pipeline_execute()! for resp in responses { println(resp) } ``` ### Custom Commands ```v ignore // Run raw commands resp := db.cmd('SET', 'custom', 'value')! result := db.cmd('GET', 'custom')! // Complex commands db.cmd('HSET', 'user:2', 'field1', 'value1', 'field2', '42')! ``` ## Error Handling All functions return `!` types and will return detailed errors for: - Connection issues - Protocol violations - Type mismatches - Redis error responses - Timeout conditions ```v ignore result := db.get[string]('nonexistent') or { println('Key not found') return } ``` ## Connection Management ```v ignore config := redis.Config{ host: 'redis.server' port: 6379 } mut db := redis.connect(config)! defer { db.close() or { eprintln('Error closing connection: ${err}') } } ``` `redis.DB` also implements `pool.ConnectionPoolable`, so it can be used directly with `vlib/pool` connection pools. ## Performance Tips 1. **Reuse Connections**: Maintain connections instead of creating new ones 2. **Use Pipelines**: Batch commands for high-throughput operations 3. **Prefer Integers**: Use numeric types for counters and metrics 4. **Specify Types**: Always specify return types for get operations