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
}
}