[fix] 修正ZADD不支持超大Int64整数的问题,主要原因是它转为Double时使用了科学计数法,读取解析时需要支持。fix https://github.com/NewLifeX/NewLife.Redis/issues/152

This commit is contained in:
大石头 2025-06-29 12:34:19 +08:00
parent 0ff2b935fb
commit d1a624ca4f
6 changed files with 54 additions and 6 deletions

View File

@ -56,7 +56,7 @@
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="NewLife.Core" Version="11.5.2025.601" /> <PackageReference Include="NewLife.Core" Version="11.5.2025.629-beta0325" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>

View File

@ -25,6 +25,12 @@ public class RedisSortedSet<T> : RedisBase
/// <returns>添加到有序集合的成员数量,不包括已经存在更新分数的成员</returns> /// <returns>添加到有序集合的成员数量,不包括已经存在更新分数的成员</returns>
public Int32 Add(T member, Double score) => Execute((rc, k) => rc.Execute<String>("ZADD", Key, score, member), true).ToInt(-1); public Int32 Add(T member, Double score) => Execute((rc, k) => rc.Execute<String>("ZADD", Key, score, member), true).ToInt(-1);
/// <summary>添加元素并指定分数,返回添加到集合的成员数量</summary>
/// <param name="member">元素</param>
/// <param name="score">分数</param>
/// <returns>添加到有序集合的成员数量,不包括已经存在更新分数的成员</returns>
public Int32 Add(T member, Int64 score) => Execute((rc, k) => rc.Execute<String>("ZADD", Key, score, member), true).ToInt(-1);
/// <summary>批量添加,返回添加到集合的成员数量</summary> /// <summary>批量添加,返回添加到集合的成员数量</summary>
/// <param name="members"></param> /// <param name="members"></param>
/// <param name="score"></param> /// <param name="score"></param>
@ -41,6 +47,22 @@ public class RedisSortedSet<T> : RedisBase
return Execute((rc, k) => rc.Execute<String>("ZADD", args.ToArray()), true).ToInt(-1); return Execute((rc, k) => rc.Execute<String>("ZADD", args.ToArray()), true).ToInt(-1);
} }
/// <summary>批量添加,返回添加到集合的成员数量</summary>
/// <param name="members"></param>
/// <param name="score"></param>
/// <returns>添加到有序集合的成员数量,不包括已经存在更新分数的成员</returns>
public Int32 Add(IEnumerable<T> members, Int64 score)
{
var args = new List<Object> { Key };
foreach (var item in members)
{
args.Add(score);
args.Add(item!);
}
return Execute((rc, k) => rc.Execute<String>("ZADD", args.ToArray()), true).ToInt(-1);
}
/// <summary>删除元素</summary> /// <summary>删除元素</summary>
/// <param name="members"></param> /// <param name="members"></param>
/// <returns></returns> /// <returns></returns>

View File

@ -24,7 +24,7 @@
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="BenchmarkDotNet" Version="0.15.0" /> <PackageReference Include="BenchmarkDotNet" Version="0.15.0" />
<PackageReference Include="NewLife.Stardust" Version="3.3.2025.506" /> <PackageReference Include="NewLife.Stardust" Version="3.4.2025.601" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ProjectReference Include="..\..\NewLife.Redis\NewLife.Redis.csproj" /> <ProjectReference Include="..\..\NewLife.Redis\NewLife.Redis.csproj" />

View File

@ -16,7 +16,7 @@
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="NewLife.Core" Version="11.5.2025.601" /> <PackageReference Include="NewLife.Core" Version="11.5.2025.629-beta0325" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>

View File

@ -190,6 +190,32 @@ public class SortedSetTests
Assert.Equal(33.44, zset.GetScore("stone")); Assert.Equal(33.44, zset.GetScore("stone"));
} }
[Fact]
public void Add_xx2()
{
var rkey = "zset_add_xx2";
// 删除已有
_redis.Remove(rkey);
var zset = new RedisSortedSet<String>(_redis, rkey);
// 插入数据
var ticks = DateTime.Now.Ticks;
zset.Add("stone", ticks);
zset.Add("stone1", ticks);
Assert.Equal(2, zset.Count);
var r = zset.GetScore("stone");
var r1 = zset.GetScore("stone2");
var r2 = zset.Execute((r, k) => r.Execute("ZSCORE", zset.Key, "stone"), false);
Assert.Equal(ticks, r);
Assert.Equal(0, r1);
Assert.NotEmpty(r2);
Assert.NotEqual("0", r2);
}
[Fact] [Fact]
public void Add_nx() public void Add_nx()
{ {

View File

@ -9,11 +9,11 @@
<ItemGroup> <ItemGroup>
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="9.0.0" /> <PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="9.0.0" />
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.14.0" /> <PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.14.1" />
<PackageReference Include="NewLife.Core" Version="11.5.2025.601" /> <PackageReference Include="NewLife.Core" Version="11.5.2025.629-beta0325" />
<PackageReference Include="NewLife.UnitTest" Version="1.0.2025.101" /> <PackageReference Include="NewLife.UnitTest" Version="1.0.2025.101" />
<PackageReference Include="xunit" Version="2.9.3" /> <PackageReference Include="xunit" Version="2.9.3" />
<PackageReference Include="xunit.runner.visualstudio" Version="3.1.0"> <PackageReference Include="xunit.runner.visualstudio" Version="3.1.1">
<PrivateAssets>all</PrivateAssets> <PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets> <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference> </PackageReference>