跳到主要内容

常见异常

ERR unknown command 'JSON.SET'

这篇文章的内容有参考以下文章: Windows安装RedisJSON(无需编译)

前置条件

现有实体类Person

    [Document(StorageType = StorageType.Json, Prefixes = new[] { "Person" })]
public class Person
{
[RedisIdField]
[Indexed]
public string? Id { get; set; }

[Indexed]
public string? FirstName { get; set; }

[Indexed]
public string? LastName { get; set; }

[Indexed]
public int Age { get; set; }

[Searchable]
public string? PersonalStatement { get; set; }

[Indexed]
public string[] Skills { get; set; } = Array.Empty<string>();

[Indexed(CascadeDepth = 1)]
public Address? Address { get; set; }
}

服务类IndexCreationService

public class IndexCreationService : IHostedService
{
private readonly RedisConnectionProvider _provider;
public IndexCreationService(RedisConnectionProvider provider)
{
_provider = provider;
}

public async Task StartAsync(CancellationToken cancellationToken)
{
await _provider.Connection.CreateIndexAsync(typeof(Person));
}

public Task StopAsync(CancellationToken cancellationToken)
{
return Task.CompletedTask;
}
}

控制器PeopleController

public class PeopleController : Controller
{
private readonly RedisCollection<Person> _people;
private readonly RedisConnectionProvider _provider;

public PeopleController(RedisConnectionProvider provider)
{
_provider = provider;
_people = (RedisCollection<Person>)provider.RedisCollection<Person>();
}
[HttpPost]
[AllowAnonymous]
public async Task<Person> AddPerson(Person person)
{
await _people.InsertAsync(person);
return person;
}
}

调用POST API时出现 ERR unknown command 'JSON.SET' 错误,通常是Redis 版本不支持 RedisJSON

修改实体类解决

可以修改实体类的Document特性,改为StorageType.Hash

    //[Document(StorageType = StorageType.Json, Prefixes = new[] { "Person" })]
[Document(StorageType = StorageType.Hash, Prefixes = new[] { "Person" })]
public class Person
{
[RedisIdField]
[Indexed]
public string? Id { get; set; }

[Indexed]
public string? FirstName { get; set; }

[Indexed]
public string? LastName { get; set; }

[Indexed]
public int Age { get; set; }

[Searchable]
public string? PersonalStatement { get; set; }

[Indexed]
public string[] Skills { get; set; } = Array.Empty<string>();

[Indexed(CascadeDepth = 1)]
public Address? Address { get; set; }
}