-
-
Notifications
You must be signed in to change notification settings - Fork 178
Expand file tree
/
Copy pathDirectory.Build.props
More file actions
205 lines (180 loc) · 11.6 KB
/
Copy pathDirectory.Build.props
File metadata and controls
205 lines (180 loc) · 11.6 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
<?xml version="1.0" encoding="utf-8"?>
<Project>
<!-- General information -->
<PropertyGroup>
<Authors>Ugo Lattanzi</Authors>
<VersionPrefix>13.0.1</VersionPrefix>
<!--
<VersionSuffix>pre</VersionSuffix>
-->
<TargetFrameworks>netstandard2.1;net8.0;net9.0;net10.0</TargetFrameworks>
<Nullable>enable</Nullable>
<IncludeSource>True</IncludeSource>
<IncludeSymbols>True</IncludeSymbols>
<SymbolPackageFormat>snupkg</SymbolPackageFormat>
<PublishRepositoryUrl>true</PublishRepositoryUrl>
<NoDefaultExcludes>true</NoDefaultExcludes>
<PackageReadmeFile>README.md</PackageReadmeFile>
<Copyright>Ugo Lattanzi</Copyright>
<NeutralLanguage>en-US</NeutralLanguage>
<GenerateDocumentationFile>true</GenerateDocumentationFile>
<DocumentationFile>bin\$(Configuration)\$(TargetFramework)\$(AssemblyName).xml</DocumentationFile>
<RepositoryUrl>https://github.com/imperugo/StackExchange.Redis.Extensions</RepositoryUrl>
<SuppressTfmSupportBuildWarnings Condition="$(TargetFramework.StartsWith('netcore'))">>true</SuppressTfmSupportBuildWarnings>
</PropertyGroup>
<!-- Packages stuff -->
<PropertyGroup>
<Title>StackExchange.Redis.Extensions — high-level Redis client with serialization, pooling, and typed APIs</Title>
<Summary>Extends StackExchange.Redis with object serialization, connection pooling, Pub/Sub, Streams, GeoSpatial, HyperLogLog, Distributed Lock, Bitmap, Lua Scripting, Hash field expiry, compression, and ASP.NET Core integration.</Summary>
<Description>StackExchange.Redis.Extensions is a library that extends StackExchange.Redis with higher-level APIs for common application scenarios. Compatible with StackExchange.Redis 2.x and 3.x.
Features:
- Store and retrieve complex .NET objects with pluggable serialization
- Connection pooling with LeastLoaded and RoundRobin strategies
- Pub/Sub messaging with typed handlers and error logging
- Redis Streams with consumer group support
- GeoSpatial indexes (GEOADD, GEOSEARCH, GEODIST)
- HyperLogLog for probabilistic cardinality estimation
- Distributed locking with IAsyncDisposable auto-release
- Bitmap operations for analytics and feature flags
- Lua scripting for atomic server-side operations
- Hash field expiry (Redis 7.4+ HEXPIRE/HSETEX)
- Transparent compression (LZ4, Snappy, Zstd, GZip, Brotli)
- Azure Managed Identity support
- ASP.NET Core DI integration
- Multiple named Redis instances
- Tags, Sets, Lists, Sorted Sets, key search
Serializer packages (pick one): System.Text.Json, Newtonsoft, MemoryPack, MsgPack, Protobuf, ServiceStack, Utf8Json.
</Description>
<PackageReleaseNotes>
v13.0.1:
- Performance: connection pool selection no longer allocates multiple ServerCounters snapshots per operation (LeastLoaded) and uses a true lock-free round-robin instead of a cryptographic RNG (RoundRobin)
- Performance: RedisDatabase instances are cached per database number instead of being allocated on every Db0..Db16 access
- Performance: HashGetAsync multi-key now issues a single HMGET instead of N parallel HGET round-trips
- Performance: UpdateExpiryAsync no longer issues a redundant EXISTS before EXPIRE (half the round-trips)
- Performance: AddAllAsync builds its payload without LINQ intermediate materializations
- Performance: eager materialization of previously lazy IEnumerable results (SetPopAsync, SortedSetRangeByScoreAsync, HashKeysAsync, SearchKeysAsync) — no more re-deserialization on repeated enumeration
- Performance: serializers (Newtonsoft, ServiceStack, MsgPack, Protobuf) no longer materialize intermediate UTF-16 strings or wrapping MemoryStreams
- Performance: compressors use pooled buffers (Snappier, Brotli, ZstdSharp) and reused Zstd contexts; Snappier.Decompress no longer duplicates the output array
- Performance: IDistributedCache adapter uses cached field arrays and batches HSET+EXPIRE in a single network write
- Fixed HashGetAllAsyncAtOneTimeAsync applying KeyPrefix to hash fields instead of the hash key, and removed a potential Lua injection through the hash key
- Fixed Utf8JsonSerializer.Deserialize throwing on null input instead of returning default
- Fixed ListGetFromRightAsync duplicated null check (dead code)
v13.0.0:
- Added HyperLogLog API: HyperLogLogAddAsync, HyperLogLogLengthAsync, HyperLogLogMergeAsync (#637)
- Added Distributed Lock API: LockTakeAsync, LockReleaseAsync, LockExtendAsync, LockQueryAsync, LockAcquireAsync with IAsyncDisposable auto-release (#638)
- Enriched Sorted Set API: SortedSetLengthAsync, SortedSetScoreAsync, SortedSetRankAsync, SortedSetIncrementAsync, SortedSetDecrementAsync, SortedSetPopAsync, SortedSetRandomMemberAsync, SortedSetCombineAndStoreAsync (#639)
- Enriched List API: ListAddToRightAsync, ListGetFromLeftAsync, ListLengthAsync, ListRangeAsync, ListGetByIndexAsync, ListSetByIndexAsync, ListTrimAsync, ListRemoveAsync, ListInsertBeforeAsync, ListInsertAfterAsync, ListMoveAsync (#640)
- Added Lua Scripting API: ScriptEvaluateAsync, ScriptEvaluateReadOnlyAsync with typed deserialization (#641)
- Added Bitmap API: StringSetBitAsync, StringGetBitAsync, StringBitCountAsync, StringBitOperationAsync, StringBitPositionAsync (#642)
- Added StackExchange.Redis 3.x compatibility via version range [2.12.14, 4.0.0) (#656)
- Added VectorSet tests now that Redis 8.0+ is available on Docker Hub (#648)
- Updated CI to use redis:8 Docker image for VectorSet test coverage
v12.6.0:
- Fixed Pub/Sub UnsubscribeAsync and UnsubscribeAllAsync not working with connection pooling — unsubscribe now iterates the pool to find the correct multiplexer (#657)
v12.5.0:
- Added IDistributedCache adapter with Hash-based storage compatible with Microsoft.Extensions.Caching.StackExchangeRedis (#632)
- Added ASP.NET Core Health Check for Redis connection pool monitoring (#633)
- Added StringIncrementAsync / StringDecrementAsync with long and double overloads (#634)
- Added SetCombineAsync / SetCombineAndStoreAsync for union, intersect, and difference operations (#635)
- Added Key Management: KeyRenameAsync, KeyTypeAsync, KeyDumpAsync, KeyRestoreAsync (#636)
- Added .NET 8+ Keyed DI Services for named Redis clients via [FromKeyedServices] (#654)
v12.2.0:
- Fixed SearchKeysAsync ignoring database number — SCAN now correctly targets the specified database instead of always scanning DB0 (#651)
- Fixed RemoveByTagAsync not deleting the tag Set key itself, causing a slow memory leak of empty tag Sets in Redis (#650)
- Upgraded Snappier to 1.3.x to fix high severity vulnerability (GHSA-pggp-6c3x-2xmx)
v12.1.0:
- Added VectorSet API for AI/ML similarity search (Redis 8.0+): VADD, VSIM, VREM, VCONTAINS, VCARD, VDIM, VGETATTR, VSETATTR, VINFO, VRANDMEMBER, VLINKS
- Added llms.txt for AI coding assistant documentation indexing
- Added Claude Code plugin with configure, scaffold, and diagnose skills
- Added complete API reference tables to all feature documentation
- Added SECURITY.md with GitHub Private Vulnerability Reporting
- Added CodeQL Advanced security analysis workflow
- Added CI workflow for automated testing on push/PR
v12.0.0:
- Added .NET 10 target framework
- Added GeoSpatial API (GEOADD, GEOSEARCH, GEODIST, GEOPOS, GEOHASH)
- Added Redis Streams API (XADD, XREAD, XREADGROUP, XACK, consumer groups)
- Added Hash field expiry (HEXPIRE, HSETEX, HPTTL, HPERSIST) for Redis 7.4+
- Added transparent compression support with pluggable ICompressor
- Added compression packages: LZ4, Snappy, Zstandard, GZip, Brotli
- Added Azure Managed Identity support via ConfigurationOptionsAsyncHandler
- Added CertificateSelection, ClientName, KeepAlive configuration properties
- Fixed SyncTimeout default from 1000ms to 5000ms
- Fixed Sentinel CommandMap blocking data commands (EVAL, GET, SET)
- Fixed AddAllAsync TTL race condition (now atomic per key)
- Fixed pool resilience: GetConnection skips disconnected connections
- Fixed PubSub handler silently swallowing exceptions
- Upgraded to StackExchange.Redis 2.12.14
- Upgraded to ConnectAsync (SE.Redis best practice)
- Replaced Moq with NSubstitute
</PackageReleaseNotes>
<PackageProjectUrl>https://github.com/imperugo/StackExchange.Redis.Extensions</PackageProjectUrl>
<PackageTags>Redis Cache Async NoSQL Distributed PubSub Streams GeoSpatial Compression Serialization DependencyInjection HyperLogLog Lock Bitmap Scripting</PackageTags>
</PropertyGroup>
<!-- Repo -->
<PropertyGroup>
<RepositoryUrl>https://github.com/imperugo/StackExchange.Redis.Extensions</RepositoryUrl>
<RepositoryType>Git</RepositoryType>
</PropertyGroup>
<!-- LICENSE -->
<PropertyGroup>
<PackageRequireLicenseAcceptance>true</PackageRequireLicenseAcceptance>
<PackageLicenseExpression>MIT</PackageLicenseExpression>
</PropertyGroup>
<!-- LANGUAGE -->
<PropertyGroup>
<LangVersion>preview</LangVersion>
<Features>strict</Features>
<TreatWarningsAsErrors>true</TreatWarningsAsErrors>
</PropertyGroup>
<ItemGroup>
<AssemblyAttribute Include="System.Runtime.CompilerServices.InternalsVisibleTo">
<_Parameter1>$(MSBuildProjectName).Tests</_Parameter1>
</AssemblyAttribute>
</ItemGroup>
<ItemGroup>
<None Include="$(MSBuildThisFileDirectory)README.md" Pack="true" PackagePath="\" />
</ItemGroup>
<ItemGroup>
<AssemblyAttribute Include="System.Diagnostics.CodeAnalysis.SuppressMessage">
<_Parameter1>Style</_Parameter1>
<_Parameter2>IDE0017:Simplify object initialization</_Parameter2>
</AssemblyAttribute>
</ItemGroup>
<ItemGroup>
<AssemblyAttribute Include="System.Diagnostics.CodeAnalysis.SuppressMessage">
<_Parameter1>Style</_Parameter1>
<_Parameter2>IDE0066:Use 'switch' expression</_Parameter2>
</AssemblyAttribute>
</ItemGroup>
<ItemGroup>
<PackageReference Include="AspNetCoreAnalyzers"
Version="0.3.*"
PrivateAssets="all"
IncludeAssets="runtime; build; native; contentfiles; analyzer"/>
<PackageReference Include="Microsoft.VisualStudio.Threading.Analyzers"
Version="[18.7.*,19.0.0)"
PrivateAssets="all"
IncludeAssets="runtime; build; native; contentfiles; analyzer"/>
<PackageReference Include="Roslynator.Analyzers"
Version="[4.15.*,5.0)"
PrivateAssets="all"
IncludeAssets="runtime; build; native; contentfiles; analyzer"/>
<PackageReference Include="Roslynator.CodeAnalysis.Analyzers"
Version="[4.15.*,5.0)"
PrivateAssets="all"
IncludeAssets="runtime; build; native; contentfiles; analyzer"/>
<PackageReference Include="Roslynator.Formatting.Analyzers"
Version="[4.15.*,5.0)"
PrivateAssets="all"
IncludeAssets="runtime; build; native; contentfiles; analyzer"/>
<PackageReference Include="Microsoft.CodeAnalysis.Analyzers"
Version="[5.3.*,6.0)"
PrivateAssets="all"
IncludeAssets="runtime; build; native; contentfiles; analyzer"/>
<PackageReference Include="Microsoft.CodeAnalysis.CSharp"
Version="[5.3.*,6.0)"
PrivateAssets="all"
IncludeAssets="runtime; build; native; contentfiles; analyzer"/>
</ItemGroup>
</Project>