• redis incr incrby decr decrby命令


    incr、incrby、decr、decrby命令的作用和用法

    redis中incr、incrby、decr、decrby属于string数据结构,它们是原子性递增或递减操作。

    • incr递增1并返回递增后的结果;
    • incrby根据指定值做递增或递减操作并返回递增或递减后的结果(incrby递增或递减取决于传入值的正负);
    • decr递减1并返回递减后的结果;
    • decrby根据指定值做递增或递减操作并返回递增或递减后的结果(decrby递增或递减取决于传入值的正负);

    设置incr:key和decr:key观察用法和执行结果

    1.首次观察incr:key的值,可以看到没有结果

    127.0.0.1:6381> GET incr:key

    127.0.0.1:6381>

    2.对incr:key执行incr命令,可以看到redis返回了递增后的结果1。incr命令会返回递增后的结果

    127.0.0.1:6381> incr incr:key
    1
    127.0.0.1:6381>

    3.对incr:key执行incrby命令,能看到redis返回了递增后的结果5。incrby命令会返回递增后的结果

    127.0.0.1:6381> incrby incr:key 4
    5
    127.0.0.1:6381>

    4.对incr:key执行incrby命令,这次传入一个负数,能观察到redis返回了递减后的结果2

    127.0.0.1:6381> incrby incr:key -3
    2
    127.0.0.1:6381>

    5.对incr:key执行incrby命令,同样传入负数, 可以观察到incr:key经过递减后结果变成了负数

    127.0.0.1:6381> incrby incr:key -4
    -2
    127.0.0.1:6381>

    6.首次观察decr:key,没有任何结果

    127.0.0.1:6381> GET decr:key
    
    127.0.0.1:6381>

    7.对decr:key执行decr命令,可以看到redis返回了递减后的结果

    127.0.0.1:6381> decr decr:key
    -1
    127.0.0.1:6381>

    8.对decr:key执行decrby命令,可以看到redis返回了递减后的结果,这里的值输入的是4而不是-4

    127.0.0.1:6381> decrby decr:key 4
    -5
    127.0.0.1:6381>

    9.对decr:key执行decrby命令,这次输入一个负数,观察一下结果

    127.0.0.1:6381> decrby decr:key -1
    -4
    127.0.0.1:6381>

    并发递增和递减

      做一个实验,并发100个线程对同一个key做操作,其中50个执行incr命令,另外50个执行decr命令,观察一下结果

    /**
     * 并发100个线程,50个线程做decr命令,另外50个线程做incr命令
     *
     * @author tianshu on 16/10/31 上午10:52.
     */
    public class MultipleDecrIncr {
    
        /** decr线程数量 */
        private static final int DECR_THREAD_COUNT = 50;
        /** incr线程数量 */
        private static final int INCR_THREAD_COUNT = 50;
    
        private static CountDownLatch begin = new CountDownLatch(DECR_THREAD_COUNT + INCR_THREAD_COUNT);
    
        private static CountDownLatch finish = new CountDownLatch(DECR_THREAD_COUNT + INCR_THREAD_COUNT);
    
        static final String KEY = "string:decr:incr";
    
    
        public static void main(String[] args) throws InterruptedException {
    
            for(int i = 0; i < DECR_THREAD_COUNT; ++i) {
                new DecrThread().start();
                begin.countDown();
            }
    
            for(int i = 0; i < INCR_THREAD_COUNT; ++i) {
                new IncrThread().start();
                begin.countDown();
            }
    
            finish.await();
    
            JedisConnect jedisConnect = JedisConnect.getJedisConnect();
            Jedis jedis = jedisConnect.getJedis();
    
            String value = jedis.get(KEY);
            System.out.println(value);
    
            jedisConnect.releaseJedis(jedis);
        }
    
        /**
         * decr命令线程
         */
        static class DecrThread extends Thread {
    
            @Override
            public void run() {
    
                try {
                    begin.await();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
    
                JedisConnect jedisConnect = JedisConnect.getJedisConnect();
                Jedis jedis = jedisConnect.getJedis();
    
                jedis.decr(KEY);
                jedisConnect.releaseJedis(jedis);
    
                finish.countDown();
            }
        }
    
        /**
         * incr命令线程
         */
        static class IncrThread extends Thread {
    
            @Override
            public void run() {
    
                try {
                    begin.await();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
    
                JedisConnect jedisConnect = JedisConnect.getJedisConnect();
                Jedis jedis = jedisConnect.getJedis();
    
                jedis.incr(KEY);
                jedisConnect.releaseJedis(jedis);
    
                finish.countDown();
            }
    
        }
    
    }

    应用场景

      个人觉得这类命令一般会应用到计数器场景

    • 单号生成:根据业务生成key,每当需要单号时可以使用incr获得一个新的序列号。
    • 错误拦截:比如有的网站账号密码输入错误N次之后,会做一些特殊处理;使用incr是实现这种功能的方式之一,可以根据用户的特殊标识表示key,每当账号密码输错时使用incr命令做递增。
    • 非法拦截:某段时间限制同IP请求同一接口次数
  • 相关阅读:
    49. 字母异位词分组
    73. 矩阵置零
    Razor语法问题(foreach里面嵌套if)
    多线程问题
    Get json formatted string from web by sending HttpWebRequest and then deserialize it to get needed data
    How to execute tons of tasks parallelly with TPL method?
    How to sort the dictionary by the value field
    How to customize the console applicaton
    What is the difference for delete/truncate/drop
    How to call C/C++ sytle function from C# solution?
  • 原文地址:https://www.cnblogs.com/sealedbook/p/6194047.html
Copyright © 2020-2023  润新知