Redis如何判断set/get是否为原子操作详解编程语言

    在做项目过程中,多个客户端可能同时读写Redis数据库,set和get命令是否为原子操作,关系到命令是否需要加锁机制的必要性。网上资料或者看书都说set和get等Redis命令为原子操作,但是程序里怎么测试呢?

    试想开1000个写线程,1000个读线程同时操作Redis中的一个值,假如set和get不是原子的,那么当set的时候,把原来数据涂掉,还没来得及写进去,get操作已经执行,这个时候get到的值就可能为脏数据。如果get得到的值都为正确的数据,基本能判断set和get命令为原子操作。


一:封装好的Redis读写类:


    package net.itxm.test;


    import java.util.HashMap;


    import java.util.Map;


    import java.util.concurrent.locks.Lock;


    import java.util.concurrent.locks.ReadWriteLock;


    import java.util.concurrent.locks.ReentrantReadWriteLock;


    import redis.clients.jedis.Jedis;


    import redis.clients.jedis.JedisPool;


    import redis.clients.jedis.JedisPoolConfig;


    public class RedisUtils {


        private Jedis jedis;


        private JedisPool jedisPool;


        public RedisUtils() {


            initialPool();


            jedis = jedisPool.getResource();


        }


        private void initialPool() {


            JedisPoolConfig config = new JedisPoolConfig();


            config.setMaxActive(100);


            config.setMaxIdle(20);


            config.setMaxWait(1000l);


            config.setTestOnBorrow(false);


            jedisPool = new JedisPool(config, “192.168.0.119”, 6077);


        }


        public String get(String key) {


            String getStr = jedis.get(key);


            return getStr;


        }


        public String set(String key, String value) {


            String setStr = jedis.set(key, value);


            return setStr;


        }


    }


二:1000个写线程:

 
   package net.itxm.test;


    public class writeTest extends Thread {


        public writeTest(String s) {


            super(s);


        }


        public void run() {


            RedisUtils ru = new RedisUtils();


            while (true) {


                try {


                    String s = ru.set(“test”, “100”);


                    System.out.println(getName() + “===” + “done”);


                } catch (Exception e) {


                    e.printStackTrace();


                }


            }


        }


        public static void main(String[] args) {


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


                String threadName = “WThread” + i;


                new writeTest(threadName).start();


            }


        }


    }


三:1000个读线程:


    package net.itxm.test;


    public class readTest extends Thread {


        public readTest(String s) {


            super(s);


        }


        public void run() {


            RedisUtils ru = new RedisUtils();


            while (true) {


                try {


                    String s = ru.get(“test”);


                    System.out.println(getName() + “===” + s);


                } catch (Exception e) {


                    e.printStackTrace();


                }


            }


        }


        public static void main(String[] args) {


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


                String threadName = “RThread” + i;


                new readTest(threadName).start();


            }


        }


    }


四:测试执行结果

    同时执行上述读线程,和写线程,看控制台输出get到的值是否有脏数据.发现RThread线程get读出来的数都是100,没有脏数据,即可判断set和get为原子操作。

    
Redis如何判断set/get是否为原子操作详解编程语言

   
Redis如何判断set/get是否为原子操作详解编程语言

    

Redis如何判断set/get是否为原子操作详解编程语言

转载请注明来源网站:blog.ytso.com谢谢!

原创文章,作者:奋斗,如若转载,请注明出处:https://blog.ytso.com/14602.html

(0)
上一篇 2021年7月19日
下一篇 2021年7月19日

相关推荐

发表回复

登录后才能评论