Redis缓存服务器是一款key/value数据库,读110000次/s,写81000次/s,因为是内存操作所以速度飞快,常见用法有存用户令牌、短信验证码等

官网显示Redis本身并没有Windows版本的,微软官方开发了基于Windows的Redis服务器:MSOpenTech/redis

一、Redis服务端

首先下载Redis服务器,点击前往下载.msi版本,双击安装Redis服务端就有了,并以服务的形式随系统一起启动:

安装好Redis服务器之后第一件事就是设置密码,进入安装目录:C:\Program Files\Redis - 找到配置文件:redis.windows-service.conf - 找到:# requirepass foobared - 回车换行加上:requirepass 这里写自己的新密码(顶行写,前面不要留空格) - 到服务里重启Redis服务,或者重启电脑

不设置密码的坏处,看看携程这哥们的遭遇就知道了:记一次Redis被攻击的事件

二、Redis客户端(命令行和可视化工具RDM)

命令行方式演示:启动Redis客户端、读写Redis服务器

上图命令解释:

cd C:\Program Files\Redis:cd命令进入Redis安装目录,相当于Windows系统里双击进入Redis的安装目录

redis-cli.exe:打开redis-cli客户端程序,相当于Windows系统里双击运行一个exe程序(安装了上面的Redis服务端程序,需要一个客户端程序连接这个服务端。连接本机redis服务器直接敲此命令,连接远程的需要加ip和端口,例:redis-cli.exe -h 111.11.11.111 -p 6379)

keys *:查看所有键值对(如果Redis服务器设置了密码,这条命令会报错,需要先输入密码,执行此命令:auth 你的密码)

set blog oppoic.cnblogs.com:设置一个键值对,键是:blog,值是:oppoic.cnblogs.com(按目录存储:set 目录名:键 值)

get blog:获取键为blog对应的值

keys *:查看所有键值对

其他常用命令:

config get dir:获取redis安装目录

ping:返回PONG表示redis服务器正常

redis-cli.exe:进入第一个数据库(默认),redis一共0到15共16个库,进入第三个库 redis-cli -n 2(已经进去了,select 0~15 随意切换)

quit:退出redis程序

exit:退出dos窗口

flushdb:删除当前选择数据库中的所有key

flushall:删除所有数据库中的数据库

更多命令:https://redis.io/commands

至此,一个运行在本机的Redis缓存服务器已经搭建完成,并且可以读写了。但是命令行显然对小白用户不友好,可视化工具登场:Redis Desktop Manager

左侧树显示已经有一个连接了,点击底部的Connect to Redis Server再添加一个连接:

Name:连接名称,随便起

Host:主机地址,本机就是127.0.0.1,远程的输入对应IP

Port:端口,Redis服务器默认端口6379

Auth:密码,设置了就输,没设置留空

连上Redis服务器就可以看到,默认16个库(配置文件可改),索引从0开始。常见用法是一个项目一个库,项目下不同功能模块分不同目录存在这个库下。

有了可视化工具之后的操作就不用说了,双击,右键新建、删除。。。会用Windows系统的都会用这个工具。相比于命令行,Redis Desktop Manager这个可视化工具更友好,调试远程服务器上的数据也更方便,指哪打哪。

注:本机可以这样,连接远程服务器需要到服务器上的Redis安装目录下,找到redis.windows-service.conf文件,找到bind 127.0.0.1 前面加"#"注释掉,然后到服务里右键重启redis服务

三、C#操作Redis服务器

以上都是命令行和可视化工具操作Redis服务器,C#程序操作Redis需要借助StackExchange.Redis,为了统一调用,封装了一个RedisHelper帮助类:

2017.02.08:RedisHelper.cs代码有修改,请下载文章结尾提供的源码

  1. using Newtonsoft.Json;
  2. using StackExchange.Redis;
  3. using System;
  4. using System.Collections.Generic;
  5. using System.ComponentModel;
  6. using System.Configuration;
  7. using System.Reflection;
  8. using System.Text;
  9. using System.Linq;
  10.  
  11. namespace redis_Demo
  12. {
  13. /// <summary>
  14. /// Redis 帮助类
  15. /// </summary>
  16. public static class RedisHelper
  17. {
  18. private static string _conn = ConfigurationManager.AppSettings["redis_connection_string"] ?? "127.0.0.1:6379";
  19. private static string _pwd = ConfigurationManager.AppSettings["redis_connection_pwd"] ?? "";
  20. private static int _store_db = string.IsNullOrEmpty(ConfigurationManager.AppSettings["redis_store_db"]) ? - : Convert.ToInt32(ConfigurationManager.AppSettings["redis_store_db"]);
  21.  
  22. static ConnectionMultiplexer _redis;
  23. static readonly object _locker = new object();
  24.  
  25. #region 单例模式
  26. public static ConnectionMultiplexer Manager
  27. {
  28. get
  29. {
  30. if (_redis == null)
  31. {
  32. lock (_locker)
  33. {
  34. if (_redis != null) return _redis;
  35. _redis = GetManager();
  36. return _redis;
  37. }
  38. }
  39. return _redis;
  40. }
  41. }
  42.  
  43. private static ConnectionMultiplexer GetManager(string connectionString = null)
  44. {
  45. if (string.IsNullOrEmpty(connectionString))
  46. {
  47. connectionString = _conn;
  48. }
  49. var options = ConfigurationOptions.Parse(connectionString);
  50. options.Password = _pwd;
  51. return ConnectionMultiplexer.Connect(options);
  52. }
  53. #endregion
  54.  
  55. #region 辅助方法
  56. /// <summary>
  57. /// 获取要操作的库
  58. /// </summary>
  59. /// <param name="db">库,0和-1都是第一个库,1是第二个库...</param>
  60. /// <returns></returns>
  61. private static int GetOperationDB(int db)
  62. {
  63. if (db == -)
  64. {
  65. return _store_db;
  66. }
  67. else
  68. {
  69. return db;
  70. }
  71. }
  72.  
  73. private static string ConvertJson<T>(T value)
  74. {
  75. string result = value is string ? value.ToString() : JsonConvert.SerializeObject(value);
  76. return result;
  77. }
  78.  
  79. private static T ConvertObj<T>(RedisValue value)
  80. {
  81. if (string.IsNullOrEmpty(value))
  82. {
  83. return default(T);
  84. }
  85. else
  86. {
  87. return JsonConvert.DeserializeObject<T>(value);
  88. }
  89. }
  90.  
  91. private static List<T> ConvetList<T>(RedisValue[] values)
  92. {
  93. List<T> result = new List<T>();
  94. foreach (var item in values)
  95. {
  96. var model = ConvertObj<T>(item);
  97. if (model != null)
  98. result.Add(model);
  99. }
  100. return result;
  101. }
  102.  
  103. private static RedisKey[] ConvertRedisKeys(List<string> redisKeys, string prefix)
  104. {
  105. if (string.IsNullOrEmpty(prefix))
  106. {
  107. return redisKeys.Select(redisKey => (RedisKey)redisKey).ToArray();
  108. }
  109. else
  110. {
  111. return redisKeys.Select(redisKey => (RedisKey)(prefix + ":" + redisKey)).ToArray();
  112. }
  113. }
  114.  
  115. /// <summary>
  116. /// 获得枚举的Description
  117. /// </summary>
  118. /// <param name="value">枚举值</param>
  119. /// <param name="nameInstead">当枚举值没有定义DescriptionAttribute,是否使用枚举名代替,默认是使用</param>
  120. /// <returns>枚举的Description</returns>
  121. private static string GetDescription(this Enum value, Boolean nameInstead = true)
  122. {
  123. Type type = value.GetType();
  124. string name = Enum.GetName(type, value);
  125. if (name == null)
  126. {
  127. return null;
  128. }
  129.  
  130. FieldInfo field = type.GetField(name);
  131. DescriptionAttribute attribute = Attribute.GetCustomAttribute(field, typeof(DescriptionAttribute)) as DescriptionAttribute;
  132.  
  133. if (attribute == null && nameInstead == true)
  134. {
  135. return name;
  136. }
  137. return attribute == null ? null : attribute.Description;
  138. }
  139. #endregion
  140.  
  141. #region 通用(key)
  142. /// <summary>
  143. /// 是否存在
  144. /// </summary>
  145. /// <param name="folder">目录</param>
  146. /// <param name="key">键</param>
  147. /// <param name="db">库,默认读取配置文件</param>
  148. public static bool KeyExists(CacheFolderEnum folder, string key, int db = -)
  149. {
  150. try
  151. {
  152. db = GetOperationDB(db);
  153. string fd = GetDescription(folder);
  154. return Manager.GetDatabase(db).KeyExists(string.IsNullOrEmpty(fd) ? key : fd + ":" + key);
  155. }
  156. catch (Exception)
  157. {
  158. return false;
  159. }
  160. }
  161.  
  162. /// <summary>
  163. /// 设置过期时间
  164. /// </summary>
  165. /// <param name="folder">目录</param>
  166. /// <param name="key">键</param>
  167. /// <param name="min">过期时间,单位:分钟</param>
  168. /// <param name="db">库,默认读取配置文件</param>
  169. public static bool KeyExpire(CacheFolderEnum folder, string key, int min = , int db = -)
  170. {
  171. try
  172. {
  173. db = GetOperationDB(db);
  174. string fd = GetDescription(folder);
  175. return Manager.GetDatabase(db).KeyExpire(string.IsNullOrEmpty(fd) ? key : fd + ":" + key, DateTime.Now.AddMinutes(min));
  176. }
  177. catch (Exception)
  178. {
  179. return false;
  180. }
  181. }
  182.  
  183. /// <summary>
  184. /// 修改键
  185. /// </summary>
  186. /// <param name="folder">目录</param>
  187. /// <param name="key">键</param>
  188. /// <param name="newKey">新键</param>
  189. /// <param name="db">库,默认读取配置文件</param>
  190. /// <returns></returns>
  191. public static bool KeyRename(CacheFolderEnum folder, string key, string newKey, int db = -)
  192. {
  193. try
  194. {
  195. db = GetOperationDB(db);
  196. string fd = GetDescription(folder);
  197. return Manager.GetDatabase(db).KeyRename(string.IsNullOrEmpty(fd) ? key : fd + ":" + key, string.IsNullOrEmpty(fd) ? newKey : fd + ":" + newKey);
  198. }
  199. catch (Exception)
  200. {
  201. return false;
  202. }
  203. }
  204.  
  205. /// <summary>
  206. /// 删除
  207. /// </summary>
  208. /// <param name="folder">目录</param>
  209. /// <param name="key">键</param>
  210. /// <param name="db">库,默认读取配置文件</param>
  211. /// <returns></returns>
  212. public static bool KeyDelete(CacheFolderEnum folder, string key, int db = -)
  213. {
  214. try
  215. {
  216. db = GetOperationDB(db);
  217. string fd = GetDescription(folder);
  218. return Manager.GetDatabase(db).KeyDelete(string.IsNullOrEmpty(fd) ? key : fd + ":" + key);
  219. }
  220. catch (Exception)
  221. {
  222. return false;
  223. }
  224. }
  225.  
  226. /// <summary>
  227. /// 批量删除
  228. /// </summary>
  229. /// <param name="folder">目录</param>
  230. /// <param name="keys">键</param>
  231. /// <param name="db">库,默认读取配置文件</param>
  232. /// <returns></returns>
  233. public static long KeyDelete(CacheFolderEnum folder, List<string> keys, int db = -)
  234. {
  235. try
  236. {
  237. db = GetOperationDB(db);
  238. string fd = GetDescription(folder);
  239. return Manager.GetDatabase(db).KeyDelete(ConvertRedisKeys(keys, fd));
  240. }
  241. catch (Exception)
  242. {
  243. return ;
  244. }
  245. }
  246. #endregion
  247.  
  248. #region String
  249. /// <summary>
  250. /// 添加单个
  251. /// </summary>
  252. /// <param name="folder">目录</param>
  253. /// <param name="key">键</param>
  254. /// <param name="value">值</param>
  255. /// <param name="expireMinutes">过期时间,单位:分钟</param>
  256. /// <param name="db">库,默认读取配置文件</param>
  257. /// <returns></returns>
  258. public static bool StringSet(CacheFolderEnum folder, string key, string value, int expireMinutes = , int db = -)
  259. {
  260. db = GetOperationDB(db);
  261. string fd = GetDescription(folder);
  262. return Manager.GetDatabase(db).StringSet(string.IsNullOrEmpty(fd) ? key : fd + ":" + key, value, TimeSpan.FromMinutes(expireMinutes));
  263. }
  264.  
  265. /// <summary>
  266. /// 批量添加
  267. /// </summary>
  268. /// <param name="folder">目录</param>
  269. /// <param name="keysStr">键</param>
  270. /// <param name="valuesStr">值</param>
  271. /// <param name="db">库,默认读取配置文件</param>
  272. /// <returns></returns>
  273. public static bool StringSet(CacheFolderEnum folder, string[] keysStr, string[] valuesStr, int db = -)
  274. {
  275. db = GetOperationDB(db);
  276. string fd = GetDescription(folder);
  277. var count = keysStr.Length;
  278. var keyValuePair = new KeyValuePair<RedisKey, RedisValue>[count];
  279. for (int i = ; i < count; i++)
  280. {
  281. keyValuePair[i] = new KeyValuePair<RedisKey, RedisValue>(string.IsNullOrEmpty(fd) ? keysStr[i] : fd + ":" + keysStr[i], valuesStr[i]);
  282. }
  283. return Manager.GetDatabase(db).StringSet(keyValuePair);
  284. }
  285.  
  286. /// <summary>
  287. /// 添加对象
  288. /// </summary>
  289. /// <typeparam name="T">类型</typeparam>
  290. /// <param name="folder">目录</param>
  291. /// <param name="key">键</param>
  292. /// <param name="obj">值</param>
  293. /// <param name="expireMinutes">过期时间,单位:分钟</param>
  294. /// <param name="db">库,默认读取配置文件</param>
  295. /// <returns></returns>
  296. public static bool StringSet<T>(CacheFolderEnum folder, string key, T obj, int expireMinutes = , int db = -)
  297. {
  298. db = GetOperationDB(db);
  299. string fd = GetDescription(folder);
  300. string json = ConvertJson(obj);
  301. return Manager.GetDatabase(db).StringSet(string.IsNullOrEmpty(fd) ? key : fd + ":" + key, json, TimeSpan.FromMinutes(expireMinutes));
  302. }
  303.  
  304. /// <summary>
  305. /// 获取单个
  306. /// </summary>
  307. /// <param name="folder">目录</param>
  308. /// <param name="key">键</param>
  309. /// <param name="db">库,默认读取配置文件</param>
  310. /// <returns></returns>
  311. public static string StringGet(CacheFolderEnum folder, string key, int db = -)
  312. {
  313. db = GetOperationDB(db);
  314. string fd = GetDescription(folder);
  315. return Manager.GetDatabase(db).StringGet(string.IsNullOrEmpty(fd) ? key : fd + ":" + key);
  316. }
  317.  
  318. /// <summary>
  319. /// 获取多个
  320. /// </summary>
  321. /// <param name="folder">目录</param>
  322. /// <param name="keys">键</param>
  323. /// <param name="db">库,默认读取配置文件</param>
  324. /// <returns></returns>
  325. public static RedisValue[] StringGet(CacheFolderEnum folder, List<string> keys, int db = -)
  326. {
  327. db = GetOperationDB(db);
  328. string fd = GetDescription(folder);
  329. return Manager.GetDatabase(db).StringGet(ConvertRedisKeys(keys, fd));
  330. }
  331.  
  332. /// <summary>
  333. /// 获取对象
  334. /// </summary>
  335. /// <typeparam name="T">类型</typeparam>
  336. /// <param name="folder">目录</param>
  337. /// <param name="key">键</param>
  338. /// <param name="db">库,默认读取配置文件</param>
  339. /// <returns></returns>
  340. public static T StringGet<T>(CacheFolderEnum folder, string key, int db = -)
  341. {
  342. db = GetOperationDB(db);
  343. string fd = GetDescription(folder);
  344. string value = Manager.GetDatabase(db).StringGet(string.IsNullOrEmpty(fd) ? key : fd + ":" + key);
  345. return ConvertObj<T>(value);
  346. }
  347. #endregion
  348.  
  349. #region List
  350. /// <summary>
  351. /// 获取
  352. /// </summary>
  353. /// <typeparam name="T">类型</typeparam>
  354. /// <param name="folder">目录</param>
  355. /// <param name="key">键</param>
  356. /// <param name="start">索引开始</param>
  357. /// <param name="stop">索引结束</param>
  358. /// <param name="db">库,默认读取配置文件</param>
  359. /// <returns></returns>
  360. public static List<T> ListRange<T>(CacheFolderEnum folder, string key, long start = , long stop = -, int db = -)
  361. {
  362. db = GetOperationDB(db);
  363. string fd = GetDescription(folder);
  364. var value = Manager.GetDatabase(db).ListRange(string.IsNullOrEmpty(fd) ? key : fd + ":" + key, start, stop);
  365. return ConvetList<T>(value);
  366. }
  367.  
  368. /// <summary>
  369. /// 获取指定
  370. /// </summary>
  371. /// <typeparam name="T">类型</typeparam>
  372. /// <param name="folder">目录</param>
  373. /// <param name="key">键</param>
  374. /// <param name="index">索引</param>
  375. /// <param name="db">库,默认读取配置文件</param>
  376. /// <returns></returns>
  377. public static T ListGetByIndex<T>(CacheFolderEnum folder, string key, long index, int db = -)
  378. {
  379. db = GetOperationDB(db);
  380. string fd = GetDescription(folder);
  381. var value = Manager.GetDatabase(db).ListGetByIndex(string.IsNullOrEmpty(fd) ? key : fd + ":" + key, index);
  382. return ConvertObj<T>(value);
  383. }
  384.  
  385. /// <summary>
  386. /// 替换指定
  387. /// </summary>
  388. /// <typeparam name="T">类型</typeparam>
  389. /// <param name="folder">目录</param>
  390. /// <param name="key">键</param>
  391. /// <param name="index">索引</param>
  392. /// <param name="value">值</param>
  393. /// <param name="db">库,默认读取配置文件</param>
  394. public static void ListSetByIndex<T>(CacheFolderEnum folder, string key, long index, T value, int db = -)
  395. {
  396. db = GetOperationDB(db);
  397. string fd = GetDescription(folder);
  398. Manager.GetDatabase(db).ListSetByIndex(string.IsNullOrEmpty(fd) ? key : fd + ":" + key, index, ConvertJson(value));
  399. }
  400.  
  401. /// <summary>
  402. /// 删除指定
  403. /// </summary>
  404. /// <typeparam name="T">类型</typeparam>
  405. /// <param name="folder">目录</param>
  406. /// <param name="key">键</param>
  407. /// <param name="value">值</param>
  408. /// <param name="count">count > 0: Remove elements equal to value moving from head to tail.count 小于 0: Remove elements equal to value moving from tail to head.count = 0: Remove all elements equal to value.</param>
  409. /// <param name="db">库,默认读取配置文件</param>
  410. /// <returns></returns>
  411. public static long ListRemove<T>(CacheFolderEnum folder, string key, T value, long count = , int db = -)
  412. {
  413. db = GetOperationDB(db);
  414. string fd = GetDescription(folder);
  415. return Manager.GetDatabase(db).ListRemove(string.IsNullOrEmpty(fd) ? key : fd + ":" + key, ConvertJson(value), count);
  416. }
  417.  
  418. /// <summary>
  419. /// 指定位置之后插入
  420. /// </summary>
  421. /// <typeparam name="T">类型</typeparam>
  422. /// <param name="folder">目录</param>
  423. /// <param name="key">键</param>
  424. /// <param name="pivot">位置</param>
  425. /// <param name="value">值</param>
  426. /// <param name="db">库,默认读取配置文件</param>
  427. /// <returns></returns>
  428. public static long ListInsertAfter<T>(CacheFolderEnum folder, string key, T pivot, T value, int db = -)
  429. {
  430. db = GetOperationDB(db);
  431. string fd = GetDescription(folder);
  432. return Manager.GetDatabase(db).ListInsertAfter(string.IsNullOrEmpty(fd) ? key : fd + ":" + key, ConvertJson(pivot), ConvertJson(value));
  433. }
  434.  
  435. /// <summary>
  436. /// 指定位置之前插入
  437. /// </summary>
  438. /// <typeparam name="T">类型</typeparam>
  439. /// <param name="folder">目录</param>
  440. /// <param name="key">键</param>
  441. /// <param name="pivot">位置</param>
  442. /// <param name="value">值</param>
  443. /// <param name="db">库,默认读取配置文件</param>
  444. /// <returns></returns>
  445. public static long ListInsertBefore<T>(CacheFolderEnum folder, string key, T pivot, T value, int db = -)
  446. {
  447. db = GetOperationDB(db);
  448. string fd = GetDescription(folder);
  449. return Manager.GetDatabase(db).ListInsertBefore(string.IsNullOrEmpty(fd) ? key : fd + ":" + key, ConvertJson(pivot), ConvertJson(value));
  450. }
  451.  
  452. /// <summary>
  453. /// 入栈(后插入的在List前面)
  454. /// </summary>
  455. /// <typeparam name="T">类型</typeparam>
  456. /// <param name="folder">目录</param>
  457. /// <param name="key">键</param>
  458. /// <param name="value">值</param>
  459. /// <param name="db">库,默认读取配置文件</param>
  460. public static long ListLeftPush<T>(CacheFolderEnum folder, string key, T value, int db = -)
  461. {
  462. db = GetOperationDB(db);
  463. string fd = GetDescription(folder);
  464. return Manager.GetDatabase(db).ListLeftPush(string.IsNullOrEmpty(fd) ? key : fd + ":" + key, ConvertJson(value));
  465. }
  466.  
  467. /// <summary>
  468. /// 批量入栈(后插入的在List前面)
  469. /// </summary>
  470. /// <typeparam name="T">类型</typeparam>
  471. /// <param name="folder">目录</param>
  472. /// <param name="key">键</param>
  473. /// <param name="values">值</param>
  474. /// <param name="db">库,默认读取配置文件</param>
  475. /// <returns></returns>
  476. public static long ListLeftPush<T>(CacheFolderEnum folder, string key, List<T> values, int db = -)
  477. {
  478. db = GetOperationDB(db);
  479. string fd = GetDescription(folder);
  480. var redisValues = values.Select(m => (RedisValue)ConvertJson(m)).ToArray();
  481. return Manager.GetDatabase(db).ListLeftPush(string.IsNullOrEmpty(fd) ? key : fd + ":" + key, redisValues);
  482. }
  483.  
  484. /// <summary>
  485. /// 出栈(删除最前面的一个元素并返回)
  486. /// </summary>
  487. /// <typeparam name="T">类型</typeparam>
  488. /// <param name="folder">目录</param>
  489. /// <param name="key">键</param>
  490. /// <param name="db">库,默认读取配置文件</param>
  491. /// <returns></returns>
  492. public static T ListLeftPop<T>(CacheFolderEnum folder, string key, int db = -)
  493. {
  494. db = GetOperationDB(db);
  495. string fd = GetDescription(folder);
  496. var value = Manager.GetDatabase(db).ListLeftPop(string.IsNullOrEmpty(fd) ? key : fd + ":" + key);
  497. return ConvertObj<T>(value);
  498. }
  499.  
  500. /// <summary>
  501. /// 入队(后插入的在List后面)
  502. /// </summary>
  503. /// <typeparam name="T">类型</typeparam>
  504. /// <param name="folder">目录</param>
  505. /// <param name="key">键</param>
  506. /// <param name="value">值</param>
  507. /// <param name="db">库,默认读取配置文件</param>
  508. public static long ListRightPush<T>(CacheFolderEnum folder, string key, T value, int db = -)
  509. {
  510. db = GetOperationDB(db);
  511. string fd = GetDescription(folder);
  512. return Manager.GetDatabase(db).ListRightPush(string.IsNullOrEmpty(fd) ? key : fd + ":" + key, ConvertJson(value));
  513. }
  514.  
  515. /// <summary>
  516. /// 批量入队(后插入的在List后面)
  517. /// </summary>
  518. /// <typeparam name="T">类型</typeparam>
  519. /// <param name="folder">目录</param>
  520. /// <param name="key">键</param>
  521. /// <param name="values">值</param>
  522. /// <param name="db">库,默认读取配置文件</param>
  523. /// <returns></returns>
  524. public static long ListRightPush<T>(CacheFolderEnum folder, string key, List<T> values, int db = -)
  525. {
  526. db = GetOperationDB(db);
  527. string fd = GetDescription(folder);
  528. var redisValues = values.Select(m => (RedisValue)ConvertJson(m)).ToArray();
  529. return Manager.GetDatabase(db).ListRightPush(string.IsNullOrEmpty(fd) ? key : fd + ":" + key, redisValues);
  530. }
  531.  
  532. /// <summary>
  533. /// 出队(删除最后面的一个元素并返回)
  534. /// </summary>
  535. /// <typeparam name="T">类型</typeparam>
  536. /// <param name="folder">目录</param>
  537. /// <param name="key">键</param>
  538. /// <param name="db">库,默认读取配置文件</param>
  539. /// <returns></returns>
  540. public static T ListRightPop<T>(CacheFolderEnum folder, string key, int db = -)
  541. {
  542. db = GetOperationDB(db);
  543. string fd = GetDescription(folder);
  544. var value = Manager.GetDatabase(db).ListRightPop(string.IsNullOrEmpty(fd) ? key : fd + ":" + key);
  545. return ConvertObj<T>(value);
  546. }
  547.  
  548. /// <summary>
  549. /// 获取个数
  550. /// </summary>
  551. /// <param name="folder">目录</param>
  552. /// <param name="key">键</param>
  553. /// <param name="db">库,默认读取配置文件</param>
  554. /// <returns></returns>
  555. public static long ListLength(CacheFolderEnum folder, string key, int db = -)
  556. {
  557. db = GetOperationDB(db);
  558. string fd = GetDescription(folder);
  559. return Manager.GetDatabase(db).ListLength(string.IsNullOrEmpty(fd) ? key : fd + ":" + key);
  560. }
  561. #endregion
  562.  
  563. #region Hash
  564. /// <summary>
  565. /// 添加
  566. /// </summary>
  567. /// <typeparam name="T">类型</typeparam>
  568. /// <param name="folder">目录</param>
  569. /// <param name="key">键</param>
  570. /// <param name="dataKey">元素的键</param>
  571. /// <param name="t">实体</param>
  572. /// <param name="db">库,默认读取配置文件</param>
  573. /// <returns></returns>
  574. public static bool HashSet<T>(CacheFolderEnum folder, string key, string dataKey, T t, int db = -)
  575. {
  576. db = GetOperationDB(db);
  577. string fd = GetDescription(folder);
  578. return Manager.GetDatabase(db).HashSet(string.IsNullOrEmpty(fd) ? key : fd + ":" + key, dataKey, ConvertJson(t));
  579. }
  580.  
  581. /// <summary>
  582. /// 获取特定
  583. /// </summary>
  584. /// <typeparam name="T">类型</typeparam>
  585. /// <param name="folder">目录</param>
  586. /// <param name="key">键</param>
  587. /// <param name="dataKey">元素的键</param>
  588. /// <param name="db">库,默认读取配置文件</param>
  589. /// <returns></returns>
  590. public static T HashGet<T>(CacheFolderEnum folder, string key, string dataKey, int db = -)
  591. {
  592. db = GetOperationDB(db);
  593. string fd = GetDescription(folder);
  594. string value = Manager.GetDatabase(db).HashGet(string.IsNullOrEmpty(fd) ? key : fd + ":" + key, dataKey);
  595. return ConvertObj<T>(value);
  596. }
  597.  
  598. /// <summary>
  599. /// 批量获取
  600. /// </summary>
  601. /// <typeparam name="T">类型</typeparam>
  602. /// <param name="folder">目录</param>
  603. /// <param name="key">键</param>
  604. /// <param name="dataKeys">元素的键</param>
  605. /// <param name="db">库,默认读取配置文件</param>
  606. /// <returns></returns>
  607. public static List<T> HashGet<T>(CacheFolderEnum folder, string key, RedisValue[] dataKeys, int db = -)
  608. {
  609. db = GetOperationDB(db);
  610. string fd = GetDescription(folder);
  611. var value = Manager.GetDatabase(db).HashGet(string.IsNullOrEmpty(fd) ? key : fd + ":" + key, dataKeys);
  612. return ConvetList<T>(value);
  613. }
  614.  
  615. /// <summary>
  616. /// 获取所有
  617. /// </summary>
  618. /// <typeparam name="T">类型</typeparam>
  619. /// <param name="folder">目录</param>
  620. /// <param name="key">键</param>
  621. /// <param name="db">库,默认读取配置文件</param>
  622. /// <returns></returns>
  623. public static HashEntry[] HashGetAll<T>(CacheFolderEnum folder, string key, int db = -)
  624. {
  625. db = GetOperationDB(db);
  626. string fd = GetDescription(folder);
  627. return Manager.GetDatabase(db).HashGetAll(string.IsNullOrEmpty(fd) ? key : fd + ":" + key);
  628. }
  629.  
  630. /// <summary>
  631. /// 删除特定
  632. /// </summary>
  633. /// <param name="folder">目录</param>
  634. /// <param name="key">键</param>
  635. /// <param name="dataKey">元素的键</param>
  636. /// <param name="db">库,默认读取配置文件</param>
  637. /// <returns></returns>
  638. public static bool HashDelete(CacheFolderEnum folder, string key, string dataKey, int db = -)
  639. {
  640. db = GetOperationDB(db);
  641. string fd = GetDescription(folder);
  642. return Manager.GetDatabase(db).HashDelete(string.IsNullOrEmpty(fd) ? key : fd + ":" + key, dataKey);
  643. }
  644.  
  645. /// <summary>
  646. /// 批量删除
  647. /// </summary>
  648. /// <param name="folder">目录</param>
  649. /// <param name="key">键</param>
  650. /// <param name="dataKeys">元素的键</param>
  651. /// <param name="db">库,默认读取配置文件</param>
  652. /// <returns></returns>
  653. public static long HashDelete(CacheFolderEnum folder, string key, List<RedisValue> dataKeys, int db = -)
  654. {
  655. db = GetOperationDB(db);
  656. string fd = GetDescription(folder);
  657. return Manager.GetDatabase(db).HashDelete(string.IsNullOrEmpty(fd) ? key : fd + ":" + key, dataKeys.ToArray());
  658. }
  659.  
  660. /// <summary>
  661. /// 是否存在
  662. /// </summary>
  663. /// <param name="folder">目录</param>
  664. /// <param name="key">键</param>
  665. /// <param name="dataKey">元素的键</param>
  666. /// <param name="db">库,默认读取配置文件</param>
  667. /// <returns></returns>
  668. public static bool HashExists(CacheFolderEnum folder, string key, string dataKey, int db = -)
  669. {
  670. db = GetOperationDB(db);
  671. string fd = GetDescription(folder);
  672. return Manager.GetDatabase(db).HashExists(string.IsNullOrEmpty(fd) ? key : fd + ":" + key, dataKey);
  673. }
  674. #endregion
  675.  
  676. #region Zset
  677. /// <summary>
  678. /// 添加
  679. /// </summary>
  680. /// <typeparam name="T">类型</typeparam>
  681. /// <param name="folder">目录</param>
  682. /// <param name="key">键</param>
  683. /// <param name="value">值</param>
  684. /// <param name="score">排序列</param>
  685. /// <param name="db">库,默认读取配置文件</param>
  686. /// <returns></returns>
  687. public static bool SortedSetAdd<T>(CacheFolderEnum folder, string key, T value, double score, int db = -)
  688. {
  689. db = GetOperationDB(db);
  690. string fd = GetDescription(folder);
  691. return Manager.GetDatabase(db).SortedSetAdd(string.IsNullOrEmpty(fd) ? key : fd + ":" + key, ConvertJson<T>(value), score);
  692. }
  693.  
  694. /// <summary>
  695. /// 获取
  696. /// </summary>
  697. /// <typeparam name="T">类型</typeparam>
  698. /// <param name="folder">目录</param>
  699. /// <param name="key">键</param>
  700. /// <param name="start">索引开始</param>
  701. /// <param name="stop">索引结束</param>
  702. /// <param name="order">排序方式</param>
  703. /// <param name="db">库,默认读取配置文件</param>
  704. /// <returns></returns>
  705. public static List<T> SortedSetRangeByRank<T>(CacheFolderEnum folder, string key, long start = , long stop = -, Order order = Order.Ascending, int db = -)
  706. {
  707. db = GetOperationDB(db);
  708. string fd = GetDescription(folder);
  709. var values = Manager.GetDatabase(db).SortedSetRangeByRank(string.IsNullOrEmpty(fd) ? key : fd + ":" + key, start, stop, order);
  710. return ConvetList<T>(values);
  711. }
  712.  
  713. /// <summary>
  714. /// 删除
  715. /// </summary>
  716. /// <typeparam name="T">类型</typeparam>
  717. /// <param name="folder">目录</param>
  718. /// <param name="key">键</param>
  719. /// <param name="value">值</param>
  720. /// <param name="db">库,默认读取配置文件</param>
  721. /// <returns></returns>
  722. public static bool SortedSetRemove<T>(CacheFolderEnum folder, string key, T value, int db = -)
  723. {
  724. db = GetOperationDB(db);
  725. string fd = GetDescription(folder);
  726. return Manager.GetDatabase(db).SortedSetRemove(string.IsNullOrEmpty(fd) ? key : fd + ":" + key, ConvertJson<T>(value));
  727. }
  728.  
  729. /// <summary>
  730. /// 批量删除(根据对象)
  731. /// </summary>
  732. /// <param name="folder">目录</param>
  733. /// <param name="key">键</param>
  734. /// <param name="values">对象</param>
  735. /// <param name="db">库,默认读取配置文件</param>
  736. /// <returns></returns>
  737. public static long SortedSetRemove<T>(CacheFolderEnum folder, string key, List<T> values, int db = -)
  738. {
  739. db = GetOperationDB(db);
  740. string fd = GetDescription(folder);
  741. var redisValues = values.Select(m => (RedisValue)ConvertJson(m)).ToArray();
  742. return Manager.GetDatabase(db).SortedSetRemove(string.IsNullOrEmpty(fd) ? key : fd + ":" + key, redisValues);
  743. }
  744.  
  745. /// <summary>
  746. /// 批量删除(根据score删除)
  747. /// </summary>
  748. /// <param name="folder">目录</param>
  749. /// <param name="key">键</param>
  750. /// <param name="start">开始</param>
  751. /// <param name="stop">结束</param>
  752. /// <param name="db">库,默认读取配置文件</param>
  753. /// <returns></returns>
  754. public static long SortedSetRemoveRangeByScore(CacheFolderEnum folder, string key, int start, int stop, int db = -)
  755. {
  756. db = GetOperationDB(db);
  757. string fd = GetDescription(folder);
  758. return Manager.GetDatabase(db).SortedSetRemoveRangeByScore(string.IsNullOrEmpty(fd) ? key : fd + ":" + key, start, stop);
  759. }
  760.  
  761. /// <summary>
  762. /// 获取总数
  763. /// </summary>
  764. /// <param name="folder">目录</param>
  765. /// <param name="key">键</param>
  766. /// <param name="db">库,默认读取配置文件</param>
  767. /// <returns></returns>
  768. public static long SortedSetLength(CacheFolderEnum folder, string key, int db = -)
  769. {
  770. db = GetOperationDB(db);
  771. string fd = GetDescription(folder);
  772. return Manager.GetDatabase(db).SortedSetLength(string.IsNullOrEmpty(fd) ? key : fd + ":" + key);
  773. }
  774. #endregion
  775.  
  776. }
  777. }

String

  1. RedisHelper.StringSet(CacheFolderEnum.Folder1, "string", "hello world", );

效果:

List

  1. RedisHelper.ListRightPush(CacheFolderEnum.Folder2, "list", student1);
  2. RedisHelper.ListRightPush(CacheFolderEnum.Folder2, "list", student2);
  3. RedisHelper.ListRightPush(CacheFolderEnum.Folder2, "list", student3);

效果:

Hash

  1. RedisHelper.HashSet<Student>(CacheFolderEnum.Folder3, "hash", "h1", student1);
  2. RedisHelper.HashSet<Student>(CacheFolderEnum.Folder3, "hash", "h2", student2);

效果:

SortedSet

  1. RedisHelper.SortedSetAdd<Student>(CacheFolderEnum.Folder3, "zsort", student1, );
  2. RedisHelper.SortedSetAdd<Student>(CacheFolderEnum.Folder3, "zsort", student2, );
  3. RedisHelper.SortedSetAdd<Student>(CacheFolderEnum.Folder3, "zsort", student3, );

效果:(有序集合。不管插入顺序,始终按照score排好顺序)

注:

1.把要操作的目录写到枚举里,方便程序统一调用,不容易出错。如果多个目录嵌套就在Description上写[Description("一级目录:二级目录:三级目录")]

2.配置文件里的redis_store_db节点表示默认存在哪个库里,帮助类的每个方法也单独接收db参数,方便个性化存储到特定库

四、其他

源码:点击下载  环境是VS 2013,如果跑不起来自行把cs里的代码拷出来编译运行

爬虫可耻,本文原始链接:http://www.cnblogs.com/oppoic/p/6165581.html

参考资料:

Redis 命令 | 菜鸟教程

.NET中使用Redis

基础拾遗------redis详解

怎样在Redis通过StackExchange.Redis 存储集合类型List

StackExchange.Redis通用封装类分享

做个简单的Redis监控(源码分享)

Windows下Redis缓存服务器的使用 .NET StackExchange.Redis Redis Desktop Manager的更多相关文章

  1. Windows下Redis缓存服务器的使用 .NET StackExchange.Redis Redis Desktop Manager 转发非原创

    Windows下Redis缓存服务器的使用 .NET StackExchange.Redis Redis Desktop Manager   Redis缓存服务器是一款key/value数据库,读11 ...

  2. [转]Windows下Redis缓存服务器的使用 .NET StackExchange.Redis Redis Desktop Manager

    转自:http://www.cnblogs.com/oppoic/p/6165581.html Redis缓存服务器是一款key/value数据库,读110000次/s,写81000次/s,因为是内存 ...

  3. C#版-Redis缓存服务器在Windows下的使用

    Redis缓存服务器是一款key/value数据库,读110000次/s,写81000次/s,因为是内存操作所以速度飞快,常见用法是存用户token.短信验证码等 官网显示Redis本身并没有Wind ...

  4. linux中的redis缓存服务器

    Linux中的Redis缓存服务器 一.Redis基础部分: 1.redis介绍与安装比mysql快10倍以上 *****************redis适用场合**************** 1 ...

  5. windows下架设SVN服务器并设置开机启动

    原文:windows下架设SVN服务器并设置开机启动 1.安装SVN服务器,到http://subversion.apache.org/packages.html上下载windows版的SVN,并安装 ...

  6. 如何在Windows下安装Tomcat服务器

    Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP 程序的首选服务器.在Windows下安装 ...

  7. windows 下搭建git服务器,及问题处理。

    最近要做一个源码管理服务器,权衡了一下还是git最适合,搭建服务器前看了网上一些windows下搭建git服务器的帖子,感觉还比较简单,没有太多需要配置的地方,于是开始动手. 我选择的是 gitfor ...

  8. windows下搭建nginx-rtmp服务器

    windows下搭建nginx-rtmp服务器 windows下搭建nginx-rtmp服务器 准备工作 安装MinGW 安装Mercurial 安装strawberryperl 安装nasm 下载n ...

  9. 在windows下远程访问linux服务器

    在网络性能.安全性.可管理性上,Linux有着其他系统无法比拟的强大优势,而服务器对这些方面要求特别高,因此Linux常常被用来做服务器使用.而当我们需要维护linux服务器的时候,就需要远程访问li ...

随机推荐

  1. 深入浅出Redis-redis底层数据结构(上)

    1.概述 相信使用过Redis 的各位同学都很清楚,Redis 是一个基于键值对(key-value)的分布式存储系统,与Memcached类似,却优于Memcached的一个高性能的key-valu ...

  2. 编写高质量代码:改善Java程序的151个建议(第5章:数组和集合___建议75~78)

    建议75:集合中的元素必须做到compareTo和equals同步 实现了Comparable接口的元素就可以排序,compareTo方法是Comparable接口要求必须实现的,它与equals方法 ...

  3. 【趣事】用 JavaScript 对抗 DDOS 攻击 (下)

    上一篇:http://www.cnblogs.com/index-html/p/js-network-firewall.html 对抗 v2 之前的那些奇技淫巧,纯属娱乐而已,并不能撑多久. 但简单. ...

  4. 【原】AFNetworking源码阅读(五)

    [原]AFNetworking源码阅读(五) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 上一篇中提及到了Multipart Request的构建方法- [AFHTTP ...

  5. .net 分布式架构之配置中心

    开源QQ群: .net 开源基础服务  238543768 开源地址: http://git.oschina.net/chejiangyi/Dyd.BaseService.ConfigManager ...

  6. 开发者接入 基本配置 服务器配置 out.aspx

    页面代码: 前段为默认的,什么都不用写,后台如下: 即可 来自为知笔记(Wiz)

  7. Mac OS 使用 Vagrant 管理虚拟机(VirtualBox)

    Vagrant(官网.github)是一款构建虚拟开发环境的工具,支持 Window,Linux,Mac OS,Vagrant 中的 Boxes 概念类似于 Docker(实质是不同的),你可以把它看 ...

  8. C#如何在PDF文件添加图片印章

    文档中添加印章可以起一定的作用,比如,防止文件随意被使用,或者确保文档内容的安全性和权威性.C#添加图片印章其实也有很多实现方法,这里我使用的是免费的第三方软件Free Spire.PDF,向大家阐述 ...

  9. canvas与html5实现视频截图功能

    这段时间一直在研究canvas,突发奇想想做一个可以截屏视频的功能,然后把图片拉去做表情包,哈哈哈哈哈哈~~ 制作方法: 1.在页面中加载视频 在使用canvas制作这个截图功能时,首先必须保证页面上 ...

  10. RabbitMQ + PHP (二)AMQP拓展安装

    上篇说到了 RabbitMQ 的安装. 这次要在讲案例之前,需要安装PHP的AMQP扩展.不然可能会报以下两个错误. 1.Fatal error: Class 'AMQPConnection' not ...