@@ -352,7 +352,7 @@ protected virtual TypedRedisValue SetEx(RedisClient client, in RedisRequest requ
352352 RedisKey key = request . GetKey ( 1 ) ;
353353 int seconds = request . GetInt32 ( 2 ) ;
354354 var value = request . GetValue ( 3 ) ;
355- SetEx ( client . Database , key , TimeSpan . FromSeconds ( seconds ) , value ) ;
355+ Set ( client . Database , key , value , TimeSpan . FromSeconds ( seconds ) ) ;
356356 return TypedRedisValue . OK ;
357357 }
358358
@@ -431,12 +431,6 @@ protected virtual TypedRedisValue Exec(RedisClient client, in RedisRequest reque
431431 return results ;
432432 }
433433
434- protected virtual void SetEx ( int database , in RedisKey key , TimeSpan timeout , in RedisValue value )
435- {
436- Set ( database , key , value ) ;
437- Expire ( database , key , timeout ) ;
438- }
439-
440434 [ RedisCommand ( 3 , nameof ( RedisCommand . CLIENT ) , "setname" , LockFree = true ) ]
441435 protected virtual TypedRedisValue ClientSetname ( RedisClient client , in RedisRequest request )
442436 {
@@ -967,13 +961,37 @@ protected virtual TypedRedisValue Get(RedisClient client, in RedisRequest reques
967961
968962 protected virtual RedisValue Get ( int database , in RedisKey key ) => throw new NotSupportedException ( ) ;
969963
970- [ RedisCommand ( 3 ) ]
964+ [ RedisCommand ( - 3 ) ]
971965 protected virtual TypedRedisValue Set ( RedisClient client , in RedisRequest request )
972966 {
973- Set ( client . Database , request . GetKey ( 1 ) , request . GetValue ( 2 ) ) ;
974- return TypedRedisValue . OK ;
967+ TimeSpan ? expiry = null ;
968+ var key = request . GetKey ( 1 ) ;
969+ var value = request . GetValue ( 2 ) ;
970+ SetFlags flags = SetFlags . None ;
971+ for ( int i = 3 ; i < request . Count ; i ++ )
972+ {
973+ if ( request . IsString ( i , "nx"u8 ) || request . IsString ( i , "NX"u8 ) ) flags |= SetFlags . NX ;
974+ else if ( request . IsString ( i , "xx"u8 ) || request . IsString ( i , "XX"u8 ) ) flags |= SetFlags . XX ;
975+ else if ( request . IsString ( i , "ex"u8 ) || request . IsString ( i , "EX"u8 ) ) expiry = TimeSpan . FromSeconds ( request . GetInt32 ( ++ i ) ) ;
976+ else if ( request . IsString ( i , "px"u8 ) || request . IsString ( i , "PX"u8 ) ) expiry = TimeSpan . FromMilliseconds ( request . GetInt32 ( ++ i ) ) ;
977+ else return TypedRedisValue . Error ( "ERR syntax error" ) ;
978+ }
979+ const SetFlags BOTH = SetFlags . NX | SetFlags . XX ;
980+ if ( ( flags & BOTH ) == BOTH ) return TypedRedisValue . Error ( "ERR Invalid flags combination" ) ;
981+ var result = Set ( client . Database , request . GetKey ( 1 ) , request . GetValue ( 2 ) , expiry , flags ) ;
982+ return result ? TypedRedisValue . OK : TypedRedisValue . BulkString ( RedisValue . Null ) ;
983+ }
984+
985+ [ Flags ]
986+ public enum SetFlags
987+ {
988+ None = 0 ,
989+ NX = 1 ,
990+ XX = 2 ,
975991 }
976- protected virtual void Set ( int database , in RedisKey key , in RedisValue value ) => throw new NotSupportedException ( ) ;
992+
993+ protected virtual bool Set ( int database , in RedisKey key , in RedisValue value , TimeSpan ? expiry = null , SetFlags flags = SetFlags . None ) => throw new NotSupportedException ( ) ;
994+
977995 [ RedisCommand ( 1 ) ]
978996 protected new virtual TypedRedisValue Shutdown ( RedisClient client , in RedisRequest request )
979997 {
0 commit comments