zoukankan      html  css  js  c++  java
  • Redis 事务操作

    1、RedisTemplate的API实现

    @RunWith(SpringJUnit4ClassRunner.class)
    @SpringBootTest
    @EnableAutoConfiguration
    @EnableFeignClients
    //@ActiveProfiles("sonar")
    //@Ignore
    public class RedisTemplateTest {
        
        private static final Logger LOG = LoggerFactory.getLogger(RedisTemplateTest.class);
        
        @Autowired
        private RedisTemplate stringredisTemplate;
    
    
        @Before
        public void setUp() throws Exception {
        }
        
        @Test
        public void mutli() {
            ValueOperations<String, String> vo = stringredisTemplate.opsForValue();
            stringredisTemplate.setEnableTransactionSupport(true);
    
            stringredisTemplate.multi();
            vo.set("b", "1");
            vo.increment("b", 2);
            vo.get("b");
            stringredisTemplate.discard();
    
            stringredisTemplate.multi();
            vo.set("a", "1");
            vo.increment("a", 2);
            vo.get("a");
            System.out.println("junit-------------------------");
            System.out.println("----------------" + stringredisTemplate.exec());
            // System.out.println("-------");
            
            stringredisTemplate.setEnableTransactionSupport(false);
            List<Object> rs = null;
            do{
                stringredisTemplate.watch("a");
                stringredisTemplate.multi();
                vo.increment("a", 2);
                vo.increment("a", 2);
                rs = stringredisTemplate.exec();
            }while(rs == null);//多重检测,直到执行成功。
        }
    }

    结果:

    junit-------------------------
    ----------------[3, 3]

    看看a的值:

    2、RedisOperations

        @Test
        public void mutli2() throws InterruptedException {
            String key = "multThreadTest";
            
            stringredisTemplate.delete(key);
            
            Runnable runable = new Runnable() {
                @Override
                public void run() {
            
                    stringredisTemplate.execute(new SessionCallback<Object>() {
                        @Override
                        @SuppressWarnings({ "unchecked", "rawtypes" })
                        public Object execute(RedisOperations operations) throws DataAccessException {
                            List<Object> result = null;
                            do {
                                int count = 0;
                                operations.watch(key);  // watch某个key,当该key被其它客户端改变时,则会中断当前的操作
                                String value = (String) operations.opsForValue().get(key);
                                if (!StringUtils.isNullOrEmpty(value)) {
                                    count = Integer.parseInt(value);
                                }
                                count = count + 1;
                                operations.multi(); //开始事务
                                operations.opsForValue().set(key, String.valueOf(count));
                                try {
                                    result = operations.exec(); //提交事务
                                } catch (Exception e) { //如果key被改变,提交事务时这里会报异常
            
                                }
                            } while (result == null); //如果失败则重试
                            return null;
                        }
            
                    });
            
                }
            };
            List<Thread> threads = new ArrayList<>();
            for (int i = 0; i < 10; i++) {
                Thread thread = new Thread(runable, "thread-" + (i + 1));
                thread.start();
                threads.add(thread);
            }
            
            for (Thread thread : threads) {
                thread.join();
            }
            
            Object value = stringredisTemplate.opsForValue().get(key);
            System.out.println(value);
        }

    参考:

    https://www.cnblogs.com/aoeiuv/p/6761688.html

    https://my.oschina.net/sxwailyc/blog/1973427

  • 相关阅读:
    马士兵讲jsp项目--BBS项目分析笔记
    ubuntu 14.04中安装phpmyadmin即mysql图形管理界面
    Xman冬令营writeup
    python--gevent协程及协程概念
    python--multiprocessing多进程总结
    python--threading多线程总结
    浅析Java中print、printf、println的区别
    内存泄漏与内存溢出
    Java中==和equals的区别,equals和hashCode的区别
    vue五十七:电影院售票项目案例之使用swiper实现轮播功能
  • 原文地址:https://www.cnblogs.com/duanxz/p/14750040.html
Copyright © 2011-2022 走看看