Skip to content

Commit 0ac9ae9

Browse files
committed
Merge pull request ServiceStack#161 from msarchet/New_Set_Options
Initial Commands Added - looking for feedback
2 parents 658bb83 + 648e0fe commit 0ac9ae9

File tree

3 files changed

+69
-2
lines changed

3 files changed

+69
-2
lines changed

src/ServiceStack.Redis/Commands.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -174,5 +174,10 @@ public static class Commands
174174
//public readonly static byte[] Exists = "EXISTS".ToUtf8Bytes();
175175
public readonly static byte[] Flush = "FLUSH".ToUtf8Bytes();
176176
public readonly static byte[] Slowlog = "SLOWLOG".ToUtf8Bytes();
177+
178+
public readonly static byte[] ExpireInSeconds = "EX".ToUtf8Bytes();
179+
public readonly static byte[] ExpireInMilliseconds = "PX".ToUtf8Bytes();
180+
public readonly static byte[] SetIfKeyDoesNotExist = "NX".ToUtf8Bytes();
181+
public readonly static byte[] SetIfKeyExists = "XX".ToUtf8Bytes();
177182
}
178183
}

src/ServiceStack.Redis/RedisClient.cs

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,47 @@ public void SetEntry(string key, string value)
122122
base.Set(key, bytesValue);
123123
}
124124

125+
public void SetEntry(string key, string value, TimeSpan expireIn)
126+
{
127+
var bytesValue = value != null ? value.ToUtf8Bytes() : null;
128+
129+
if (expireIn.Milliseconds == 0)
130+
{
131+
base.Set(key, bytesValue, (int)expireIn.TotalSeconds);
132+
}
133+
else {
134+
base.Set(key, bytesValue, null, (long)expireIn.TotalMilliseconds);
135+
}
136+
}
137+
138+
public void SetEntryIfExists(string key, string value, TimeSpan expireIn)
139+
{
140+
var bytesValue = value != null ? value.ToUtf8Bytes() : null;
141+
142+
if (expireIn.Milliseconds == 0)
143+
{
144+
base.Set(key, bytesValue, (int)expireIn.TotalSeconds, null, true);
145+
}
146+
else
147+
{
148+
base.Set(key, bytesValue, null, (long)expireIn.TotalMilliseconds, true);
149+
}
150+
}
151+
152+
public void SetEntryIfNotExists(string key, string value, TimeSpan expireIn)
153+
{
154+
var bytesValue = value != null ? value.ToUtf8Bytes() : null;
155+
156+
if (expireIn.Milliseconds == 0)
157+
{
158+
base.Set(key, bytesValue, (int)expireIn.TotalSeconds, null, false);
159+
}
160+
else
161+
{
162+
base.Set(key, bytesValue, null, (long)expireIn.TotalMilliseconds, false);
163+
}
164+
}
165+
125166
public void ChangeDb(long db)
126167
{
127168
Db = db;

src/ServiceStack.Redis/RedisNativeClient.cs

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -315,7 +315,7 @@ public long StrLen(string key)
315315
return SendExpectLong(Commands.StrLen, key.ToUtf8Bytes());
316316
}
317317

318-
public void Set(string key, byte[] value)
318+
public void Set(string key, byte[] value, int? expirySeconds = null, long? expiryMs = null, bool? exists = null)
319319
{
320320
if (key == null)
321321
throw new ArgumentNullException("key");
@@ -324,7 +324,28 @@ public void Set(string key, byte[] value)
324324
if (value.Length > OneGb)
325325
throw new ArgumentException("value exceeds 1G", "value");
326326

327-
SendExpectSuccess(Commands.Set, key.ToUtf8Bytes(), value);
327+
if (!expirySeconds.HasValue && !exists.HasValue)
328+
{
329+
SendExpectSuccess(Commands.Set, key.ToUtf8Bytes(), value);
330+
}
331+
else if (!exists.HasValue && expiryMs.HasValue)
332+
{
333+
SendExpectSuccess(Commands.Set, key.ToUtf8Bytes(), value, Commands.ExpireInMilliseconds, expiryMs.Value.ToUtf8Bytes());
334+
}
335+
else if (!exists.HasValue && expirySeconds.HasValue)
336+
{
337+
SendExpectSuccess(Commands.Set, key.ToUtf8Bytes(), value, Commands.ExpireInSeconds, expirySeconds.Value.ToUtf8Bytes());
338+
}
339+
else if (exists.HasValue && !expirySeconds.HasValue && !expiryMs.HasValue)
340+
{
341+
SendExpectSuccess(Commands.Set, key.ToUtf8Bytes(), value, exists.Value ? Commands.SetIfKeyExists : Commands.SetIfKeyDoesNotExist);
342+
}
343+
else if (exists.HasValue && expirySeconds.HasValue) {
344+
SendExpectSuccess(Commands.Set, key.ToUtf8Bytes(), value, exists.Value ? Commands.SetIfKeyExists : Commands.SetIfKeyDoesNotExist, Commands.ExpireInSeconds, expirySeconds.Value.ToUtf8Bytes());
345+
}
346+
else if (exists.HasValue && expiryMs.HasValue) {
347+
SendExpectSuccess(Commands.Set, key.ToUtf8Bytes(), value, exists.Value ? Commands.SetIfKeyExists : Commands.SetIfKeyDoesNotExist, Commands.ExpireInMilliseconds, expiryMs.Value.ToUtf8Bytes());
348+
}
328349
}
329350

330351
public void SetEx(string key, int expireInSeconds, byte[] value)

0 commit comments

Comments
 (0)