sql >> Base de Datos >  >> NoSQL >> Redis

Manera eficiente de mapear datos de Redis

Puede usar la carga diferida para que Roles la colección se carga solo si es necesario. Esto se hace inyectando un repositorio de roles en su FullEmployee entidad.

También puede cargar los roles de una vez por todas:mantenga un Diccionario de roles en su FullEmployeeMapper y llénelo a medida que se cargan, luego verifíquelo antes de consultar el caché. Es de esperar que vuelva a crear una instancia para cada unidad de trabajo para que el diccionario esté actualizado para cada trabajo nuevo y evite problemas de subprocesos múltiples.

Ejemplo de implementación con una 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;
    }
}