CAST supports Redis via its NoSQL for .NET extension. Details about how this support is provided for .NET source code is discussed below.

Supported Client Libraries

StackExchange.Redis

ServiceStack.Redis

Supported Operations

OperationMethods Supported
Insert
  • StackExchange.Redis.IDatabase.StringSet
  • StackExchange.Redis.IDatabaseAsync.StringSetAsync
  • StackExchange.Redis.IDatabase.Add
  • StackExchange.Redis.IDatabase.GeoAdd'
  • StackExchange.Redis.IDatabase.HashSet
  • StackExchange.Redis.IDatabase.SetCombineAndStore
  • ServiceStack.Redis.RedisClient.AddItemToList
  • ServiceStack.Redis.RedisClient.AddItemToSet
  • ServiceStack.Redis.RedisClient.AddRangeToList
  • ServiceStack.Redis.RedisClient.AddRangeToSet
  • ServiceStack.Redis.RedisClient.CreateHashSet
  • ServiceStack.Redis.RedisClient.PushItemToList
Update
  • StackExchange.Redis.IDatabase.StringIncrement
  • StackExchange.Redis.IDatabaseAsync.StringIncrementAsync
  • StackExchange.Redis.IDatabase.KeyMigrate
  • ServiceStack.Redis.RedisClient.IncrementValueInHash
Select
  • StackExchange.Redis.IDatabase.StringGet
  • StackExchange.Redis.IDatabaseAsync.StringGetAsync
  • StackExchange.Redis.IDatabase.GeoRadius
  • StackExchange.Redis.IDatabaseAsync.GeoRadiusAsync
  • StackExchange.Redis.IDatabaseAsync.HashGetAllAsync
  • StackExchange.Redis.IDatabase.HashGetAll
  • StackExchange.Redis.IDatabase.HashScan
  • StackExchange.Redis.IDatabase.SetScan
  • StackExchange.Redis.IDatabase.Get
  • StackExchange.Redis.IDatabase.HashExists
  • .StackExchange.Redis.IDatabase.SetCombineAndStore
  • ServiceStack.Redis.RedisClient.GetHashCount
  • ServiceStack.Redis.RedisClient.GetHashKeys
  • ServiceStack.Redis.RedisClient.GetListCount
  • ServiceStack.Redis.RedisClient.GetSetCount
Delete 
  • StackExchange.Redis.IDatabase.KeyDelete
  • StackExchange.Redis.IDatabase.Remove
  • StackExchange.Redis.IDatabase.RemoveAll
  • StackExchange.Redis.IDatabase.KeyDump
  • ServiceStack.Redis.RedisClient.RemoveItemFromSet
  • ServiceStack.Redis.RedisClient.RemoveItemFromList
  • ServiceStack.Redis.RedisClient.PopItemFromList

Objects

Icon Description

DotNet Redis Connection

DotNet Redis Collection

DotNet Unknown Redis Connection

 

DotNet Unknown Redis Collection 

Links

Links are created for transaction and function point needs:

Link typeSource and destination of link Methods supported
parentLink

Between Redis Connection object and Redis Collection object


useLinkBetween the caller .NET Class / Method objects and Redis Collection objects



 useInsertLink
  • StringSet
  • StringSetAsync
  • Add
  • GeoAdd
  • HashSet
  • SetCombineAndStore
  • AddItemToList
  • AddItemToSet
  • AddRangeToList
  • AddRangeToSet
  • CreateHashSet
  • PushItemToList
  • GetSetCount
 useDeleteLink
  • KeyDelete
  • Remove
  • RemoveAll
  • KeyDump
  • RemoveItemFromSet
  • RemoveItemFromList
  • PopItemFromList

useSelectLink

  • StringGet
  • StringGetAsync
  • GeoRadius
  • GeoRadiusAsync
  • HashGetAllAsync
  • HashGetAll
  • Sort
  • HashScan
  • SetScan
  • Get
  • GetHashCount
  • GetHashKeys
  • GetListCount
useUpdateLink
  • StringIncrement
  • StringIncrementAsync
  • IncrementValueInHash

What results can you expect?

Once the analysis/snapshot generation has completed, you can view the results in the normal manner (for example via CAST Enlighten). Some examples are shown below.


Connections:


public Issue898()
        {
            mux = ConnectionMultiplexer.Connect("127.0.0.1:6379");
            db = mux.GetDatabase();
        }

Insert_operation


public async Task LoadAsync()
        {
            for (int i = 0; i < max; ++i)
            {
                await db.StringSetAsync(i.ToString(), i).ConfigureAwait(false);
            }
        }

public void AdditemlistById(string id)
        {
           
            if (this.Pipeline != null)
                GetRegisteredTypeIdsWithinPipeline(typeIdsSetKey).Remove(id);
            else
                this.AddItemToList("list_01", id);

Select_operation


[Benchmark(OperationsPerInvoke = max)]
        public async Task SampleAsync()
        {
            var rnd = new Random();

            for (int i = 0; i < max; ++i)
            {
                var r = rnd.Next(0, max - 1);

                var rv = await db.StringGetAsync(r.ToString()).ConfigureAwait(false);
                if (rv != r)
                {
                    throw new Exception($"Unexpected {rv}, expected {r}");
                }
            }
        }

Update_operation


public async Task<int> ExecuteIncrByAsync()
        {
            var rand = new Random(12345);

            db.KeyDelete(IncrByKey, CommandFlags.FireAndForget);
            int expected = 0;
            for (int i = 0; i < COUNT; i++)
            {
                int x = rand.Next(50);
                expected += x;
                await db.StringIncrementAsync(IncrByKey, x, CommandFlags.FireAndForget).ConfigureAwait(false);
            }
            int actual = (int)await db.StringGetAsync(IncrByKey).ConfigureAwait(false);
            if (actual != expected) throw new InvalidOperationException($"expected: {expected}, actual: {actual}");
            return actual;
        }


Delete_operation


public int ExecuteIncrBy()
        {
            var rand = new Random(12345);

            db.KeyDelete(IncrByKey, CommandFlags.FireAndForget);
            int expected = 0;
            for (int i = 0; i < COUNT; i++)
            {
                int x = rand.Next(50);
                expected += x;
                db.StringIncrement(IncrByKey, x, CommandFlags.FireAndForget);
            }
            int actual = (int)db.StringGet(IncrByKey);
            if (actual != expected) throw new InvalidOperationException($"expected: {expected}, actual: {actual}");
            return actual;
        }

public void RemoveitemlistById(string id)
        {
            var typeIdsSetKey = "List_1";
            if (this.Pipeline != null)
                GetRegisteredTypeIdsWithinPipeline(typeIdsSetKey).Remove(id);
            else
                this.RemoveItemFromList("list_01", id);
        }


Evolution

Limitations

Future development