ANSI C 编写,开源,基于内存,可持久化,一个键值对的数据库,用法简单。
支持的类型:字符串、散列、列表、集合和有序集合。
因为 Redis 默认将所有数据都存储到内存中,并且内存的读写速度远远高于硬盘,因此,比其他基于硬盘存储的数据库在性能上体现的优势非常明显。不过这样也引发了一个数据安全性的问题,程序异常或退出后数据会出现丢失的情形,现在新的版本已经提供了数据持久化(RDB + AOF)的支持,即可以将内存中的数据异步写入到硬盘上,同时不会影响其它功能的运行。
redis 可以为每个键设置生存时间,到期自动删除,也就是说可以作为缓存系统(这也是企业主要的运用场景)进行使用。
相对于 Memcached,简单的说:Redis 单线程模型,Memcached 支持多线程,但 Redis 支持的功能和数据类型更多,更简单易用,并且 redis 的性能在绝大部分场合下都不会成为系统瓶颈,不过在多核服务器上使用的情况下,理论上 Memcached 比 redis 性能更高。所以,在新项目中,建议使用 redis 代替 Memcached。
Redis 还可以限定数据占用的最大内存空间,在数据达到空间限制后按一定规则自动淘汰不需要的键;也支持构建高性能的队列(不过很多企业会选择第三方的 MQ,如:RabbitMQ)。
它的约定次版本号(即第一个小数点后的数字)为偶数的版本是稳定版(如 v2.8,v3.0)。
为了减少学习成本,我们直接使用 windows 版本的就可以,想学习 Linux 部署的,先搜搜别人的文章吧。
redis-windows-3.0:下载地址
文件简单说明:
1. 启动:
- $ redis-server
- $ redis-server --port6380 //自定义端口
2. 停止:
- $ redis-cli SHUTDOWN
3.PING 命令:
测试与 redis 的连接是否正常,正常返回 PONG
- $ redis-cli PING
Redis Client:一个基于 Java SWT 和 Jedis 编写的 redis 客户端 GUI 工具。可从 https://github.com/caoxinyu/RedisClient 下载。
从图可知,redis 包含了 16 个数据库。上面的每个数据库默认从 0 开始的递增数字命名。
因为该程序打包后的压缩包 >10 M,无法上传到 cnblogs,如有需要的童鞋请加群在群文件中下载压缩包。
之前在 《使用 StackExchange.Redis 封装属于自己的 RedisHelper》 曾经发布了一篇使用 StackExchange.Redis 进行了简单封装的 RedisHelper,你可以选择查看之前的文章,从中借鉴一些思想或者给出一些建议。
这里是更新后的 Helper 代码(直接展开即可),代码的后续更新在 GitHub 上。
- 1 #region
- 2
- 3 using System;
- 4 using System.Collections.Generic;
- 5 using System.Configuration;
- 6 using System.IO;
- 7 using System.Linq;
- 8 using System.Runtime.Serialization.Formatters.Binary;
- 9 using System.Threading.Tasks;
- 10 using StackExchange.Redis;
- 11
- 12 #endregion
- 13
- 14 namespace Wen.Helpers.Common.Redis
- 15 {
- 16 /// <summary>
- 17 /// Redis 助手
- 18 /// </summary>
- 19 public class RedisHelper
- 20 {
- 21 /// <summary>
- 22 /// 获取 Redis 连接对象
- 23 /// </summary>
- 24 /// <returns></returns>
- 25 public IConnectionMultiplexer GetConnectionRedisMultiplexer()
- 26 {
- 27 if(_connMultiplexer ==null|| !_connMultiplexer.IsConnected)
- 28 lock (Locker)
- 29 {
- 30 if(_connMultiplexer ==null|| !_connMultiplexer.IsConnected)
- 31_connMultiplexer = ConnectionMultiplexer.Connect(ConnectionString);
- 32 }
- 33
- 34 return _connMultiplexer;
- 35 }
- 36
- 37 #region其它 38
- 39 public ITransaction GetTransaction()
- 40 {
- 41 return _db.CreateTransaction();
- 42 }
- 43
- 44 #endregion其它 45
- 46 #regionprivate field 47
- 48 /// <summary>
- 49 /// 连接字符串
- 50 /// </summary>
- 51 private static readonly string ConnectionString;
- 52
- 53 /// <summary>
- 54 /// redis 连接对象
- 55 /// </summary>
- 56 private static IConnectionMultiplexer _connMultiplexer;
- 57
- 58 /// <summary>
- 59 /// 默认的 Key 值(用来当作 RedisKey 的前缀)
- 60 /// </summary>
- 61 private static readonly string DefaultKey;
- 62
- 63 /// <summary>
- 64 /// 锁
- 65 /// </summary>
- 66 private static readonly objectLocker =new object();
- 67
- 68 /// <summary>
- 69 /// 数据库
- 70 /// </summary>
- 71 private readonly IDatabase _db;
- 72
- 73 #endregionprivate field 74
- 75 #region构造函数 76
- 77 static RedisHelper()
- 78 {
- 79ConnectionString = ConfigurationManager.ConnectionStrings["RedisConnectionString"].ConnectionString;
- 80_connMultiplexer = ConnectionMultiplexer.Connect(ConnectionString);
- 81DefaultKey = ConfigurationManager.AppSettings["Redis.DefaultKey"];
- 82 AddRegisterEvent();
- 83 }
- 84
- 85 publicRedisHelper(intdb =0)
- 86 {
- 87_db = _connMultiplexer.GetDatabase(db);
- 88 }
- 89
- 90 #endregion构造函数 91
- 92 #regionString 操作 93
- 94 /// <summary>
- 95 /// 设置 key 并保存字符串(如果 key 已存在,则覆盖值)
- 96 /// </summary>
- 97 /// <param name="key"></param>
- 98 /// <param name="value"></param>
- 99 /// <param name="expiry"></param>
- 100 /// <returns></returns>
- 101 public boolStringSet(stringkey,stringvalue, TimeSpan? expiry =null)
- 102 {
- 103key = AddKeyPrefix(key);
- 104 return _db.StringSet(key, value, expiry);
- 105 }
- 106
- 107 /// <summary>
- 108 /// 保存多个 Key-value
- 109 /// </summary>
- 110 /// <param name="keyValuePairs"></param>
- 111 /// <returns></returns>
- 112 public boolStringSet(IEnumerablestring,string>> keyValuePairs)
- 113 {
- 114 varpairs = keyValuePairs.Select(x =>newKeyValuePair(AddKeyPrefix(x.Key), x.Value));
- 115 return _db.StringSet(pairs.ToArray());
- 116 }
- 117
- 118 /// <summary>
- 119 /// 获取字符串
- 120 /// </summary>
- 121 /// <param name="redisKey"></param>
- 122 /// <param name="expiry"></param>
- 123 /// <returns></returns>
- 124 public stringStringGet(string redisKey)
- 125 {
- 126redisKey = AddKeyPrefix(redisKey);
- 127 return _db.StringGet(redisKey);
- 128 }
- 129
- 130 /// <summary>
- 131 /// 存储一个对象(该对象会被序列化保存)
- 132 /// </summary>
- 133 /// <param name="key"></param>
- 134 /// <param name="value"></param>
- 135 /// <param name="expiry"></param>
- 136 /// <returns></returns>
- 137 public boolStringSet(stringkey, T value, TimeSpan? expiry =null)
- 138 {
- 139key = AddKeyPrefix(key);
- 140 varjson = Serialize(value);
- 141
- 142 return _db.StringSet(key, json, expiry);
- 143 }
- 144
- 145 /// <summary>
- 146 /// 获取一个对象(会进行反序列化)
- 147 /// </summary>
- 148 /// <param name="key"></param>
- 149 /// <param name="expiry"></param>
- 150 /// <returns></returns>
- 151 publicT StringGet(stringkey, TimeSpan? expiry =null)
- 152 {
- 153key = AddKeyPrefix(key);
- 154 returnDeserialize(_db.StringGet(key));
- 155 }
- 156
- 157 /// <summary>
- 158 /// 在指定 key 处实现增量的递增,如果该键不存在,则在执行前将其设置为 0
- 159 /// </summary>
- 160 /// <param name="key"></param>
- 161 /// <param name="value"></param>
- 162 /// <returns></returns>
- 163 public doubleStringIncrement(stringkey,doublevalue =1)
- 164 {
- 165key = AddKeyPrefix(key);
- 166 return _db.StringIncrement(key, value);
- 167 }
- 168
- 169 /// <summary>
- 170 /// 在指定 key 处实现增量的递减,如果该键不存在,则在执行前将其设置为 0
- 171 /// </summary>
- 172 /// <param name="key"></param>
- 173 /// <param name="value"></param>
- 174 /// <returns></returns>
- 175 public doubleStringDecrement(stringkey,doublevalue =1)
- 176 {
- 177key = AddKeyPrefix(key);
- 178 return _db.StringDecrement(key, value);
- 179 }
- 180
- 181 #regionasync 182
- 183 /// <summary>
- 184 /// 保存一个字符串值
- 185 /// </summary>
- 186 /// <param name="key"></param>
- 187 /// <param name="value"></param>
- 188 /// <param name="expiry"></param>
- 189 /// <returns></returns>
- 190 public asyncTask<bool> StringSetAsync(stringkey,stringvalue, TimeSpan? expiry =null)
- 191 {
- 192key = AddKeyPrefix(key);
- 193 return await _db.StringSetAsync(key, value, expiry);
- 194 }
- 195
- 196 /// <summary>
- 197 /// 保存一组字符串值
- 198 /// </summary>
- 199 /// <param name="keyValuePairs"></param>
- 200 /// <returns></returns>
- 201 public asyncTask<bool> StringSetAsync(IEnumerablestring,string>> keyValuePairs)
- 202 {
- 203 varpairs = keyValuePairs.Select(x =>newKeyValuePair(AddKeyPrefix(x.Key), x.Value));
- 204 return await _db.StringSetAsync(pairs.ToArray());
- 205 }
- 206
- 207 /// <summary>
- 208 /// 获取单个值
- 209 /// </summary>
- 210 /// <param name="key"></param>
- 211 /// <param name="value"></param>
- 212 /// <param name="expiry"></param>
- 213 /// <returns></returns>
- 214 public asyncTask<string> StringGetAsync(stringkey,stringvalue, TimeSpan? expiry =null)
- 215 {
- 216key = AddKeyPrefix(key);
- 217 return await _db.StringGetAsync(key);
- 218 }
- 219
- 220 /// <summary>
- 221 /// 存储一个对象(该对象会被序列化保存)
- 222 /// </summary>
- 223 /// <param name="key"></param>
- 224 /// <param name="value"></param>
- 225 /// <param name="expiry"></param>
- 226 /// <returns></returns>
- 227 public asyncTask<bool> StringSetAsync(stringkey, T value, TimeSpan? expiry =null)
- 228 {
- 229key = AddKeyPrefix(key);
- 230 varjson = Serialize(value);
- 231 return await _db.StringSetAsync(key, json, expiry);
- 232 }
- 233
- 234 /// <summary>
- 235 /// 获取一个对象(会进行反序列化)
- 236 /// </summary>
- 237 /// <param name="key"></param>
- 238 /// <param name="expiry"></param>
- 239 /// <returns></returns>
- 240 public asyncTask StringGetAsync(stringkey, TimeSpan? expiry =null)
- 241 {
- 242key = AddKeyPrefix(key);
- 243 returnDeserialize(await _db.StringGetAsync(key));
- 244 }
- 245
- 246 /// <summary>
- 247 /// 在指定 key 处实现增量的递增,如果该键不存在,则在执行前将其设置为 0
- 248 /// </summary>
- 249 /// <param name="key"></param>
- 250 /// <param name="value"></param>
- 251 /// <returns></returns>
- 252 public asyncTask<double> StringIncrementAsync(stringkey,doublevalue =1)
- 253 {
- 254key = AddKeyPrefix(key);
- 255 return await _db.StringIncrementAsync(key, value);
- 256 }
- 257
- 258 /// <summary>
- 259 /// 在指定 key 处实现增量的递减,如果该键不存在,则在执行前将其设置为 0
- 260 /// </summary>
- 261 /// <param name="key"></param>
- 262 /// <param name="value"></param>
- 263 /// <returns></returns>
- 264 public asyncTask<double> StringDecrementAsync(stringkey,doublevalue =1)
- 265 {
- 266key = AddKeyPrefix(key);
- 267 return await _db.StringDecrementAsync(key, value);
- 268 }
- 269
- 270 #endregionasync 271
- 272 #endregionString 操作 273
- 274 #regionHash 操作 275
- 276 /// <summary>
- 277 /// 判断该字段是否存在 hash 中
- 278 /// </summary>
- 279 /// <param name="key"></param>
- 280 /// <param name="hashField"></param>
- 281 /// <returns></returns>
- 282 public boolHashExists(stringkey,string hashField)
- 283 {
- 284key = AddKeyPrefix(key);
- 285 return _db.HashExists(key, hashField);
- 286 }
- 287
- 288 /// <summary>
- 289 /// 从 hash 中移除指定字段
- 290 /// </summary>
- 291 /// <param name="key"></param>
- 292 /// <param name="hashField"></param>
- 293 /// <returns></returns>
- 294 public boolHashDelete(stringkey,string hashField)
- 295 {
- 296key = AddKeyPrefix(key);
- 297 return _db.HashDelete(key, hashField);
- 298 }
- 299
- 300 /// <summary>
- 301 /// 从 hash 中移除指定字段
- 302 /// </summary>
- 303 /// <param name="key"></param>
- 304 /// <param name="hashFields"></param>
- 305 /// <returns></returns>
- 306 public longHashDelete(stringkey, IEnumerable<string> hashFields)
- 307 {
- 308key = AddKeyPrefix(key);
- 309 varfields = hashFields.Select(x => (RedisValue) x);
- 310
- 311 return _db.HashDelete(key, fields.ToArray());
- 312 }
- 313
- 314 /// <summary>
- 315 /// 在 hash 设定值
- 316 /// </summary>
- 317 /// <param name="key"></param>
- 318 /// <param name="hashField"></param>
- 319 /// <param name="value"></param>
- 320 /// <returns></returns>
- 321 public boolHashSet(stringkey,stringhashField,string value)
- 322 {
- 323key = AddKeyPrefix(key);
- 324 return _db.HashSet(key, hashField, value);
- 325 }
- 326
- 327 /// <summary>
- 328 /// 在 hash 中设定值
- 329 /// </summary>
- 330 /// <param name="key"></param>
- 331 /// <param name="hashFields"></param>
- 332 public voidHashSet(stringkey, IEnumerablestring,string>> hashFields)
- 333 {
- 334key = AddKeyPrefix(key);
- 335 varentries = hashFields.Select(x =>new HashEntry(x.Key, x.Value));
- 336
- 337 _db.HashSet(key, entries.ToArray());
- 338 }
- 339
- 340 /// <summary>
- 341 /// 在 hash 中获取值
- 342 /// </summary>
- 343 /// <param name="key"></param>
- 344 /// <param name="hashField"></param>
- 345 /// <returns></returns>
- 346 public stringHashGet(stringkey,string hashField)
- 347 {
- 348key = AddKeyPrefix(key);
- 349 return _db.HashGet(key, hashField);
- 350 }
- 351
- 352 /// <summary>
- 353 /// 在 hash 中获取值
- 354 /// </summary>
- 355 /// <param name="key"></param>
- 356 /// <param name="hashFields"></param>
- 357 /// <returns></returns>
- 358 publicIEnumerable<string> HashGet(stringkey, IEnumerable<string> hashFields)
- 359 {
- 360key = AddKeyPrefix(key);
- 361 varfields = hashFields.Select(x => (RedisValue) x);
- 362
- 363 return ConvertStrings(_db.HashGet(key, fields.ToArray()));
- 364 }
- 365
- 366 /// <summary>
- 367 /// 从 hash 返回所有的字段值
- 368 /// </summary>
- 369 /// <param name="key"></param>
- 370 /// <returns></returns>
- 371 publicIEnumerable<string> HashKeys(string key)
- 372 {
- 373key = AddKeyPrefix(key);
- 374 return ConvertStrings(_db.HashKeys(key));
- 375 }
- 376
- 377 /// <summary>
- 378 /// 返回 hash 中的所有值
- 379 /// </summary>
- 380 /// <param name="key"></param>
- 381 /// <returns></returns>
- 382 publicIEnumerable<string> HashValues(string key)
- 383 {
- 384key = AddKeyPrefix(key);
- 385 return ConvertStrings(_db.HashValues(key));
- 386 }
- 387
- 388 /// <summary>
- 389 /// 在 hash 设定值(序列化)
- 390 /// </summary>
- 391 /// <param name="key"></param>
- 392 /// <param name="hashField"></param>
- 393 /// <param name="redisValue"></param>
- 394 /// <returns></returns>
- 395 public boolHashSet(stringkey,string hashField, T redisValue)
- 396 {
- 397key = AddKeyPrefix(key);
- 398 varjson = Serialize(redisValue);
- 399
- 400 return _db.HashSet(key, hashField, json);
- 401 }
- 402
- 403 /// <summary>
- 404 /// 在 hash 中获取值(反序列化)
- 405 /// </summary>
- 406 /// <param name="key"></param>
- 407 /// <param name="hashField"></param>
- 408 /// <returns></returns>
- 409 publicT HashGet(stringkey,string hashField)
- 410 {
- 411key = AddKeyPrefix(key);
- 412 returnDeserialize(_db.HashGet(key, hashField));
- 413 }
- 414
- 415 /// <summary>
- 416 /// 指定键递增
- 417 /// </summary>
- 418 /// <param name="key"></param>
- 419 /// <param name="hashField"></param>
- 420 /// <param name="value"></param>
- 421 /// <returns></returns>
- 422 public doubleHashIncrement(stringkey,stringhashField,doublevalue =1)
- 423 {
- 424key = AddKeyPrefix(key);
- 425 return _db.HashIncrement(key, hashField, value);
- 426 }
- 427
- 428 /// <summary>
- 429 /// 指定键递减
- 430 /// </summary>
- 431 /// <param name="key"></param>
- 432 /// <param name="hashField"></param>
- 433 /// <param name="value"></param>
- 434 /// <returns></returns>
- 435 public doubleHashDecrement(stringkey,stringhashField,doublevalue =1)
- 436 {
- 437key = AddKeyPrefix(key);
- 438 return _db.HashDecrement(key, hashField, value);
- 439 }
- 440
- 441 #regionasync 442
- 443 /// <summary>
- 444 /// 判断该字段是否存在 hash 中
- 445 /// </summary>
- 446 /// <param name="redisKey"></param>
- 447 /// <param name="hashField"></param>
- 448 /// <returns></returns>
- 449 public asyncTask<bool> HashExistsAsync(stringredisKey,string hashField)
- 450 {
- 451redisKey = AddKeyPrefix(redisKey);
- 452 return await _db.HashExistsAsync(redisKey, hashField);
- 453 }
- 454
- 455 /// <summary>
- 456 /// 从 hash 中移除指定字段
- 457 /// </summary>
- 458 /// <param name="redisKey"></param>
- 459 /// <param name="hashField"></param>
- 460 /// <returns></returns>
- 461 public asyncTask<bool> HashDeleteAsync(stringredisKey,string hashField)
- 462 {
- 463redisKey = AddKeyPrefix(redisKey);
- 464 return await _db.HashDeleteAsync(redisKey, hashField);
- 465 }
- 466
- 467 /// <summary>
- 468 /// 从 hash 中移除指定字段
- 469 /// </summary>
- 470 /// <param name="redisKey"></param>
- 471 /// <param name="hashFields"></param>
- 472 /// <returns></returns>
- 473 public asyncTask<long> HashDeleteAsync(stringredisKey, IEnumerable<string> hashFields)
- 474 {
- 475redisKey = AddKeyPrefix(redisKey);
- 476 varfields = hashFields.Select(x => (RedisValue) x);
- 477
- 478 return await _db.HashDeleteAsync(redisKey, fields.ToArray());
- 479 }
- 480
- 481 /// <summary>
- 482 /// 在 hash 设定值
- 483 /// </summary>
- 484 /// <param name="redisKey"></param>
- 485 /// <param name="hashField"></param>
- 486 /// <param name="value"></param>
- 487 /// <returns></returns>
- 488 public asyncTask<bool> HashSetAsync(stringredisKey,stringhashField,string value)
- 489 {
- 490redisKey = AddKeyPrefix(redisKey);
- 491 return await _db.HashSetAsync(redisKey, hashField, value);
- 492 }
- 493
- 494 /// <summary>
- 495 /// 在 hash 中设定值
- 496 /// </summary>
- 497 /// <param name="redisKey"></param>
- 498 /// <param name="hashFields"></param>
- 499 public asyncTask HashSetAsync(stringredisKey, IEnumerablestring,string>> hashFields)
- 500 {
- 501redisKey = AddKeyPrefix(redisKey);
- 502 varentries = hashFields.Select(x =>new HashEntry(AddKeyPrefix(x.Key), x.Value));
- 503 await _db.HashSetAsync(redisKey, entries.ToArray());
- 504 }
- 505
- 506 /// <summary>
- 507 /// 在 hash 中获取值
- 508 /// </summary>
- 509 /// <param name="redisKey"></param>
- 510 /// <param name="hashField"></param>
- 511 /// <returns></returns>
- 512 public asyncTask<string> HashGetAsync(stringredisKey,string hashField)
- 513 {
- 514redisKey = AddKeyPrefix(redisKey);
- 515 return await _db.HashGetAsync(redisKey, hashField);
- 516 }
- 517
- 518 /// <summary>
- 519 /// 在 hash 中获取值
- 520 /// </summary>
- 521 /// <param name="redisKey"></param>
- 522 /// <param name="hashFields"></param>
- 523 /// <param name="value"></param>
- 524 /// <returns></returns>
- 525 public asyncTaskstring>> HashGetAsync(stringredisKey, IEnumerable<string> hashFields,
- 526 string value)
- 527 {
- 528redisKey = AddKeyPrefix(redisKey);
- 529 varfields = hashFields.Select(x => (RedisValue) x);
- 530
- 531 returnConvertStrings(await _db.HashGetAsync(redisKey, fields.ToArray()));
- 532 }
- 533
- 534 /// <summary>
- 535 /// 从 hash 返回所有的字段值
- 536 /// </summary>
- 537 /// <param name="redisKey"></param>
- 538 /// <returns></returns>
- 539 public asyncTaskstring>> HashKeysAsync(string redisKey)
- 540 {
- 541redisKey = AddKeyPrefix(redisKey);
- 542 returnConvertStrings(await _db.HashKeysAsync(redisKey));
- 543 }
- 544
- 545 /// <summary>
- 546 /// 返回 hash 中的所有值
- 547 /// </summary>
- 548 /// <param name="redisKey"></param>
- 549 /// <returns></returns>
- 550 public asyncTaskstring>> HashValuesAsync(string redisKey)
- 551 {
- 552redisKey = AddKeyPrefix(redisKey);
- 553 returnConvertStrings(await _db.HashValuesAsync(redisKey));
- 554 }
- 555
- 556 /// <summary>
- 557 /// 在 hash 设定值(序列化)
- 558 /// </summary>
- 559 /// <param name="redisKey"></param>
- 560 /// <param name="hashField"></param>
- 561 /// <param name="value"></param>
- 562 /// <returns></returns>
- 563 public asyncTask<bool> HashSetAsync(stringredisKey,string hashField, T value)
- 564 {
- 565redisKey = AddKeyPrefix(redisKey);
- 566 varjson = Serialize(value);
- 567 return await _db.HashSetAsync(redisKey, hashField, json);
- 568 }
- 569
- 570 /// <summary>
- 571 /// 在 hash 中获取值(反序列化)
- 572 /// </summary>
- 573 /// <param name="redisKey"></param>
- 574 /// <param name="hashField"></param>
- 575 /// <returns></returns>
- 576 public asyncTask HashGetAsync(stringredisKey,string hashField)
- 577 {
- 578redisKey = AddKeyPrefix(redisKey);
- 579 returnDeserialize(await _db.HashGetAsync(redisKey, hashField));
- 580 }
- 581
- 582 /// <summary>
- 583 /// 指定键递增
- 584 /// </summary>
- 585 /// <param name="key"></param>
- 586 /// <param name="hashField"></param>
- 587 /// <param name="value"></param>
- 588 /// <returns></returns>
- 589 public asyncTask<double> HashIncrementAsync(stringkey,stringhashField,doublevalue =1)
- 590 {
- 591key = AddKeyPrefix(key);
- 592 return await _db.HashIncrementAsync(key, hashField, value);
- 593 }
- 594
- 595 /// <summary>
- 596 /// 指定键递减
- 597 /// </summary>
- 598 /// <param name="key"></param>
- 599 /// <param name="hashField"></param>
- 600 /// <param name="value"></param>
- 601 /// <returns></returns>
- 602 public asyncTask<double> HashDecrementAsync(stringkey,stringhashField,doublevalue =1)
- 603 {
- 604key = AddKeyPrefix(key);
- 605 return await _db.HashDecrementAsync(key, hashField, value);
- 606 }
- 607
- 608 #endregionasync 609
- 610 #endregionHash 操作 611
- 612 #regionList 操作 613
- 614 /// <summary>
- 615 /// 移除并返回存储在该键列表的第一个元素
- 616 /// </summary>
- 617 /// <param name="key"></param>
- 618 /// <returns></returns>
- 619 public stringListLeftPop(string key)
- 620 {
- 621key = AddKeyPrefix(key);
- 622 return _db.ListLeftPop(key);
- 623 }
- 624
- 625 /// <summary>
- 626 /// 出列,移除并返回存储在该键列表的最后一个元素
- 627 /// </summary>
- 628 /// <param name="key"></param>
- 629 /// <returns></returns>
- 630 public stringListRightPop(string key)
- 631 {
- 632key = AddKeyPrefix(key);
- 633 return _db.ListRightPop(key);
- 634 }
- 635
- 636 /// <summary>
- 637 /// 移除列表指定键上与该值相同的元素
- 638 /// </summary>
- 639 /// <param name="key"></param>
- 640 /// <param name="value"></param>
- 641 /// <returns></returns>
- 642 public longListRemove(stringkey,string value)
- 643 {
- 644key = AddKeyPrefix(key);
- 645 return _db.ListRemove(key, value);
- 646 }
- 647
- 648 /// <summary>
- 649 /// 入列,在列表尾部插入值。如果键不存在,先创建再插入值
- 650 /// </summary>
- 651 /// <param name="key"></param>
- 652 /// <param name="value"></param>
- 653 /// <returns></returns>
- 654 public longListRightPush(stringkey,string value)
- 655 {
- 656key = AddKeyPrefix(key);
- 657 return _db.ListRightPush(key, value);
- 658 }
- 659
- 660 /// <summary>
- 661 /// 在列表头部插入值。如果键不存在,先创建再插入值
- 662 /// </summary>
- 663 /// <param name="key"></param>
- 664 /// <param name="value"></param>
- 665 /// <returns></returns>
- 666 public longListLeftPush(stringkey,string value)
- 667 {
- 668key = AddKeyPrefix(key);
- 669 return _db.ListLeftPush(key, value);
- 670 }
- 671
- 672 /// <summary>
- 673 /// 返回列表上该键的长度,如果不存在,返回 0
- 674 /// </summary>
- 675 /// <param name="key"></param>
- 676 /// <returns></returns>
- 677 public longListLength(string key)
- 678 {
- 679key = AddKe
来源: http://www.cnblogs.com/liqingwen/p/6917426.html