使用Redis的INCR、Hsetnx、Hincrby的命令生成序列號


Redis INCR命令

用於由一個遞增key的整數值。如果該key不存在,它被設置為0執行操作之前。如果key包含了錯誤類型的值或包含不能被表示為整數,字符串,則返回錯誤。該操作被限制為64位帶符號整數。

返回值
回復整數,鍵增量后的值

Redis Hincrby 命令

用於為哈希表中的字段值加上指定增量值。
增量也可以為負數,相當於對指定字段進行減法操作。
如果哈希表的 key 不存在,一個新的哈希表被創建並執行 HINCRBY 命令。
如果指定的字段不存在,那么在執行命令前,字段的值被初始化為 0 。
對一個儲存字符串值的字段執行 HINCRBY 命令將造成一個錯誤。
本操作的值被限制在 64 位(bit)有符號數字表示之內。

Redis Hsetnx 命令

用於為哈希表中不存在的的字段賦值 。
如果哈希表不存在,一個新的哈希表被創建並進行 HSET 操作。
如果字段已經存在於哈希表中,操作無效。
如果 key 不存在,一個新哈希表被創建並執行 HSETNX 命令。

案例

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using CSRedis;
    using System.Threading;

    private static void NewMethod()
    {
        var key = "hashName";

        for (int i = 0; i < 100; i++)
        {

            ThreadPool.SetMaxThreads(2000, 1000);
            ThreadPool.QueueUserWorkItem(o =>
            {
                using (var redis = new RedisClient("127.0.0.1"))
                {

                    var result = redis.Incr("2016060222");


                    /// 先進行判斷  這個是簽到計數的hash  infodemo 是按照時間+機構編碼進行處理的 
                    redis.HSetNx(key, "20160622", 0);
                    redis.HSetNx(key, "201606221001", 0);
                    redis.HSetNx(key, "2016062210011001K6100000002A1W52", 0);

                    ///  獲取簽到個數
                    var result2 = redis.HIncrBy(key, "20160622", 1);
                    var result3 = redis.HIncrBy(key, "201606221001", 1);
                    var result4 = redis.HIncrBy(key, "2016062210011001K6100000002A1W52", 1);

                    Console.WriteLine(result2);

                }

            });
          

        }
    }

案例使用的Redis操作類庫:csredis.dll 3.2.1 版本

使用事務,批量操作 redis.Multi();redis.Exec();

如果想同時對多個key,增加計數,那么使用事務操作。redis.Multi() / redis.Exec()

案例:

 /// <summary>
/// 使用redis的事務來計數,防止在操作的過程中,被其他線程亂入
/// </summary>
/// <param name="field0">字段1</param>
/// <param name="field1">字段2</param>
/// <param name="field2">字段3</param>
/// <returns></returns>
public static userindex RankCount(string field0, string field1, string field2)
{
    string key = "hashName";
    string redisURL = "127.0.0.1";

    using (var redis = new RedisClient(redisURL))
    {
        //事務的開始
        redis.Multi();

        redis.HSetNx(key, field0, 0);
        redis.HSetNx(key, field1, 0);
        redis.HSetNx(key, field2, 0);

        var result0 = redis.HIncrBy(key, field0, 1);
        var result1 = redis.HIncrBy(key, field1, 1);
        var result2 = redis.HIncrBy(key, field2, 1);

        //事務的結束
        var ress = redis.Exec();
        var userInfo = new userindex
        {
            dayIndex = (long)ress[3],//事務中,每執行一條語句,都會給事務數組增加一條數據。
            corpIndex = (long)ress[4],
            deptIndex = (long)ress[5]
        };

        return userInfo;
    }
}

public class userindex
{
    public long dayIndex { get; set; }
    public long deptIndex { get; set; }
    public long corpIndex { get; set; }
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM