RRedis Handbook

TEMEL

Hash İşlemleri

Obje depolama. Tek field güncellenebilir, bellek verimli (<128 field → ziplist).

Kod örneği görünümü Bu sayfadaki eşleşen örnekleri seçilen istemciye göre gösterir.
HSET user:1 name "Erdem" email "[email protected]" age 30
HGET user:1 name                    # "Erdem"
HGETALL user:1                      # tüm field'lar
HMGET user:1 name email             # çoklu field
HINCRBY user:1 age 1                # atomik artır
HDEL user:1 email
HEXISTS user:1 name                 # 1
HLEN user:1                         # field sayısı
public class UserCacheService
{
    private readonly IDatabase _redis;

    public UserCacheService(IConnectionMultiplexer mux)
        => _redis = mux.GetDatabase();

    public async Task SetUserAsync(int userId, UserDto user)
    {
        var key = $"user:{userId}";
        var entries = new HashEntry[]
        {
            new("name", user.Name),
            new("email", user.Email),
            new("age", user.Age.ToString()),
            new("updatedAt", DateTime.UtcNow.Ticks.ToString())
        };
        await _redis.HashSetAsync(key, entries);
        await _redis.KeyExpireAsync(key, TimeSpan.FromHours(1));
    }

    public async Task<UserDto?> GetUserAsync(int userId)
    {
        var key = $"user:{userId}";
        var entries = await _redis.HashGetAllAsync(key);
        if (entries.Length == 0) return null;

        var dict = entries.ToDictionary(
            e => e.Name.ToString(),
            e => e.Value.ToString());

        return new UserDto
        {
            Name = dict.GetValueOrDefault("name") ?? "",
            Email = dict.GetValueOrDefault("email") ?? "",
            Age = int.TryParse(dict.GetValueOrDefault("age"), out var a) ? a : 0
        };
    }

    // Tek field güncelle (full obje yazmaya gerek yok)
    public async Task UpdateFieldAsync(int userId, string field, string value)
    {
        await _redis.HashSetAsync($"user:{userId}", field, value);
    }

    // Atomik sayaç (login count gibi)
    public async Task<long> IncrementFieldAsync(int userId, string field, long amount = 1)
    {
        return await _redis.HashIncrementAsync($"user:{userId}", field, amount);
    }
}

Hash vs JSON String: Hash ile tek field güncellenebilir — bandwidth tasarrufu. Ama complex nested object varsa JSON String daha pratik. <100 field → Hash, >100 field veya nested → JSON String.