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 "e@test.com" 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.