常见异常
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; }
}