这是StackExchange Redis流水线操作的一个很好的实现吗?

时间:2016-09-01 12:16:41

标签: asp.net redis stackexchange.redis

我从REDIS和StackExchange Redis客户端开始。我想知道我是否能够从REDIS一次性获得多个项目获得最佳性能。

情况: 我有一个ASP.NET MVC Web应用程序,它在用户的仪表板上显示个人日历。由于信息中心是目标网页,因此使用频繁。

要显示日历项目,我首先会获得该特定月份的所有日历项目ID:

RedisManager.RedisDb.StringGet("calendaritems_2016_8"); 
// this returns JSON Serialized List<int>

然后,对于每个日历项ID,我构建一个相应缓存键的列表:

"CalendarItemCache_1"
"CalendarItemCache_2"
"CalendarItemCache_3"
etc.

通过这个系列,我使用通用功能与REDIS联系:

var multipleItems = CacheHelper.GetMultiple<CalendarItemCache>(cacheKeys);

实施如下:

    public List<T> GetMultiple<T>(List<string> keys) where T : class
    {
        var taskList = new List<Task>();
        var returnList = new ConcurrentBag<T>();

        foreach (var key in keys)
        {
            Task<T> stringGetAsync = RedisManager.RedisDb.StringGetAsync(key)
                .ContinueWith(task =>
                {
                    if (!string.IsNullOrWhiteSpace(task.Result))
                    {
                        var deserializeFromJson = CurrentSerializer.Serializer.DeserializeFromJson<T>(task.Result);
                        returnList.Add(deserializeFromJson);
                        return deserializeFromJson;
                    }
                    else
                    {
                        return null;
                    }
                });
            taskList.Add(stringGetAsync);  
        }
        Task[] tasks = taskList.ToArray();
        Task.WaitAll(tasks);

        return returnList.ToList();
    }

我实施流水线是否正确? REDIS CLI监视器显示:

1472728336.718370 [0 127.0.0.1:50335] "GET" "CalendarItemCache_1"
1472728336.718389 [0 127.0.0.1:50335] "GET" "CalendarItemCache_2"
etc.

我期待某种MGET命令。

非常感谢提前。

1 个答案:

答案 0 :(得分:0)

我注意到StringGet的一个重载方法接受RedisKey []。使用它,我在监视器中看到一个MGET命令。

public static boolean isValidElement(String token) {
    int a1 = 214;
    if(a1 >= 0 && a1 <= 255){
        return true;
    }
    else

        return false;
    System.out.println(isValidElement); 

}