using ServiceStack.Redis; using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; namespace CarLocalMeter { public class RedisListService { private RedisClient _client; public RedisListService() { _client = new RedisClient(AppConfigCache.redisIp, AppConfigCache.redisPort); } #region #region Queue队列(先进先出) /// /// 入队 /// /// 集合Id /// 入队的值 /// 过期时间 秒 public void EnqueueItemOnList(string listId, string value, int timeout = 0) { _client.EnqueueItemOnList(listId, value); if (timeout > 0) _client.ExpireEntryIn(listId, TimeSpan.FromSeconds(timeout)); //也可以设置某个时间过去,比如下面的方式 //_client.ExpireEntryAt(listId,DateTime.Now.AddDays(7)); } /// /// 出队 /// /// 集合Id /// 出队的值 public string DequeueItemFromList(string listId) { return _client.DequeueItemFromList(listId); } /// /// 出队(阻塞) /// /// 集合Id /// 阻塞时间(超时时间) /// 出队的值 public string BlockingDequeueItemFromList(string listId, TimeSpan? timeOut) { return _client.BlockingDequeueItemFromList(listId, timeOut); } /// /// 从多个list中出队(阻塞) /// /// 集合Id /// 阻塞时间(超时时间) /// 返回出队的 listId & Item public ItemRef BlockingDequeueItemFromLists(string[] listIds, TimeSpan? timeOut) { return _client.BlockingDequeueItemFromLists(listIds, timeOut); } #endregion Queue队列(先进先出) #region Stack栈(后进先出) /// /// 入栈 /// /// 集合Id /// 入栈的值 public void PushItemToList(string listId, string value) { _client.PushItemToList(listId, value); } /// /// 入栈,并设置过期时间 /// /// 集合Id /// 入栈的值 /// 过期时间 public void PushItemToList(string listId, string value, DateTime expireAt) { _client.PushItemToList(listId, value); _client.ExpireEntryAt(listId, expireAt); } /// /// 入栈,并设置过期时间 /// /// 集合Id /// 入栈的值 /// 过期时间 public void PushItemToList(string listId, string value, TimeSpan expireIn) { _client.PushItemToList(listId, value); _client.ExpireEntryIn(listId, expireIn); } /// /// 出栈 /// /// 集合Id /// 出栈的值 public string PopItemFromList(string listId) { return _client.PopItemFromList(listId); } /// /// 出栈(阻塞) /// /// 集合Id /// 阻塞时间(超时时间) /// 出栈的值 public string BlockingPopItemFromList(string listId, TimeSpan? timeOut) { return _client.BlockingPopItemFromList(listId, timeOut); } /// /// 从多个list中出栈一个值(阻塞) /// /// 集合Id /// 阻塞时间(超时时间) /// 返回出栈的 listId & Item public ItemRef BlockingPopItemFromLists(string[] listIds, TimeSpan? timeOut) { return _client.BlockingPopItemFromLists(listIds, timeOut); } /// /// 从fromListId集合出栈并入栈到toListId集合 /// /// 出栈集合Id /// 入栈集合Id /// 返回移动的值 public string PopAndPushItemBetweenLists(string fromListId, string toListId) { return _client.PopAndPushItemBetweenLists(fromListId, toListId); } /// /// 从fromListId集合出栈并入栈到toListId集合(阻塞) /// /// 出栈集合Id /// 入栈集合Id /// 阻塞时间(超时时间) /// 返回移动的值 public string BlockingPopAndPushItemBetweenLists(string fromListId, string toListId, TimeSpan? timeOut) { return _client.BlockingPopAndPushItemBetweenLists(fromListId, toListId, timeOut); } #endregion Stack栈(后进先出) #region 赋值 /// /// 向list头部添加value值 /// public void PrependItemToList(string listId, string value) { _client.PrependItemToList(listId, value); } /// /// 向list头部添加value值,并设置过期时间 /// public void PrependItemToList(string listId, string value, DateTime expireAt) { _client.PrependItemToList(listId, value); _client.ExpireEntryAt(listId, expireAt); } /// /// 向list头部添加value值,并设置过期时间 /// public void PrependItemToList(string listId, string value, TimeSpan expireIn) { _client.PrependItemToList(listId, value); _client.ExpireEntryIn(listId, expireIn); } /// /// 向list中添加value值 /// public void AddItemToList(string listId, string value) { _client.AddItemToList(listId, value); } /// /// 向list中添加value值,并设置过期时间 /// public void AddItemToList(string listId, string value, DateTime expireAt) { _client.AddItemToList(listId, value); _client.ExpireEntryAt(listId, expireAt); } /// /// 向list中添加value值,并设置过期时间 /// public void AddItemToList(string listId, string value, TimeSpan expireIn) { _client.AddItemToList(listId, value); _client.ExpireEntryIn(listId, expireIn); } /// /// 向list中添加多个value值 /// public void AddRangeToList(string listId, List values) { _client.AddRangeToList(listId, values); } /// /// 向list中添加多个value值,并设置过期时间 /// public void AddRangeToList(string listId, List values, DateTime expireAt) { _client.AddRangeToList(listId, values); _client.ExpireEntryAt(listId, expireAt); } /// /// 向list中添加多个value值,并设置过期时间 /// public void AddRangeToList(string listId, List values, TimeSpan expireIn) { _client.AddRangeToList(listId, values); _client.ExpireEntryIn(listId, expireIn); } #endregion 赋值 #region 获取值 /// /// 获取指定list中包含的数据数量 /// public long GetListCount(string listId) { return _client.GetListCount(listId); } /// /// 获取指定list中包含的所有数据集合 /// public List GetAllItemsFromList(string listId) { return _client.GetAllItemsFromList(listId); } /// /// 获取指定list中下标从startingFrom到endingAt的值集合 /// public List GetRangeFromList(string listId, int startingFrom, int endingAt) { return _client.GetRangeFromList(listId, startingFrom, endingAt); } #endregion 获取值 #region 删除 /// /// 移除指定list中,listId/value,与参数相同的值,并返回移除的数量 /// public long RemoveItemFromList(string listId, string value) { return _client.RemoveItemFromList(listId, value); } /// /// 从指定list的尾部移除一个数据,并返回移除的数据 /// public string RemoveEndFromList(string listId) { return _client.RemoveEndFromList(listId); } /// /// 从指定list的头部移除一个数据,并返回移除的数据 /// public string RemoveStartFromList(string listId) { return _client.RemoveStartFromList(listId); } #endregion 删除 #region 其它 /// /// 清理数据,保持list长度 /// /// 集合Id /// 保留起点 /// 保留终点 public void TrimList(string listId, int keepStartingFrom, int keepEndingAt) { _client.TrimList(listId, keepStartingFrom, keepEndingAt); } #endregion 其它 #region 发布订阅 /// /// 发布 /// /// 频道 /// 消息 public void Publish(string channel, string message) { _client.PublishMessage(channel, message); } /// /// 订阅 /// /// 频道 /// public void Subscribe(string channel, Action actionOnMessage) { var subscription = _client.CreateSubscription(); subscription.OnSubscribe = c => { Console.WriteLine($"订阅频道{c}"); Console.WriteLine(); }; //取消订阅 subscription.OnUnSubscribe = c => { Console.WriteLine($"取消订阅 {c}"); Console.WriteLine(); }; subscription.OnMessage += (c, s) => { actionOnMessage(c, s, subscription); }; Console.WriteLine($"开始启动监听 {channel}"); subscription.SubscribeToChannels(channel); //blocking } /// /// 取消订阅 /// /// 频道 public void UnSubscribeFromChannels(string channel) { var subscription = _client.CreateSubscription(); subscription.UnSubscribeFromChannels(channel); } #endregion 发布订阅 #endregion } }