Skip to content

Commit 5ef84a3

Browse files
OlenaKostashAntyaDev
authored andcommitted
Added redis example (#599)
* Added redis example * added missed config
1 parent 7b99218 commit 5ef84a3

File tree

9 files changed

+2463
-1
lines changed

9 files changed

+2463
-1
lines changed

examples/CSharpProd/CSharpProd.csproj

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,19 +10,23 @@
1010
<PackageReference Include="Bogus" Version="34.0.2" />
1111
<PackageReference Include="Dapper.Contrib" Version="2.0.78" />
1212
<PackageReference Include="LiteDB" Version="5.0.15" />
13-
<PackageReference Include="NBomber" Version="5.0.1" />
13+
<PackageReference Include="NBomber" Version="5.1.0" />
1414
<PackageReference Include="NBomber.Data" Version="5.0.0" />
1515
<PackageReference Include="NBomber.Http" Version="5.0.0" />
1616
<PackageReference Include="NBomber.Sinks.InfluxDB" Version="5.0.0" />
1717
<PackageReference Include="MQTTnet" Version="3.1.2" />
1818
<PackageReference Include="Serilog.Sinks.Elasticsearch" Version="9.0.0" />
19+
<PackageReference Include="StackExchange.Redis" Version="2.6.116" />
1920
<PackageReference Include="System.Data.SQLite.Core" Version="1.0.117" />
2021
</ItemGroup>
2122

2223
<ItemGroup>
2324
<None Update="Db\LiteDB\config.json">
2425
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
2526
</None>
27+
<None Update="DB\Redis\config.json">
28+
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
29+
</None>
2630
<None Update="DB\SQLiteDB\config.json">
2731
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
2832
</None>
@@ -46,4 +50,8 @@
4650
</None>
4751
</ItemGroup>
4852

53+
<ItemGroup>
54+
<Folder Include="DB\Redis\" />
55+
</ItemGroup>
56+
4957
</Project>
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
using NBomber.CSharp;
2+
3+
namespace CSharpProd.DB.Redis;
4+
5+
public class RedisExample
6+
{
7+
public void Run()
8+
{
9+
NBomberRunner.RegisterScenarios(
10+
new RedisInitScenario().Create(),
11+
new RedisReadScenario().Create(),
12+
new RedisWriteScenario().Create()
13+
)
14+
.LoadConfig("./DB/Redis/config.json")
15+
.Run();
16+
}
17+
}
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
using Microsoft.Extensions.Configuration;
2+
using NBomber.Contracts;
3+
using NBomber.CSharp;
4+
using NBomber.Data;
5+
using StackExchange.Redis;
6+
7+
namespace CSharpProd.DB.Redis;
8+
9+
public class RedisDbConfig
10+
{
11+
public string ConnectionString { get; set; }
12+
public int RecordsCount { get; set; }
13+
public int RecordSize { get; set; }
14+
}
15+
16+
public class RedisInitScenario
17+
{
18+
public ScenarioProps Create()
19+
{
20+
return Scenario.Empty("redis_init")
21+
.WithInit(context =>
22+
{
23+
var dbConfig = context.GlobalCustomSettings.Get<RedisDbConfig>();
24+
25+
var redis = ConnectionMultiplexer.Connect(dbConfig.ConnectionString);
26+
var db = redis.GetDatabase();
27+
var payload = Data.GenerateRandomBytes(dbConfig.RecordSize);
28+
29+
foreach (var i in Enumerable.Range(0, dbConfig.RecordsCount))
30+
{
31+
db.StringSet($"user-{i}", payload);
32+
}
33+
34+
return Task.CompletedTask;
35+
});
36+
}
37+
}
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
using Microsoft.Extensions.Configuration;
2+
using NBomber.Contracts;
3+
using NBomber.CSharp;
4+
using StackExchange.Redis;
5+
6+
namespace CSharpProd.DB.Redis;
7+
8+
public class RedisReadScenario
9+
{
10+
private RedisDbConfig _dbConfig;
11+
private ConnectionMultiplexer _redis;
12+
private IDatabase _db;
13+
private readonly Random _random = new();
14+
15+
public ScenarioProps Create()
16+
{
17+
return Scenario
18+
.Create("redis_read", async context =>
19+
{
20+
var randomId = _random.Next(_dbConfig.RecordsCount);
21+
byte[] data = await _db.StringGetAsync($"user-{randomId}");
22+
return Response.Ok(sizeBytes: data.Length);
23+
})
24+
.WithInit(context =>
25+
{
26+
_dbConfig = context.GlobalCustomSettings.Get<RedisDbConfig>();
27+
_redis = ConnectionMultiplexer.Connect(_dbConfig.ConnectionString);
28+
_db = _redis.GetDatabase();
29+
30+
return Task.CompletedTask;
31+
});
32+
}
33+
}
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
using Microsoft.Extensions.Configuration;
2+
using NBomber.Contracts;
3+
using NBomber.CSharp;
4+
using NBomber.Data;
5+
using StackExchange.Redis;
6+
7+
namespace CSharpProd.DB.Redis;
8+
9+
public class RedisWriteScenario
10+
{
11+
private RedisDbConfig _dbConfig;
12+
private ConnectionMultiplexer _redis;
13+
private IDatabase _db;
14+
private readonly Random _random = new();
15+
private byte[] _payload;
16+
17+
public ScenarioProps Create()
18+
{
19+
return Scenario
20+
.Create("redis_write", async context =>
21+
{
22+
var randomId = _random.Next(_dbConfig.RecordsCount);
23+
await _db.StringSetAsync($"user-{randomId}", _payload);
24+
return Response.Ok(sizeBytes: _payload.Length);
25+
})
26+
.WithInit(context =>
27+
{
28+
_dbConfig = context.GlobalCustomSettings.Get<RedisDbConfig>();
29+
_redis = ConnectionMultiplexer.Connect(_dbConfig.ConnectionString);
30+
_db = _redis.GetDatabase();
31+
_payload = Data.GenerateRandomBytes(_dbConfig.RecordSize);
32+
33+
return Task.CompletedTask;
34+
});
35+
}
36+
}
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
{
2+
"TargetScenarios": ["redis_init", "redis_read", "redis_write"],
3+
4+
"GlobalSettings": {
5+
6+
"ScenariosSettings": [
7+
{
8+
"ScenarioName": "redis_read",
9+
10+
"WarmUpDuration": "00:00:05",
11+
12+
"LoadSimulationsSettings": [
13+
{ "KeepConstant": [200, "00:03:30"] }
14+
]
15+
},
16+
17+
{
18+
"ScenarioName": "redis_write",
19+
20+
"WarmUpDuration": "00:00:05",
21+
22+
"LoadSimulationsSettings": [
23+
{ "KeepConstant": [200, "00:03:30"] }
24+
]
25+
}
26+
],
27+
28+
"GlobalCustomSettings": {
29+
"ConnectionString": "localhost:6379",
30+
"RecordsCount": 100000,
31+
"RecordSize": 2000
32+
}
33+
}
34+
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
version: '3.4'
2+
services:
3+
4+
redis:
5+
image: 'redis:7.0.2'
6+
# command: 'redis-server --save "30 1000" --appendonly yes --requirepass "" '
7+
command: 'redis-server --save "" --appendonly no --requirepass "" '
8+
# command: 'redis-server /usr/local/etc/redis/redis.conf'
9+
volumes:
10+
- './redis-data:/data'
11+
# - './redis-config/redis.conf:/usr/local/etc/redis/redis.conf'
12+
ports:
13+
- '6379:6379'
14+
15+
# to fix redis.conf you should set:
16+
# bind 0.0.0.0
17+
# protected-mode no
18+
# redis.conf should have ASCII encoding

0 commit comments

Comments
 (0)