Redis
 sql >> Base de données >  >> NoSQL >> Redis

Un moyen efficace de cartographier les données de Redis

Vous pouvez utiliser le chargement paresseux donc Roles la collection est chargée uniquement si nécessaire. Cela se fait en injectant un référentiel de rôles dans votre FullEmployee entité.

Vous pouvez également charger les rôles une fois pour toutes :conservez un Dictionnaire des rôles dans votre FullEmployeeMapper et remplissez-le au fur et à mesure de leur chargement puis vérifiez-le avant d'interroger le cache. J'espère que vous recréez une instance pour chaque unité de travail afin que le dictionnaire soit frais pour chaque nouveau travail et que vous évitiez les problèmes de multithreading.

Exemple d'implémentation avec une List :

class FullEmployeeMapper : IMapToNew<Employee, FullEmployee>
{
    private List<FullRole> _roles = new List<FullRole>();
    public FullEmployee Map(Employee source)
    {
        FullEmployee employee = new FullEmployee()
        {
            Id = source.Id,
            Age = source.Age,
            BirthDate = source.BirthDate,
            Name = source.Name
        };

        var mapper = new FullRoleMapper();
        var client = new RedisClient("localhost");

        employee.Roles = _roles.Where(r => source.Roles.Contains(r.Id)).ToList();
        if (employee.Roles.Count != source.Roles.Count)
        {
            var newRoles = client
                .As<Role>()
                .GetByIds(source.Roles.Except(employee.Roles.Select(r => r.Id)))
                .Select(r => mapper.Map(r)))
                .ToList();
            employee.Roles.AddRange(newRoles);
            _roles.AddRange(newRoles);
        }
        return employee;
    }
}