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; }
    }
  • 相关阅读:
    第09组 Beta版本演示
    第09组 Beta冲刺(5/5)
    第09组 Beta冲刺(4/5)
    网络对抗技术 2017-2018-2 20155215 Exp9 Web安全基础
    网络对抗技术 2017-2018-2 20152515 Exp 8 Web基础
    网络对抗技术 2017-2018-2 20152515 Exp7 信息搜集与漏洞扫描
    网络对抗技术 2017-2018-2 20152515 Exp6 信息搜集与漏洞扫描
    网络对抗技术 2017-2018-2 20152515 Exp5 MSF基础应用
    网络对抗技术 2017-2018-2 20152515 Exp4 恶意代码分析
    网络对抗技术 2017-2018-2 20152515 Exp3 免杀原理与实践
  • 原文地址:https://www.cnblogs.com/weiqinl/p/5609385.html
Copyright © 2011-2022 走看看