zoukankan      html  css  js  c++  java
  • 使用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; }
    }
  • 相关阅读:
    Atitit 趋势管理之道 attilax著
    Atitit 循环处理的新特性 for...else...
    Atitit 2017年的技术趋势与未来的大技术趋势
    atitit 用什么样的维度看问题.docx 如何了解 看待xxx
    atitit prj mnrs 项目中的几种经理角色.docx
    Atitit IT办公场所以及度假村以及网点以及租房点建设之道 attilax总结
    Atitit 工具选型的因素与方法 attilax总结
    Atitit.团队文化建设影响组织的的一些原理 法则 定理 效应 p826.v4
    Atiitt 管理方面的误区总结 attilax总结
    Atitit 未来趋势把控的书籍 attilax总结 v3
  • 原文地址:https://www.cnblogs.com/weiqinl/p/5609385.html
Copyright © 2011-2022 走看看