• 初识Redis(四)


    前面三节介绍了Redis的安装,Redis主从,Redis集群

    该章节介绍Redis C#中的应用 实例:在主服务器写入一个字符串,在从服务器读取字符串

      1  public sealed class RedisConfigInfo : ConfigurationSection
      2     {
      3         /// <summary>
      4         /// 获取配置信息
      5         /// </summary>
      6         /// <returns></returns>
      7         public static RedisConfigInfo GetConfig()
      8         {
      9             return GetConfig("redisconfig");
     10         }
     11         /// <summary>
     12         /// 获取配置信息
     13         /// </summary>
     14         /// <param name="sectionName">xml节点名称</param>
     15         /// <returns></returns>
     16         public static RedisConfigInfo GetConfig(string sectionName)
     17         {
     18             RedisConfigInfo section = (RedisConfigInfo)ConfigurationManager.GetSection(sectionName);
     19             if (section == null)
     20                 throw new ConfigurationErrorsException("Section " + sectionName + " is not found.");
     21             return section;
     22         }
     23         /// <summary>
     24         /// 可写的Redis链接地址
     25         /// </summary>
     26         [ConfigurationProperty("WriteServerList", IsRequired = false)]
     27         public string WriteServerList
     28         {
     29             get
     30             {
     31                 return (string)base["WriteServerList"];
     32             }
     33             set
     34             {
     35                 base["WriteServerList"] = value;
     36             }
     37         }
     38         /// <summary>
     39         /// 可读的Redis链接地址
     40         /// </summary>
     41         [ConfigurationProperty("ReadServerList", IsRequired = false)]
     42         public string ReadServerList
     43         {
     44             get
     45             {
     46                 return (string)base["ReadServerList"];
     47             }
     48             set
     49             {
     50                 base["ReadServerList"] = value;
     51             }
     52         }
     53         /// <summary>
     54         /// 最大写链接数
     55         /// </summary>
     56         [ConfigurationProperty("MaxWritePoolSize", IsRequired = false, DefaultValue = 5)]
     57         public int MaxWritePoolSize
     58         {
     59             get
     60             {
     61                 int _maxWritePoolSize = (int)base["MaxWritePoolSize"];
     62                 return _maxWritePoolSize > 0 ? _maxWritePoolSize : 5;
     63             }
     64             set
     65             {
     66                 base["MaxWritePoolSize"] = value;
     67             }
     68         }
     69         /// <summary>
     70         /// 最大读链接数
     71         /// </summary>
     72         [ConfigurationProperty("MaxReadPoolSize", IsRequired = false, DefaultValue = 5)]
     73         public int MaxReadPoolSize
     74         {
     75             get
     76             {
     77                 int _maxReadPoolSize = (int)base["MaxReadPoolSize"];
     78                 return _maxReadPoolSize > 0 ? _maxReadPoolSize : 5;
     79             }
     80             set
     81             {
     82                 base["MaxReadPoolSize"] = value;
     83             }
     84         }
     85         /// <summary>
     86         /// 自动重启
     87         /// </summary>
     88         [ConfigurationProperty("AutoStart", IsRequired = false, DefaultValue = true)]
     89         public bool AutoStart
     90         {
     91             get
     92             {
     93                 return (bool)base["AutoStart"];
     94             }
     95             set
     96             {
     97                 base["AutoStart"] = value;
     98             }
     99         }
    100         /// <summary>
    101         /// 本地缓存到期时间,单位:秒
    102         /// </summary>
    103         [ConfigurationProperty("LocalCacheTime", IsRequired = false, DefaultValue = 36000)]
    104         public int LocalCacheTime
    105         {
    106             get
    107             {
    108                 return (int)base["LocalCacheTime"];
    109             }
    110             set
    111             {
    112                 base["LocalCacheTime"] = value;
    113             }
    114         }
    115         /// <summary>
    116         /// 是否记录日志,该设置仅用于排查redis运行时出现的问题,如redis工作正常,请关闭该项
    117         /// </summary>
    118         [ConfigurationProperty("RecordeLog", IsRequired = false, DefaultValue = false)]
    119         public bool RecordeLog
    120         {
    121             get
    122             {
    123                 return (bool)base["RecordeLog"];
    124             }
    125             set
    126             {
    127                 base["RecordeLog"] = value;
    128             }
    129         }
    130         /// <summary>
    131         /// 默认开始db
    132         /// </summary>
    133         [ConfigurationProperty("DefaultDb", IsRequired = false)]
    134         public long DefaultDb
    135         {
    136             get
    137             {
    138                 return (long)base["DefaultDb"];
    139             }
    140             set
    141             {
    142                 base["DefaultDb"] = value;
    143             }
    144         }
    145 
    146     }
    View Code
    1 <?xml version="1.0" encoding="utf-8"?>
    2 <redisconfig WriteServerList="127.0.0.1:6379" ReadServerList="127.0.0.1:6379" MaxWritePoolSize="60" MaxReadPoolSize="60" AutoStart="true" LocalCacheTime="180" RecordeLog="false"></redisconfig>
    View Code
      1 public class RedisCache
      2     {
      3         #region -- 连接信息 --
      4         /// <summary>
      5         /// redis配置文件信息
      6         /// </summary>
      7         private static RedisConfigInfo redisConfigInfo = RedisConfigInfo.GetConfig();
      8         /// <summary>
      9         /// 创建链接池管理对象
     10         /// </summary>
     11         private static PooledRedisClientManager CreateManager(long dbId)
     12         {
     13             string[] writeServerList = SplitString(redisConfigInfo.WriteServerList, ",");
     14             string[] readServerList = SplitString(redisConfigInfo.ReadServerList, ",");
     15 
     16             return new PooledRedisClientManager(readServerList, writeServerList,
     17                              new RedisClientManagerConfig
     18                              {
     19                                  MaxWritePoolSize = redisConfigInfo.MaxWritePoolSize,
     20                                  MaxReadPoolSize = redisConfigInfo.MaxReadPoolSize,
     21                                  AutoStart = redisConfigInfo.AutoStart,
     22                                  DefaultDb = dbId
     23                              });
     24         }
     25         /// <summary>
     26         /// 字串转数组
     27         /// </summary>
     28         /// <param name="strSource">字串</param>
     29         /// <param name="split">分隔符</param>
     30         /// <returns></returns>
     31         private static string[] SplitString(string strSource, string split)
     32         {
     33             return strSource.Split(split.ToArray());
     34         }
     35         /// <summary>
     36         /// 获取redis客户端根据库ID号
     37         /// </summary>
     38         /// <param name="dbId">redis库Id</param>
     39         /// <returns></returns>
     40         private static PooledRedisClientManager GetClientManager(long dbId)
     41         {            
     42             return CreateManager(dbId);
     43         }
     44 
     45         #endregion
     46 
     47         #region -- Item --
     48         /// <summary>
     49         /// 设置单体
     50         /// </summary>
     51         /// <typeparam name="T">值类型</typeparam>
     52         /// <param name="key">键值</param>
     53         /// <param name="t"></param>
     54         /// <param name="dbId">库Id</param>
     55         /// <returns></returns>
     56         public static bool Set<T>(string key, T t, long dbId = 0)
     57         {
     58             var clientManager = GetClientManager(dbId);
     59             IRedisClient redis = clientManager.GetClient();
     60             var res = redis.Set<T>(key, t);
     61             clientManager.DisposeClient((RedisNativeClient)redis);
     62             redis.Dispose();
     63             clientManager.Dispose();
     64             return res;
     65         }
     66         /// <summary>
     67         /// 设置单体
     68         /// </summary>
     69         /// <typeparam name="T">值类型</typeparam>
     70         /// <param name="key">键值</param>
     71         /// <param name="t"></param>
     72         /// <param name="timeSpan">保存时间</param>
     73         /// <param name="dbId">库Id</param>
     74         /// <returns></returns>
     75         public static bool Set<T>(string key, T t, TimeSpan timeSpan, long dbId = 0)
     76         {
     77             var clientManager = GetClientManager(dbId);
     78             IRedisClient redis = clientManager.GetClient();
     79             var res = redis.Set<T>(key, t, timeSpan);
     80             clientManager.DisposeClient((RedisNativeClient)redis);
     81             redis.Dispose();
     82             clientManager.Dispose();
     83             return res;
     84         }
     85         /// <summary>
     86         /// 设置单体
     87         /// </summary>
     88         /// <typeparam name="T">值类型</typeparam>
     89         /// <param name="key">键值</param>
     90         /// <param name="t"></param>
     91         /// <param name="dateTime">过期时间</param>
     92         /// <returns></returns>
     93         public static bool Set<T>(string key, T t, DateTime dateTime, long dbId = 0)
     94         {
     95             var clientManager = GetClientManager(dbId);
     96             IRedisClient redis = clientManager.GetClient();
     97             var res = redis.Set<T>(key, t, dateTime);
     98             clientManager.DisposeClient((RedisNativeClient)redis);
     99             redis.Dispose();
    100             clientManager.Dispose();
    101             return res;
    102         }
    103 
    104         /// <summary>
    105         /// 获取单体
    106         /// </summary>
    107         /// <typeparam name="T">值类型</typeparam>
    108         /// <param name="key">键值</param>
    109         /// <returns></returns>
    110         public static T Get<T>(string key, long dbId = 0) where T : class
    111         {
    112             var clientManager = GetClientManager(dbId);
    113             IRedisClient redis = clientManager.GetClient();
    114             var res = redis.Get<T>(key);
    115             clientManager.DisposeClient((RedisNativeClient)redis);
    116             redis.Dispose();
    117             clientManager.Dispose();
    118             return res;
    119         }
    120         /// <summary>
    121         /// 移除单体
    122         /// </summary>
    123         /// <param name="key">键值</param>
    124         public static bool Remove(string key, long dbId = 0)
    125         {
    126             var clientManager = GetClientManager(dbId);
    127             IRedisClient redis = clientManager.GetClient();
    128             var res = redis.Remove(key);
    129             clientManager.DisposeClient((RedisNativeClient)redis);
    130             redis.Dispose();
    131             clientManager.Dispose();
    132             return res;
    133         }
    134         /// <summary>
    135         /// 清空所有缓存
    136         /// </summary>
    137         public static void RemoveAll(long dbId = 0)
    138         {
    139             var clientManager = GetClientManager(dbId);
    140             IRedisClient redis = clientManager.GetClient();
    141             redis.FlushDb();
    142             clientManager.DisposeClient((RedisNativeClient)redis);
    143             redis.Dispose();
    144             clientManager.Dispose();
    145         }
    146         #endregion
    147 
    148         #region -- List --
    149         /// <summary>
    150         /// 添加列表
    151         /// </summary>
    152         /// <typeparam name="T">类型</typeparam>
    153         /// <param name="key">键值</param>
    154         /// <param name="t"></param>
    155         /// <param name="dbId"></param>
    156         public static void List_Add<T>(string key, T t, long dbId = 0)
    157         {
    158             using (IRedisClient redis = CreateManager(dbId).GetClient())
    159             {
    160                 var redisTypedClient = redis.As<T>();
    161                 redisTypedClient.AddItemToList(redisTypedClient.Lists[key], t);
    162             }
    163         }
    164         /// <summary>
    165         /// 移除列表某个值
    166         /// </summary>
    167         /// <typeparam name="T">类型</typeparam>
    168         /// <param name="key">键值</param>
    169         /// <param name="t"></param>
    170         /// <param name="dbId"></param>
    171         /// <returns></returns>
    172         public static bool List_Remove<T>(string key, T t, long dbId = 0)
    173         {
    174             using (IRedisClient redis = CreateManager(dbId).GetClient())
    175             {
    176                 var redisTypedClient = redis.As<T>();
    177                 return redisTypedClient.RemoveItemFromList(redisTypedClient.Lists[key], t) > 0;
    178             }
    179         }
    180         /// <summary>
    181         /// 移除列表所有值
    182         /// </summary>
    183         /// <typeparam name="T">类型</typeparam>
    184         /// <param name="key">键值</param>
    185         /// <param name="dbId">库Id</param>
    186         public static void List_RemoveAll<T>(string key, long dbId = 0)
    187         {
    188             using (IRedisClient redis = CreateManager(dbId).GetClient())
    189             {
    190                 var redisTypedClient = redis.As<T>();
    191                 redisTypedClient.Lists[key].RemoveAll();
    192             }
    193         }
    194         /// <summary>
    195         /// 获取列表数据条数
    196         /// </summary>
    197         /// <param name="key"></param>
    198         /// <param name="dbId"></param>
    199         /// <returns></returns>
    200         public static long List_Count(string key, long dbId = 0)
    201         {
    202             using (IRedisClient redis = CreateManager(dbId).GetClient())
    203             {
    204                 return redis.GetListCount(key);
    205             }
    206         }
    207         /// <summary>
    208         /// 获取指定条数列表数据
    209         /// </summary>
    210         /// <typeparam name="T">类型</typeparam>
    211         /// <param name="key">键值</param>
    212         /// <param name="start">开始编号</param>
    213         /// <param name="count">条数</param>
    214         /// <param name="dbId"></param>
    215         /// <returns></returns>
    216         public static List<T> List_GetRange<T>(string key, int start, int count, long dbId = 0)
    217         {
    218             using (IRedisClient redis = CreateManager(dbId).GetClient())
    219             {
    220                 var c = redis.As<T>();
    221                 return c.Lists[key].GetRange(start, start + count - 1);
    222             }
    223         }
    224         /// <summary>
    225         /// 获取列表所有数据
    226         /// </summary>
    227         /// <typeparam name="T">类型</typeparam>
    228         /// <param name="key">键值</param>
    229         /// <param name="dbId">库数据</param>
    230         /// <returns></returns>
    231         public static List<T> List_GetList<T>(string key, long dbId = 0)
    232         {
    233             using (IRedisClient redis = CreateManager(dbId).GetClient())
    234             {
    235                 var c = redis.As<T>();
    236                 return c.Lists[key].GetRange(0, c.Lists[key].Count);
    237             }
    238         }
    239         /// <summary>
    240         /// 获取列表分页数据
    241         /// </summary>
    242         /// <typeparam name="T">类型</typeparam>
    243         /// <param name="key">键值</param>
    244         /// <param name="pageIndex">页码</param>
    245         /// <param name="pageSize">每页条数</param>
    246         /// <param name="dbId"></param>
    247         /// <returns></returns>
    248         public static List<T> List_GetList<T>(string key, int pageIndex, int pageSize, long dbId = 0)
    249         {
    250             int start = pageSize * (pageIndex - 1);
    251             return List_GetRange<T>(key, start, pageSize, dbId);
    252         }
    253         #endregion
    254 
    255         #region -- Set --
    256         /// <summary>
    257         /// 添加集合
    258         /// </summary>
    259         /// <typeparam name="T">类型</typeparam>
    260         /// <param name="key">键值</param>
    261         /// <param name="t">数值</param>
    262         /// <param name="dbId"></param>
    263         public static void Set_Add<T>(string key, T t, long dbId = 0)
    264         {
    265             using (IRedisClient redis = CreateManager(dbId).GetClient())
    266             {
    267                 var redisTypedClient = redis.As<T>();
    268                 redisTypedClient.Sets[key].Add(t);
    269             }
    270         }
    271         /// <summary>
    272         /// 集合是否包含指定数据
    273         /// </summary>
    274         /// <typeparam name="T">类型</typeparam>
    275         /// <param name="key">键值</param>
    276         /// <param name="t">数值</param>
    277         /// <param name="dbId"></param>
    278         /// <returns></returns>
    279         public static bool Set_Contains<T>(string key, T t, long dbId = 0)
    280         {
    281             using (IRedisClient redis = CreateManager(dbId).GetClient())
    282             {
    283                 var redisTypedClient = redis.As<T>();
    284                 return redisTypedClient.Sets[key].Contains(t);
    285             }
    286         }
    287         /// <summary>
    288         /// 移除集合某个值
    289         /// </summary>
    290         /// <typeparam name="T">类型</typeparam>
    291         /// <param name="key">键值</param>
    292         /// <param name="t">数值</param>
    293         /// <param name="dbId"></param>
    294         /// <returns></returns>
    295         public static bool Set_Remove<T>(string key, T t, long dbId = 0)
    296         {
    297             using (IRedisClient redis = CreateManager(dbId).GetClient())
    298             {
    299                 var redisTypedClient = redis.As<T>();
    300                 return redisTypedClient.Sets[key].Remove(t);
    301             }
    302         }
    303         #endregion
    304 
    305         #region -- Hash --
    306         /// <summary>
    307         /// 判断某个数据是否已经被缓存
    308         /// </summary>
    309         /// <typeparam name="T">类型</typeparam>
    310         /// <param name="key">hashID</param>
    311         /// <param name="dataKey">键值</param>
    312         /// <param name="dbId"></param>
    313         /// <returns></returns>
    314         public static bool Hash_Exist<T>(string key, string dataKey, long dbId = 0)
    315         {
    316             using (IRedisClient redis = CreateManager(dbId).GetClient())
    317             {
    318                 return redis.HashContainsEntry(key, dataKey);
    319             }
    320         }
    321 
    322         /// <summary>
    323         /// 存储数据到hash表
    324         /// </summary>
    325         /// <typeparam name="T">类型</typeparam>
    326         /// <param name="key">hashID</param>
    327         /// <param name="dataKey">键值</param>
    328         /// <param name="t">数值</param>
    329         /// <param name="dbId"></param>
    330         /// <returns></returns>
    331         public static bool Hash_Set<T>(string key, string dataKey, T t, long dbId = 0)
    332         {
    333             using (IRedisClient redis = CreateManager(dbId).GetClient())
    334             {
    335                 string value = ServiceStack.Text.JsonSerializer.SerializeToString<T>(t);
    336                 return redis.SetEntryInHash(key, dataKey, value);
    337             }
    338         }
    339         /// <summary>
    340         /// 移除hash中的某值
    341         /// </summary>
    342         /// <param name="key">hashID</param>
    343         /// <param name="dataKey">键值</param>
    344         /// <param name="dbId"></param>
    345         /// <returns></returns>
    346         public static bool Hash_Remove(string key, string dataKey, long dbId = 0)
    347         {
    348             using (IRedisClient redis = CreateManager(dbId).GetClient())
    349             {
    350                 return redis.RemoveEntryFromHash(key, dataKey);
    351             }
    352         }
    353         /// <summary>
    354         /// 移除整个hash
    355         /// </summary>
    356         /// <param name="key">hashID</param>
    357         /// <param name="dbId"></param>
    358         /// <returns></returns>
    359         public static bool Hash_Remove(string key, long dbId = 0)
    360         {
    361             using (IRedisClient redis = CreateManager(dbId).GetClient())
    362             {
    363                 return redis.Remove(key);
    364             }
    365         }
    366         /// <summary>
    367         /// 从hash表获取数据
    368         /// </summary>
    369         /// <typeparam name="T">类型</typeparam>
    370         /// <param name="key">hashID</param>
    371         /// <param name="dataKey">键值</param>
    372         /// <param name="dbId"></param>
    373         /// <returns></returns>
    374         public static T Hash_Get<T>(string key, string dataKey, long dbId = 0)
    375         {
    376             using (IRedisClient redis = CreateManager(dbId).GetClient())
    377             {
    378                 string value = redis.GetValueFromHash(key, dataKey);
    379                 return ServiceStack.Text.JsonSerializer.DeserializeFromString<T>(value);
    380             }
    381         }
    382         /// <summary>
    383         /// 获取整个hash的数据
    384         /// </summary>
    385         /// <typeparam name="T">类型</typeparam>
    386         /// <param name="key">hashID</param>
    387         /// <param name="dbId"></param>
    388         /// <returns></returns>
    389         public static List<T> Hash_GetAll<T>(string key, long dbId = 0)
    390         {
    391             using (IRedisClient redis = CreateManager(dbId).GetClient())
    392             {
    393                 var list = redis.GetHashValues(key);
    394                 if (list != null && list.Count > 0)
    395                 {
    396                     List<T> result = new List<T>();
    397                     foreach (var item in list)
    398                     {
    399                         var value = ServiceStack.Text.JsonSerializer.DeserializeFromString<T>(item);
    400                         result.Add(value);
    401                     }
    402                     return result;
    403                 }
    404                 return null;
    405             }
    406         }
    407         #endregion
    408 
    409         #region -- SortedSet --
    410         /// <summary>
    411         ///  添加数据到 SortedSet
    412         /// </summary>
    413         /// <typeparam name="T">类型</typeparam>
    414         /// <param name="key">集合id</param>
    415         /// <param name="t">数值</param>
    416         /// <param name="score">排序码</param>
    417         /// <param name="dbId"></param>
    418         public static bool SortedSet_Add<T>(string key, T t, double score, long dbId = 0)
    419         {
    420             using (IRedisClient redis = CreateManager(dbId).GetClient())
    421             {
    422                 string value = ServiceStack.Text.JsonSerializer.SerializeToString<T>(t);
    423                 return redis.AddItemToSortedSet(key, value, score);
    424             }
    425         }
    426         /// <summary>
    427         /// 移除数据从SortedSet
    428         /// </summary>
    429         /// <typeparam name="T">类型</typeparam>
    430         /// <param name="key">集合id</param>
    431         /// <param name="t">数值</param>
    432         /// <param name="dbId"></param>
    433         /// <returns></returns>
    434         public static bool SortedSet_Remove<T>(string key, T t, long dbId = 0)
    435         {
    436             using (IRedisClient redis = CreateManager(dbId).GetClient())
    437             {
    438                 string value = ServiceStack.Text.JsonSerializer.SerializeToString<T>(t);
    439                 return redis.RemoveItemFromSortedSet(key, value);
    440             }
    441         }
    442         /// <summary>
    443         /// 修剪SortedSet
    444         /// </summary>
    445         /// <param name="key">键值</param>
    446         /// <param name="size">保留的条数</param>
    447         /// <param name="dbId"></param>
    448         /// <returns></returns>
    449         public static long SortedSet_Trim(string key, int size, long dbId = 0)
    450         {
    451             using (IRedisClient redis = CreateManager(dbId).GetClient())
    452             {
    453                 return redis.RemoveRangeFromSortedSet(key, size, 9999999);
    454             }
    455         }
    456         /// <summary>
    457         /// 获取SortedSet的长度
    458         /// </summary>
    459         /// <param name="key">键值</param>
    460         /// <param name="dbId"></param>
    461         /// <returns></returns>
    462         public static long SortedSet_Count(string key, long dbId = 0)
    463         {
    464             using (IRedisClient redis = CreateManager(dbId).GetClient())
    465             {
    466                 return redis.GetSortedSetCount(key);
    467             }
    468         }
    469 
    470         /// <summary>
    471         /// 获取SortedSet的分页数据
    472         /// </summary>
    473         /// <typeparam name="T">类型</typeparam>
    474         /// <param name="key">键值</param>
    475         /// <param name="pageIndex">页码</param>
    476         /// <param name="pageSize">每页条数</param>
    477         /// <param name="dbId"></param>
    478         /// <returns></returns>
    479         public static List<T> SortedSet_GetList<T>(string key, int pageIndex, int pageSize, long dbId = 0)
    480         {
    481             using (IRedisClient redis = CreateManager(dbId).GetClient())
    482             {
    483                 var list = redis.GetRangeFromSortedSet(key, (pageIndex - 1) * pageSize, pageIndex * pageSize - 1);
    484                 if (list != null && list.Count > 0)
    485                 {
    486                     List<T> result = new List<T>();
    487                     foreach (var item in list)
    488                     {
    489                         var data = ServiceStack.Text.JsonSerializer.DeserializeFromString<T>(item);
    490                         result.Add(data);
    491                     }
    492                     return result;
    493                 }
    494             }
    495             return null;
    496         }
    497 
    498 
    499         /// <summary>
    500         /// 获取SortedSet的全部数据
    501         /// </summary>
    502         /// <typeparam name="T"></typeparam>
    503         /// <param name="key">键值</param>
    504         /// <param name="dbId"></param>
    505         /// <returns></returns>
    506         public static List<T> SortedSet_GetListALL<T>(string key, long dbId = 0)
    507         {
    508             using (IRedisClient redis = CreateManager(dbId).GetClient())
    509             {
    510                 var list = redis.GetRangeFromSortedSet(key, 0, 9999999);
    511                 if (list != null && list.Count > 0)
    512                 {
    513                     List<T> result = new List<T>();
    514                     foreach (var item in list)
    515                     {
    516                         var data = ServiceStack.Text.JsonSerializer.DeserializeFromString<T>(item);
    517                         result.Add(data);
    518                     }
    519                     return result;
    520                 }
    521             }
    522             return null;
    523         }
    524         #endregion
    525 
    526         #region 公用方法
    527         /// <summary>
    528         /// 设置缓存过期
    529         /// </summary>
    530         /// <param name="key">键值</param>
    531         /// <param name="datetime">过期时间</param>
    532         /// <param name="dbId"></param>
    533         public static void SetExpire(string key, DateTime datetime, long dbId = 0)
    534         {
    535             using (IRedisClient redis = CreateManager(dbId).GetClient())
    536             {
    537                 redis.ExpireEntryAt(key, datetime);
    538             }
    539         }
    540         #endregion
    541     }
    View Code
  • 相关阅读:
    扫面线模板
    (动态规划、栈)leetcode 84. Largest Rectangle in Histogram, 85. Maximal Rectangle
    tmux 常见命令汇总
    leetcode 221
    leetcode 319 29
    (贪心)leetcode 392. Is Subsequence, 771. Jewels and Stones, 463. Island Perimeter
    leetcode 982 668
    Python import 同文件夹下的py文件的函数,pycharm报错
    Windows里Anaconda-Navigator无法打开的解决方案
    Windows下 gpu版 Tensorflow 安装
  • 原文地址:https://www.cnblogs.com/bjrwx/p/9235158.html
Copyright © 2020-2023  润新知