Redis
 sql >> Datenbank >  >> NoSQL >> Redis

Effiziente Möglichkeit, Daten aus Redis zuzuordnen

Sie können Lazy Loading verwenden, also Roles Die Sammlung wird nur bei Bedarf geladen. Dies erfolgt durch Einfügen eines Rollen-Repositorys in Ihren FullEmployee Entität.

Sie können die Rollen auch ein für alle Mal laden:Führen Sie ein Verzeichnis der Rollen in Ihrem FullEmployeeMapper und füllen Sie es, während sie geladen werden, und überprüfen Sie es, bevor Sie den Cache abfragen. Hoffentlich erstellen Sie eine Instanz für jede Arbeitseinheit neu, damit das Wörterbuch für jede neue Arbeit frisch ist und Sie Multithreading-Probleme vermeiden.

Beispielimplementierung mit einer 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;
    }
}