浏览代码

新增redis counter实现

zhouhao 8 年之前
父节点
当前提交
15d88768ff

+ 26 - 0
hsweb-concurrent/hsweb-concurrent-counter/hsweb-concurrent-counter-redis/pom.xml

@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <artifactId>hsweb-concurrent-counter</artifactId>
+        <groupId>org.hswebframework.web</groupId>
+        <version>3.0-SNAPSHOT</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>hsweb-concurrent-counter-redis</artifactId>
+
+
+    <dependencies>
+        <dependency>
+            <groupId>org.hswebframework.web</groupId>
+            <artifactId>hsweb-concurrent-counter-api</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.redisson</groupId>
+            <artifactId>redisson</artifactId>
+        </dependency>
+    </dependencies>
+</project>

+ 58 - 0
hsweb-concurrent/hsweb-concurrent-counter/hsweb-concurrent-counter-redis/src/main/java/org/hswebframework/web/counter/redis/RedissonCounter.java

@@ -0,0 +1,58 @@
+package org.hswebframework.web.counter.redis;
+
+import org.hswebframework.web.concurrent.counter.Counter;
+import org.redisson.api.RAtomicLong;
+
+/**
+ * TODO 完成注释
+ *
+ * @author zhouhao
+ */
+public class RedissonCounter implements Counter {
+
+    private final RAtomicLong atomicLong;
+
+    public RedissonCounter(RAtomicLong rAtomicLong) {
+        this.atomicLong = rAtomicLong;
+    }
+
+    @Override
+    public long get() {
+        return atomicLong.get();
+    }
+
+    @Override
+    public void set(long num) {
+        atomicLong.set(num);
+    }
+
+    @Override
+    public long getAndAdd(long num) {
+        return atomicLong.getAndAdd(num);
+    }
+
+    @Override
+    public void add(long num) {
+        atomicLong.addAndGet(num);
+    }
+
+    @Override
+    public void increment() {
+        atomicLong.incrementAndGet();
+    }
+
+    @Override
+    public void decrement() {
+        atomicLong.decrementAndGet();
+    }
+
+    @Override
+    public long incrementAndGet() {
+        return atomicLong.incrementAndGet();
+    }
+
+    @Override
+    public long decrementAndGet() {
+        return atomicLong.decrementAndGet();
+    }
+}

+ 28 - 0
hsweb-concurrent/hsweb-concurrent-counter/hsweb-concurrent-counter-redis/src/main/java/org/hswebframework/web/counter/redis/RedissonCounterManager.java

@@ -0,0 +1,28 @@
+package org.hswebframework.web.counter.redis;
+
+import org.hswebframework.web.concurrent.counter.AbstractCounterManager;
+import org.hswebframework.web.concurrent.counter.Counter;
+import org.hswebframework.web.concurrent.counter.CounterManager;
+import org.redisson.Redisson;
+import org.redisson.api.RAtomicLong;
+
+import java.util.Map;
+
+/**
+ * @author zhouhao
+ */
+public class RedissonCounterManager extends AbstractCounterManager {
+
+    private Redisson redisson;
+
+    public RedissonCounterManager(Redisson redisson) {
+        this.redisson = redisson;
+    }
+
+    @Override
+    protected Counter createCount(String name, long initValue) {
+        Counter counter = new RedissonCounter(redisson.getAtomicLong(name));
+        counter.set(initValue);
+        return counter;
+    }
+}

+ 34 - 0
hsweb-concurrent/hsweb-concurrent-counter/hsweb-concurrent-counter-redis/src/test/java/org/hswebframework/web/counter/redis/RedissonCounterTest.java

@@ -0,0 +1,34 @@
+package org.hswebframework.web.counter.redis;
+
+import org.hswebframework.web.concurrent.counter.Counter;
+import org.hswebframework.web.concurrent.counter.CounterManager;
+import org.junit.Assert;
+import org.redisson.Redisson;
+import org.redisson.config.Config;
+
+import static org.junit.Assert.*;
+
+/**
+ * TODO 完成注释
+ *
+ * @author zhouhao
+ */
+public class RedissonCounterTest {
+
+    public static void main(String[] args) throws InterruptedException {
+        Config config = new Config();
+//        config.setUseLinuxNativeEpoll(true);
+        config.useSingleServer().setAddress("127.0.0.1:6379");
+        Redisson redisson = (Redisson) Redisson.create(config);
+
+        CounterManager counterManager = new RedissonCounterManager(redisson);
+        for (int i = 0; i < 100; i++) {
+            new Thread(() -> counterManager.getCounter("test").increment()).start();
+        }
+
+        Thread.sleep(500);
+        Assert.assertEquals(counterManager.getCounter("test").get(), 100);
+        redisson.shutdown();
+
+    }
+}

+ 1 - 0
hsweb-concurrent/hsweb-concurrent-counter/pom.xml

@@ -30,6 +30,7 @@
     <packaging>pom</packaging>
     <modules>
         <module>hsweb-concurrent-counter-api</module>
+        <module>hsweb-concurrent-counter-redis</module>
     </modules>