WINDOWS 下, Redis 单机事务测试

WIN 10: i5 4440, 8GB

测试REDIS的事务速度

REDIS的WATCH机制实现事务是一个乐观锁形式(应该是SPIN LOCK的一种)。适用于并发度不是很高的场景,可以节约CPU资源(轻量级锁)。但是当竞争激烈的情况下,失败概率会大大提升,大量失败后的重试会耗费CPU资源。

测试的逻辑

1)读取计数器

2)JAVA端自增

3)设置回REDIS

此处不可用REDIS自带的incr函数,REDIS服务器端为单线程执行,所以服务器端只执行一个incr指令的情况下,其实可以看作原子操作, 服务器端直接执行1-2秒就可以了,当然取决于电脑。

计数器计算到10万为止。(线程增多,那么每个线程负载计算量就减少)

package one;

import java.text.NumberFormat;
import java.util.concurrent.CountDownLatch;

import redis.clients.jedis.Jedis;
import redis.clients.jedis.Transaction;

public class TransactionContentionTest extends ConnectionBuilder {
    private static final int CONTENTION_LEVEL = 5;
    private static final int TOTAL = 20000;
    private static final NumberFormat nf = NumberFormat.getPercentInstance();

    public static void main(String[] args) throws Exception {
        nf.setMinimumFractionDigits(2);
        buildPool();
        CountDownLatch latch = new CountDownLatch(CONTENTION_LEVEL);
        Thread[] threads = new Thread[CONTENTION_LEVEL];
        ContentionClient[] clients = new ContentionClient[CONTENTION_LEVEL];
        Jedis jedis = pool.getResource();
        jedis.set("TestCounter", "0");
        jedis.close();
        for (int i = 0; i < CONTENTION_LEVEL; i++) {
            ContentionClient client = new ContentionClient();
            client.setTotal(TOTAL);
            client.setCounterName("TestCounter");
            client.setJedis(pool.getResource());
            client.setLatch(latch);
            clients[i] = client;
            threads[i] = new Thread(client);
        }
        long start = System.currentTimeMillis();
        for (int i = 0; i < CONTENTION_LEVEL; i++) {
            threads[i].start();
        }
        latch.await();
        long end = System.currentTimeMillis();
        System.out.println("Elapse:" + (end - start) + " ms");
        for (int i = 0; i < CONTENTION_LEVEL; i++) {
            Double failRate = (double) clients[i].getFailCount() / TOTAL;
            System.out.println(i + " Fail Rate:" + nf.format(failRate));
            clients[i].getJedis().close();
        }
        close();
    }

    static class ContentionClient implements Runnable {
        private Jedis jedis;
        private String counterName;
        private int total;
        private long failCount = 0;

        public CountDownLatch getLatch() {
            return latch;
        }

        public void setLatch(CountDownLatch latch) {
            this.latch = latch;
        }

        private CountDownLatch latch;

        public Jedis getJedis() {
            return jedis;
        }

        public void setJedis(Jedis jedis) {
            this.jedis = jedis;
        }

        public String getCounterName() {
            return counterName;
        }

        public void setCounterName(String counterName) {
            this.counterName = counterName;
        }

        public int getTotal() {
            return total;
        }

        public void setTotal(int total) {
            this.total = total;
        }

        public long getFailCount() {
            return failCount;
        }

        public void setFailCount(long failCount) {
            this.failCount = failCount;
        }

        @Override
        public void run() {
            while (total > 0) {
                jedis.watch(counterName);
                Integer counter = Integer.parseInt(jedis.get(counterName));
                Transaction tx = jedis.multi();
                counter++;
                tx.set(counterName, counter.toString());
                if (tx.exec() == null) {
                    jedis.unwatch();
                    failCount++;
                } else {
                    total--;
                }
            }
            latch.countDown();
        }
    }
}

分别测试多组数据

线程数 1 2 4 8 16
重试率 0 67% 185% 435% 900%
耗时 21055ms 19312 21136 34231 65964

用乐观锁机制并发度稍微高一点的情况,资源耗费非常严重。

毕竟用的是WINDOWS和家用机,测试的数据,没有参考价值。

时间: 2025-01-03 23:09:38

WINDOWS 下, Redis 单机事务测试的相关文章

NoSQL之Windows下Redis的测试使用

NoSQL简介 介绍Redis前,我想还是先认识下NoSQL,即not only sql, 是一种非关系型的数据存储,key/value键值对存储.现有Nosql DB 产品: redis/MongoDB/Memcached/Hbase/Cassandra/ Tokyo Cabinet/Voldemort/Dynomite/Riak/ CouchDB/Hypertable/Flare/Tin/Lightcloud/ KiokuDB/Scalaris/Kai/ThruDB, 等等~~~ 为什么需要

Windows下redis 安装与PHP使用

http://alfred-long.iteye.com/blog/1684545 一. 安装redis及启用服务 1 下载redis客户端 http://code.google.com/p/servicestack/wiki/RedisWindowsDownload#Download_32bit_Cygwin_builds_for_Windows 2 解压到你所需要的目录中 3 创建redis.conf文件 Redis.conf代码   # Redis configuration file e

[Redis]windows下redis安装

官方的下载地址是: http://redis.io/download 在win64一栏中可以看到redis原本是没有windows版本的,windows版本是Microsoft Open Tech团队开的 给出了一个github的链接地址: https://github.com/MSOpenTech/redis 下载: 在https://github.com/MSOpenTech/redis  页面的右下角有  Download Zip的字样,点击之后就可以下载源码的zip包了. 然后就是解压:

[Redis]windows下redis的安装和启动

官方的下载地址是: http://redis.io/download 在win64一栏中可以看到redis原本是没有windows版本的,windows版本是Microsoft Open Tech团队开的 给出了一个github的链接地址: https://github.com/MSOpenTech/redis 下载: 在https://github.com/MSOpenTech/redis  页面的右下角有  Download Zip的字样,点击之后就可以下载源码的zip包了. 然后就是解压:

最新Windows下Redis集群

实现简单的Windows下Redis集群配置,以下是配置过程中出现的几个问题: [1]逐个启动7001 7002 7003 7004 7005 7006节点时,出现createing server TCP listening socket *:7000:listen:Unknown error错误时,可以在7001目录下的redis.conf文件(节点配置信息包含端口等的文件)第一行加入(bind 127.0.0.1)这一行即可解决 [2]执行到gem install redis时,出现SSL

windows下redis安装

最近因公司项目原因,去了趟昆明出差,其中第一次接触安装redis,配置sentinel,学习到不少,但也都是皮毛而已,本随笔记下所学知识. 1.首先介绍下redis,来源自百度百科 redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合).zset(sorted set --有序集合)和hash(哈希类型).这些数据类型都支持push/pop.add/remove及取交集并集和差集及更丰

Windows下Redis的安装使用

摘要 redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合).zset(sorted set --有序集合)和hash(哈希类型).这些数据类型都支持push/pop.add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的.在此基础上,redis支持各种不同方式的排序.与memcached一样,为了保证效率,数据都是缓存在内存中.区别的是redis会周期性的把更

Windows下Redis的安装使用 以及 phpRedisAdmin安装

windows下的redis的网盘下载地址: http://pan.baidu.com/s/1c0yeIDM redis-server.exe:服务程序 redis-check-dump.exe:本地数据库检查 redis-check-aof.exe:更新日志检查 redis-benchmark.exe:性能测试,用以模拟同时由N个客户端发送M个 SETs/GETs 查询 运行需要redis的配置文件redis.conf 或者 redis.windows.conf,如没有指定,则使用默认设置 开

Windows下Redis的安装使用[转]

redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合).zset(sorted set --有序集合)和hash(哈希类型).这些数据类型都支持push/pop.add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的.在此基础上,redis支持各种不同方式的排序.与memcached一样,为了保证效率,数据都是缓存在内存中.区别的是redis会周期性的把更新的数