Hatena::¥Ö¥í¥°(Diary)

CLOVER

2017-10-01

Apache Geode ¤ òÁÈ ¤ ß ¹ þ ¤ ß ¤ ÊMemcached¡¿Redis Server ¤ È ¤ · ¤ Æ »È ¤ ¦

¤ Á ¤ ç ¤ à ¤ È ¤ · ¤ ¿¾® ¥ Í ¥ ¿Åª ¤ Ë¡£

Apache Geode ¤ Ï¡ ¢ Memcached Server ¤ ª ¤ è ¤ ÓRedis Server ¤ Ë ¤ Ê ¤ ì ¤ 뵡ǽ ¤ ò »ý ¤ à ¤ Æ ¤ ¤ ¤ Þ ¤ ¹ ¡£

How Gemcached Works | Geode Docs

Geode Redis Adapter | Geode Docs

¤ der l ¤ ì ¤ ¾ ¤ ì¡ ¢ Gemcached ¤ ÈRedis Adapter ¤ È ¤ ¤ ¤ ¦ ̾Á° ¤ Î ¤ è ¤ ¦ ¤ Ç ¤ ¹ ¡£

Gemcached ¤ Ë ¤ Ä ¤ ¤ ¤ Æ ¤ Ï¡ ¢ ÁÈ ¤ ß ¹ þ ¤ ß ¤ È ¤ · ¤ Æ »È ¤ ¦ ¥ µ ¥ ó ¥ × ¥ ë ¤ zu ¥ É ¥ ¥ å ¥ á ¥ ó ¥ È¾å ¤ Ë ¤ ¢ ¤ ë ¤ Î ¤ Ç ¤ ¹ ¤ ¬¡ ¢ Redis Adapter ¤ Ë ¤ Ä ¤ ¤ ¤ Æ ¤ Ï
gfsh¾å ¤ Ç ¤ ÎÁàºî ¤ · ¤ «µºÜ ¤ µ ¤ ì ¤ Æ ¤ ¤ ¤ Þ ¤» ¤ ó¡£

¤ Ç ¤ ¹ ¤ ¬¡ ¢ Redis Adapter ¤ âƱ ¤ ¸ ¤ è ¤ ¦ ¤ ËÁÈ ¤ ß ¹ þ ¤ ß ¤ Ç »È ¤ ¦ ¤ ³ ¤ È ¤ zu ¤ Ç ¤ ¤ ë ¤ è ¤ ¦ ¤ Ê ¤ Î ¤ Ç¡ ¢ ¹ ç ¤ ï ¤» ¤ ÆÆ° ¤ «¤ · ¤ Æ ¤ ß ¤ ë ¤ ³ ¤ È ¤ Ë ¤ · ¤ Þ ¤ · ¤ ¿¡£

½àÈ÷

Gemcached ¤ âRedis Adapter ¤ â¡ ¢ Apache Geode ¤ Îcore ¥ â ¥ ¸ ¥ 塼 ¥ ë ¤ Ë´Þ ¤ Þ ¤ ì ¤ Æ ¤ ¤ ¤ Þ ¤ ¹ ¡£ ¤ è ¤ à ¤ Æ¡ ¢ ´ ðËÜŪ ¤ Ë ¤ Ïcore ¤ zu ¤ ¢ ¤ ì ¤ ÐOK¡Ä¡£

        <dependency>
            <groupId>org.apache.geode</groupId>
            <artifactId>geode-core</artifactId>
            <version>1.2.1</version>
        </dependency>

¤ ȸÀ ¤ ¤ ¤ und ¤ ¤ ¤ È ¤ ³ ¤ í ¤ Ç ¤ ¹ ¤ ¬¡ ¢ Redis Adapter ¤ Ë ¤ Ä ¤ ¤ ¤ Æ ¤ Ïoptional ¤ Ê°Í ¸´Ø ·¸ ¤ ¬É¬Í× ¤ Ë ¤ Ê ¤ ê ¤ Þ ¤ ¹ ¡£ ¤ der l ¤ Á ¤ é ¤ Ë ¤ Ä ¤ ¤ ¤ Æ ¤ Ï¡ ¢
¸å½Ò ¤ ¹ ¤ ë ¤ ³ ¤ È ¤ Ë ¤ · ¤ Þ ¤ · ¤ ç ¤ ¦ ¡£

Memcached ¤ ª ¤ è ¤ ÓRedis ¤ Ë ¥ ¢ ¥ ¯ ¥ »¥ ¹ ¤ ¹ ¤ ë ¤ und ¤ á ¤ Î ¥ é ¥ ¤ ¥ Ö ¥ é ¥ ê ¤ È ¤ · ¤ Æ ¤ Ï¡ ¢ ¤ der l ¤ ì ¤ ¾ ¤ ìspymemcached ¤ ÈLettuce ¤ ò» ÈÍÑ ¤ ¹ ¤ ë ¤ ³ ¤ È ¤ Ë ¤ · ¤ Þ ¤ ¹ ¡£

        <dependency>
            <groupId>net.spy</groupId>
            <artifactId>spymemcached</artifactId>
            <version>2.12.3</version>
        </dependency>
        <dependency>
            <groupId>io.lettuce</groupId>
            <artifactId>lettuce-core</artifactId>
            <version>5.0.0.RELEASE</version>
        </dependency>

³Îǧ ¤ Ï ¥ Æ ¥ ¹ ¥ È ¥ ³¡¼ ¥ É ¤ Ç ¤ ä ¤ ê ¤ Þ ¤ ¹ ¡£JUnit ¤ ÈAssertJ ¤ ò°Í ¸´Ø ·¸ ¤ ˲à ¤ ¨ ¤ Æ ¤ ª ¤ ¤ Þ ¤ ¹ ¡£

        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-api</artifactId>
            <version>5.0.0</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-engine</artifactId>
            <version>5.0.0</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.junit.platform</groupId>
            <artifactId>junit-platform-launcher</artifactId>
            <version>1.0.0</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.assertj</groupId>
            <artifactId>assertj-core</artifactId>
            <version>3.8.0</version>
            <scope>test</scope>
        </dependency>

¤ Ç ¤ Ï¡ ¢ ½ñ ¤ ¤ ¤ Æ ¤ ¤ ¤ à ¤ Æ ¤ ß ¤ Þ ¤ · ¤ ç ¤ ¦ ¡£

Memcached¡ÊGemcached¡Ë

¤ Þ ¤ º ¤ Ï¡ ¢ ¥ Æ ¥ ¹ ¥ È ¥ ³¡¼ ¥ É ¤ ο÷·Á ¤ «¤ é¡£
src/test/java/org/littlewings/geode/embedded/EmbeddedMemcachedServerTest.java

package org.littlewings.geode.embedded;

import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.charset.StandardCharsets;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;

import net.spy.memcached.AddrUtil;
import net.spy.memcached.BinaryConnectionFactory;
import net.spy.memcached.MemcachedClient;
import org.apache.geode.cache.Cache;
import org.apache.geode.cache.CacheFactory;
import org.apache.geode.cache.Region;
import org.apache.geode.internal.memcached.ValueWrapper;
import org.apache.geode.memcached.GemFireMemcachedServer;
import org.junit.jupiter.api.Test;

import static org.assertj.core.api.Assertions.assertThat;

public class EmbeddedMemcachedServerTest {
    // ¤³¤³¤Ë¡¢¥Æ¥¹¥È¤ò½ñ¤¯¡ª
}

ºÇ½é ¤ Ë ¤ â½ñ ¤ ¤ Þ ¤ · ¤ und ¤ ¬¡ ¢ Memcached Server ¤ Ø ¤ Î ¥ ¢ ¥ ¯ ¥ »¥ ¹ ¤ Ë ¤ Ïspymemcached ¤ ò» ÈÍÑ ¤ · ¤ Þ ¤ ¹ ¡£

no title

Gemcached ¤ òÁÈ ¤ ß ¹ þ ¤ ß ¤ È ¤ · ¤ Æ »È ¤ à ¤ und ¥ ³¡¼ ¥ ÉÎã ¤ Ï¡ ¢ ¤ ³ ¤ ó ¤ Ê ´ ¶ ¤ ¸ ¤ Ç ¤ ¹ ¡£

    @Test
    public void gettingStarted() throws IOException, InterruptedException, ExecutionException {
        GemFireMemcachedServer memcachedServer =
                new GemFireMemcachedServer("localhost", 11211, GemFireMemcachedServer.Protocol.ASCII);
        memcachedServer.start();

        MemcachedClient client = new MemcachedClient(new InetSocketAddress("localhost", 11211));

        try {
            client.set("key1", 3, "value1").get();  // Future
            assertThat(client.get("key1")).isEqualTo("value1");

            TimeUnit.SECONDS.sleep(5L);

            assertThat(client.get("key1")).isNull();

            client.set("key2", 3, "value2").get();  // Future
            assertThat(client.get("key2")).isEqualTo("value2");
            client.delete("key2").get();  // Future
            assertThat(client.get("key2")).isNull();
        } finally {
            client.shutdown();
            memcachedServer.shutdown();
        }
    }

GemFireMemcachedServer ¥ ¯ ¥ é ¥ ¹ ¤ Î ¥ ¤ ¥ ó ¥ ¹ ¥ und ¥ ó ¥ ¹ ¤ òºîÀ® ¤ · ¤ Æ¡ ¢ GemFireMemcachedServer#start ¤ ¹ ¤ ë ¤ À ¤ ±¡£

        GemFireMemcachedServer memcachedServer =
                new GemFireMemcachedServer("localhost", 11211, GemFireMemcachedServer.Protocol.ASCII);
        memcachedServer.start();

GemFireMemcachedServer ¤ Î ¥ ³ ¥ ó ¥ ¹ ¥ È ¥ é ¥ ¯ ¥ und ¤ Ï2 ¤ Ä ¤ ¢ ¤ ê¡ ¢ ¥ ê ¥ à ¥ ¹ ¥ ó ¥ Ý¡¼ ¥ È ¤ Î ¤ ß ¤ Î »ØÄê ¤ È¡ ¢ ¥ Ð ¥ ¤ ¥ ó ¥ É ¤ ¹ ¤ ë ¥ ¢ ¥ É ¥ ì ¥ ¹ ¤ È ¥ Ý¡¼ ¥ È¡ ¢
Memcached ¤ Ç »È ¤ ¦ ¥ × ¥ í ¥ È ¥ ³ ¥ ë ¤ ò» ØÄê ¤ Ç ¤ ¤ ë ¤ â ¤ Î ¤ zu ¤ ¢ ¤ ê ¤ Þ ¤ ¹ ¡£
https://123
https://142

º£²ó ¤ Ï¡ ¢ Á´Éô »ØÄê ¤ ¹ ¤ ë·Á ¤ ò¼è ¤ ê ¤ Þ ¤ · ¤ ¿¡£

¥ ê ¥ à ¥ ¹ ¥ ó ¥ Ý¡¼ ¥ È ¤ Ï¡ ¢ Éé ¤ ÎÃÍ ¤ ò »ØÄê ¤ ¹ ¤ ë ¤ È ¥ Ç ¥ Õ ¥ © ¥ ë ¥ È ¤ È ¤ · ¤ Æ11212 ¥ Ý¡¼ ¥ È ¤ ò¼è ¤ ê ¤ Þ ¤ ¹ ¡£
https://86

¥ × ¥ í ¥ È ¥ ³ ¥ ë ¤ Ï¡ ¢ ¥ Ç ¥ Õ ¥ © ¥ ë ¥ È ¤ ÇASCII ¤ Ç ¤ ¹ ¡£
https://130

»È ¤ ¤ ½ª ¤ ï ¤ à ¤ und ¤ é¡ ¢ shutdown ¤ · ¤ Þ ¤ · ¤ ç ¤ ¦ ¡£

            memcachedServer.shutdown();

¤ ³ ¤ ì ¤ ¬¡ ¢ ´ ðËÜŪ ¤ Ê »È ¤ ¤ Êý ¤ Ë ¤ Ê ¤ ê ¤ Þ ¤ ¹ ¡£

expire ¤ È ¤ «¤ â¸ú ¤ ¤ ¤ Æ ¤ ¤ ¤ Æ¡ ¢ ÎÉ ¤ µ ¤ der l ¤ ¦ ¤ Ç ¤ ¹ ¤ Í¡£

            client.set("key1", 3, "value1").get();  // Future
            assertThat(client.get("key1")).isEqualTo("value1");

            TimeUnit.SECONDS.sleep(5L);

            assertThat(client.get("key1")).isNull();

            client.set("key2", 3, "value2").get();  // Future
            assertThat(client.get("key2")).isEqualTo("value2");
            client.delete("key2").get();  // Future
            assertThat(client.get("key2")).isNull();

spymemcached ¤ Îset ¤ ÎÌá ¤ êÃÍ ¤ ¬Future ¤ Ë ¤ Ê ¤ à ¤ Æ ¤ ¤ ¤ ë ¤ ³ ¤ È ¤ òÃÎ ¤ é ¤ Ê ¤ ¯ ¤ Æ¡ ¢ ºÇ½é ¥ Æ ¥ ¹ ¥ È ¤ ¬ÉÔ°ÂÄê ¤ Ë ¤ Ê ¤ à ¤ Æ ¥ Ï ¥ Þ ¤ ê ¤ Þ ¤ · ¤ ¿¡Ä¡£

Binary ¥ × ¥ í ¥ È ¥ ³ ¥ ë ¤ Ç ¤ â¡ ¢ ÌäÂê ¤ Ê ¤ ¯Æ°ºî ¤ · ¤ Þ ¤ ¹ ¡£

    @Test
    public void gettingStartedAsBinary() throws IOException, InterruptedException, ExecutionException {
        GemFireMemcachedServer memcachedServer =
                new GemFireMemcachedServer("localhost", 11211, GemFireMemcachedServer.Protocol.BINARY);
        memcachedServer.start();

        MemcachedClient client =
                new MemcachedClient(
                        new BinaryConnectionFactory(),
                        AddrUtil.getAddresses("localhost:11211")
                );

        try {
            client.set("key1", 3, "value1").get();  // Future
            assertThat(client.get("key1")).isEqualTo("value1");

            TimeUnit.SECONDS.sleep(5L);

            assertThat(client.get("key1")).isNull();

            client.set("key2", 3, "value2").get();  // Future
            assertThat(client.get("key2")).isEqualTo("value2");
            client.delete("key2").get();  // Future
            assertThat(client.get("key2")).isNull();
        } finally {
            client.shutdown();
            memcachedServer.shutdown();
        }
    }

¤ Þ ¤ ¿¡ ¢ Gemcached ¤ zu »ÈÍÑ ¤ ¹ ¤ ëRegion ¤ Ï¡ ¢ ¡Ögemcached¡× ¤ È ¤ ¤ ¤ ¦ ̾Á° ¤ È ¤ Ê ¤ à ¤ Æ ¤ ¤ ¤ Þ ¤ ¹ ¡£
https://69

¡Ögemcached¡×Region ¤ ¬Â¸ºß ¤ · ¤ Ê ¤ ¤ ¾ì ¹ ç ¤ ÏPartition Region ¤ È ¤ · ¤ ƺîÀ® ¤ µ ¤ ì ¤ ë ¤ è ¤ ¦ ¤ Ë ¤ Ê ¤ à ¤ Æ ¤ ¤ ¤ Þ ¤ ¹ ¡£
https://java#L144-L153

¤ è ¤ à ¤ Æ¡ ¢ ¡Ögemcached¡×Region ¤ ò ¥ «¥ ¹ ¥ und ¥ Þ ¥ ¤ ¥ º ¤ · ¤ und ¤ ¤ ¾ì ¹ ç ¤ Ï¡ ¢ cache.xml ¤ Ë¡Ögemcached¡×Region ¤ ÎÄêµÁ ¤ ò ¤ ¹ ¤ ë ¤ ³ ¤ È ¤ Ë
¤ Ê ¤ ë ¤ Ç ¤ · ¤ ç ¤ ¦ ¡£

Îã ¤ ¨ ¤ С ¢ ¤ ³ ¤ ó ¤ Ê ´ ¶ ¤ ¸ ¤ Ë¡£

<?xml version="1.0" encoding="UTF-8"?>
<cache
        xmlns="http://geode.apache.org/schema/cache"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://geode.apache.org/schema/cache http://geode.apache.org/schema/cache/cache-1.0.xsd"
        version="1.0">
    <region name="gemcached" refid="PARTITION_REDUNDANT"/>
</cache>

Æà ¤ ËÀßÄê ¥ Õ ¥ ¡ ¥ ¤ ¥ ë ¤ òÍ¿ ¤ ¨ ¤ ëÊýË¡ ¤ zu ¤ Ê ¤ ¤ ¤ Î ¤ Ç¡ ¢ ¡Öcache.xml¡× ¤ Î ¥ Õ ¥ ¡ ¥ ¤ ¥ ë̾ ¤ ò »ØÄê ¤ µ ¤» ¤ ë ¤ Ë ¤ Ï ¥ · ¥ ¹ ¥ Æ ¥ à ¥ × ¥ í ¥ Ñ ¥ Æ ¥ £ ¤ ò
»È ¤ ¦ ¤ ³ ¤ È ¤ Ë ¤ Ê ¤ ê ¤ Þ ¤ ¹ ¤ Í ¤ §¡Ä¡£

¡Ögemcached¡×Region ¤ Ë¡ ¢ ¥ Ç¡¼ ¥ und ¤ ¬Æþ ¤ à ¤ Æ ¤ ¤ ¤ ë ¤ ³ ¤ È ¤ ò³Îǧ ¤ · ¤ Æ ¤ ß ¤ Þ ¤ · ¤ ç ¤ ¦ ¡£

    @Test
    public void underlyingRegion() throws IOException, InterruptedException, ExecutionException {
        GemFireMemcachedServer memcachedServer =
                new GemFireMemcachedServer("localhost", 11211, GemFireMemcachedServer.Protocol.ASCII);
        memcachedServer.start();

        MemcachedClient client = new MemcachedClient(new InetSocketAddress("localhost", 11211));

        try {
            client.set("key1", 3, "value1").get();  // Future
            assertThat(client.get("key1")).isEqualTo("value1");

            Cache cache = CacheFactory.getAnyInstance();
            Region<String, ValueWrapper> region = cache.getRegion("gemcached");
            assertThat(new String(region.get("key1").getValue(), StandardCharsets.UTF_8))
                    .isEqualTo("value1");
        } finally {
            client.shutdown();
            memcachedServer.shutdown();
        }
    }

³Î ¤ «¤ Ë¡Ögemcached¡×Region ¤ Ë ¥ Ç¡¼ ¥ und ¤ ¬Æþ ¤ à ¤ Æ ¤ ¤ ¤ ë ¤ è ¤ ¦ ¤ Ç ¤ ¹ ¡£

Memcached¡ÊGemcached¡Ë ¤ Ë ¤ Ä ¤ ¤ ¤ Æ ¤ Ï¡ ¢ ¤ ³ ¤ ó ¤ Ê ´ ¶ ¤ ¸ ¤ Ç ¤ ¹ ¡£

Redis¡ÊRedis Adapter¡Ë

³ ¤ ¤ ¤ Æ¡ ¢ Redis Adapter ¤ Ø¡£

Redis Adapter ¤ ò »ÈÍÑ ¤ ¹ ¤ ë ¤ Ë ¤ Ï¡ ¢ °Í ¸´Ø ·¸ ¤ È ¤ · ¤ ÆSpring Shell ¤ ¬É¬Í× ¤ Ë ¤ Ê ¤ ê ¤ Þ ¤ ¹ ¡£ ¤ È ¤ ¤ ¤ ¦ ¤ ï ¤ ± ¤ Ç¡ ¢ °Í ¸´Ø ·¸ ¤ òÄɲà ¤ · ¤ Þ ¤ ¹ ¡£

        <!-- GeodeRedisServer only -->
        <dependency>
          <groupId>org.springframework.shell</groupId>
          <artifactId>spring-shell</artifactId>
          <version>1.2.0.RELEASE</version>
          <exclusions>
            <exclusion>
              <artifactId>cglib</artifactId>
              <groupId>*</groupId>
            </exclusion>
            <exclusion>
              <artifactId>asm</artifactId>
              <groupId>*</groupId>
            </exclusion>
            <exclusion>
              <artifactId>spring-aop</artifactId>
              <groupId>*</groupId>
            </exclusion>
            <exclusion>
              <artifactId>guava</artifactId>
              <groupId>*</groupId>
            </exclusion>
            <exclusion>
              <artifactId>aopalliance</artifactId>
              <groupId>*</groupId>
            </exclusion>
            <exclusion>
              <artifactId>spring-context-support</artifactId>
              <groupId>*</groupId>
            </exclusion>
          </exclusions>
        </dependency>

¤ ¤ ¤ í ¤ ¤ ¤ íexclude ¤ · ¤ Æ ¤ ¢ ¤ ë ¤ Î ¤ Ï¡ ¢ Apache Geode ¦ ¤ ÎÀßÄê ¤ der l ¤ Î ¤ Þ ¤ Þ ¤ ËÊï ¤ ¤ ¤ Þ ¤ · ¤ ¿¡£
https://github.com/apache/geode/blob/develop/geode-core/build.gradle#L110-L118

¥ Æ ¥ ¹ ¥ È ¥ ³¡¼ ¥ É ¤ ο÷·Á ¤ È ¤ · ¤ Æ ¤ Ï¡ ¢ ¤ ³ ¤ ó ¤ Ê ´ ¶ ¤ ¸ ¤ Ë¡£
src/test/java/org/littlewings/geode/embedded/EmbeddedRedisServerTest.java

package org.littlewings.geode.embedded;

import java.nio.charset.StandardCharsets;
import java.util.concurrent.TimeUnit;

import io.lettuce.core.RedisClient;
import io.lettuce.core.RedisCommandExecutionException;
import io.lettuce.core.RedisConnectionException;
import io.lettuce.core.SetArgs;
import io.lettuce.core.api.StatefulRedisConnection;
import io.lettuce.core.api.sync.RedisCommands;
import org.apache.geode.cache.Cache;
import org.apache.geode.cache.CacheFactory;
import org.apache.geode.cache.Region;
import org.apache.geode.redis.GeodeRedisServer;
import org.apache.geode.redis.internal.ByteArrayWrapper;
import org.junit.jupiter.api.Test;

import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatThrownBy;

public class EmbeddedRedisServerTest {
    // ¤³¤³¤Ë¡¢¥Æ¥¹¥È¤ò½ñ¤¯¡ª
}

Redis ¤ Ø ¤ Î ¥ ¢ ¥ ¯ ¥ »¥ ¹ ¤ Ë ¤ Ï¡ ¢ Lettuce ¤ ò» ÈÍÑ ¤ · ¤ Þ ¤ ¹ ¡£

Lettuce

Redis Adapter ¤ òÁÈ ¤ ß ¹ þ ¤ ß ¤ È ¤ · ¤ Æ »È ¤ à ¤ und ¥ ³¡¼ ¥ É ¤ Ï¡ ¢ ¤ ³ ¤ ó ¤ Ê ´ ¶ ¤ ¸ ¤ Ë ¤ Ê ¤ ê ¤ Þ ¤ ¹ ¡£

    @Test
    public void gettingStarted() throws InterruptedException {
        GeodeRedisServer redisServer = new GeodeRedisServer("localhost", 6379);
        redisServer.start();

        RedisClient redisClient = RedisClient.create("redis://@localhost:6379/0");
        StatefulRedisConnection<String, String> connection = redisClient.connect();

        try {
            RedisCommands<String, String> syncCommands = connection.sync();

            syncCommands.set("key1", "value1");
            assertThat(syncCommands.get("key1")).isEqualTo("value1");

            syncCommands.set("key2", "value2,", SetArgs.Builder.ex(3));
            TimeUnit.SECONDS.sleep(5L);
            assertThat(syncCommands.get("key2")).isNull();
        } finally {
            connection.close();
            redisClient.shutdown();
            redisServer.shutdown();
        }
    }

¢ ¨StatefulRedisConnection ¤ Î ¤ ßCloseable ¤ Ê ¤ Î ¤ Ç ¤ ¹ ¤ ¬¡ ¢ ¾ ¤ Î ¥ ¯ ¥ é ¥ ¹ ¤ È ¹ ç ¤ ï ¤ »¤ ¿·Á ¤ ǽñ ¤ ¤ Þ ¤ · ¤ ¿¡Ä

Gemcached ¤ È »÷ ¤ und ´ ¶ ¤ ¸ ¤ Ç ¤ ¹ ¤ Í¡£GeodeRedisServer ¤ È ¤ ¤ ¤ ¦ ¥ ¯ ¥ é ¥ ¹ ¤ ò» ÈÍÑ ¤ · ¤ Þ ¤ ¹ ¡£

        GeodeRedisServer redisServer = new GeodeRedisServer("localhost", 6379);
        redisServer.start();

¥ ³ ¥ ó ¥ ¹ ¥ È ¥ é ¥ ¯ ¥ und ¤ Ë ¤ Ï¡ ¢ ¥ ê ¥ à ¥ ¹ ¥ ó ¥ Ý¡¼ ¥ È ¤ Î ¤ ß¡ ¢ ¥ Ð ¥ ¤ ¥ ó ¥ É ¤ ¹ ¤ ë ¥ ¢ ¥ É ¥ ì ¥ ¹ ¤ È ¥ Ý¡¼ ¥ È¡ ¢ ¥ Ð ¥ ¤ ¥ ó ¥ É ¤ ¹ ¤ ë ¥ ¢ ¥ É ¥ ì ¥ ¹ ¤ È ¥ Ý¡¼ ¥ È ¤ ˲à ¤ ¨ ¤ Æ ¥ í ¥ ° ¥ ì ¥ Ù ¥ ë ¤ ò »ØÄê ¤ Ç ¤ ¤ ë¡ ¢
3 ¤ Ä ¤ Î ¥ ³ ¥ ó ¥ ¹ ¥ È ¥ é ¥ ¯ ¥ und ¤ zu ¤ ¢ ¤ ê ¤ Þ ¤ ¹ ¡£
https://github.com/apache/geode/blob/develop/geode-core/src/main/java/org/apache/geode/redis/GeodeRedisServer.java#L301-L364

º£²ó ¤ Ï¡ ¢ ¥ Ð ¥ ¤ ¥ ó ¥ É ¤ ¹ ¤ ë ¥ ¢ ¥ É ¥ ì ¥ ¹ ¤ È ¥ Ý¡¼ ¥ È ¤ ò »ØÄê¡£ ¤ der l ¤ · ¤ Æ¡ ¢ GeodeRedisServer#start ¤ ò¸Æ ¤ ӽР¤ · ¤ Þ ¤ ¹ ¡£

        GeodeRedisServer redisServer = new GeodeRedisServer("localhost", 6379);
        redisServer.start();

¥ Ý¡¼ ¥ È ¤ Ë ¤ Ä ¤ ¤ ¤ Æ ¤ ÏÉé ¤ ÎÃÍ ¤ ò »ØÄê ¤ ¹ ¤ ë ¤ È¡ ¢ ¥ Ç ¥ Õ ¥ © ¥ ë ¥ È ¤ Î ¥ Ý¡¼ ¥ È ¤ È ¤ · ¤ Æ6379 ¤ ò¼è ¤ ê ¤ Þ ¤ ¹ ¡£
https://github.com/apache/geode/blob/develop/geode-core/src/main/java/org/apache/geode/redis/GeodeRedisServer.java#L156

ÍøÍÑ ¤ ¬½ª ¤ ï ¤ à ¤ und ¤ é¡ ¢ GeodeRedisServer#shutdown ¤ ò¸Æ ¤ ӽР¤ · ¤ Þ ¤ ¹ ¡£

            redisServer.shutdown();

¥ ¢ ¥ ¯ ¥ »¥ ¹ M« ÂÎ ¤ Ï¡ ¢ Lettuce ¤ ò »È ¤ à ¤ ƳÎǧ¡£ ¤ ³ ¤ Á ¤ é ¤ âexpire ¤ Ê ¤ É ¤ ÏÎÉ ¤ µ ¤ der l ¤ ¦ ¤ Ç ¤ ¹ ¤ Í¡£

        RedisClient redisClient = RedisClient.create("redis://@localhost:6379/0");
        StatefulRedisConnection<String, String> connection = redisClient.connect();

        try {
            RedisCommands<String, String> syncCommands = connection.sync();

            syncCommands.set("key1", "value1");
            assertThat(syncCommands.get("key1")).isEqualTo("value1");

            syncCommands.set("key2", "value2,", SetArgs.Builder.ex(3));
            TimeUnit.SECONDS.sleep(5L);
            assertThat(syncCommands.get("key2")).isNull();
        } finally {
            connection.close();
            redisClient.shutdown();
            redisServer.shutdown();
        }

GeodeRedisServer ¤ ËÊݸ ¤ µ ¤ ì ¤ und ¥ Ç¡¼ ¥ und ¤ Ï¡ ¢ ¤ ³ ¤ Á ¤ é ¤ âÆâÉôŪ ¤ Ë ¤ ÏRegion ¤ È ¤ · ¤ ÆÊÝ »ý ¤ µ ¤ ì ¤ Þ ¤ ¹ ¤ ¬¡ ¢ ¤ ¤ ¤ ¯ ¤ Ä ¤« ¼ïÎà ¤ zu ¤ ¢ ¤ ê ¤ Þ ¤ ¹ ¡£

¤ È ¤ ê ¤ ¢ ¤ ¨ ¤ º¡ ¢ String ¤ È ¤ · ¤ ÆÊݸ ¤ µ ¤ ì ¤ ëRegion ¤ ò³Îǧ ¤ · ¤ Æ ¤ ß ¤ Þ ¤ · ¤ ç ¤ ¦ ¡£

    @Test
    public void underlyging() throws InterruptedException {
        GeodeRedisServer redisServer = new GeodeRedisServer("localhost", 6379);
        redisServer.start();

        RedisClient redisClient = RedisClient.create("redis://@localhost:6379/0");
        StatefulRedisConnection<String, String> connection = redisClient.connect();

        try {
            RedisCommands<String, String> syncCommands = connection.sync();

            syncCommands.set("key1", "value1");
            assertThat(syncCommands.get("key1")).isEqualTo("value1");

            syncCommands.set("key2", "value2", SetArgs.Builder.ex(3));
            assertThat(syncCommands.get("key2")).isEqualTo("value2");

            Cache cache = CacheFactory.getAnyInstance();
            Region<ByteArrayWrapper, ByteArrayWrapper> stringsRegion = cache.getRegion("ReDiS_StRiNgS");
            assertThat(stringsRegion.get(new ByteArrayWrapper("key1".getBytes(StandardCharsets.UTF_8))))
                    .isEqualTo(new ByteArrayWrapper("value1".getBytes(StandardCharsets.UTF_8)));
            assertThat(stringsRegion.get(new ByteArrayWrapper("key2".getBytes(StandardCharsets.UTF_8))))
                    .isEqualTo(new ByteArrayWrapper("value2".getBytes(StandardCharsets.UTF_8)));
        } finally {
            connection.close();
            redisClient.shutdown();
            redisServer.shutdown();
        }
    }

¡ÖReDiS_StRiNgS¡× ¤ È ¤ ¤ ¤ ¦ Region ¤ Ë¡ ¢ ¥ Ç¡¼ ¥ und ¤ ¬Êݸ ¤ µ ¤ ì ¤ Æ ¤ ¤ ¤ Þ ¤ ¹ ¡£

Region ¤ ÏString¡ ¢ HyperLogLogs¡ ¢ ¥ á ¥ und ¥ Ç¡¼ ¥ und ¤ Î3¼ïÎà ¤ ò »ÈÍÑ ¤ · ¤ Þ ¤ ¹ ¡£

String ¤ ÈHyperLogLogsÍÑ ¤ ÎRegion ¤ Ï¡ ¢ ¥ Ç ¥ Õ ¥ © ¥ ë ¥ È ¤ ÇPartition Region ¤ È ¤ Ê ¤ ê ¤ Þ ¤ ¹ ¡£
https://github.com/apache/geode/blob/develop/geode-core/src/main/java/org/apache/geode/redis/GeodeRedisServer.java#L270

ÊÑ ¹¹ ¤ · ¤ und ¤ ¤ ¾ì ¹ ç ¤ Ï¡ ¢ ¥ · ¥ ¹ ¥ Æ ¥ à ¥ × ¥ í ¥ Ñ ¥ Æ ¥ nÖgemfireredis.regiontypen× ¤ Ç »ØÄê ¤ ¹ ¤ ë ¤« ¡ ¢ ¤ ¢ ¤ é ¤ «¤ ¸ ¤ áRegion ¤ òÄêµÁ ¤ · ¤ Æ ¤ ª ¤ ¤ Þ ¤ · ¤ ç ¤ ¦ ¡£
https://github.com/apache/geode/blob/develop/geode-core/src/main/java/org/apache/geode/redis/GeodeRedisServer.java#L425-L434

¥ á ¥ und ¥ Ç¡¼ ¥ ¿ÍÑ ¤ ÎRegion ¤ Ï¡ ¢ ¥ Ç ¥ Õ ¥ © ¥ ë ¥ È ¤ ÇReplicate Region ¤ È ¤ Ê ¤ ê ¤ Þ ¤ ¹ ¡£
https://github.com/apache/geode/blob/develop/geode-core/src/main/java/org/apache/geode/redis/GeodeRedisServer.java#L435-L442

¤ ³ ¤ Á ¤ é ¤ â¡ ¢ ÊÑ ¹¹ ¤ · ¤ und ¤ ¤ ¾ì ¹ ç ¤ Ï ¤ ¢ ¤ é ¤ «¤ ¸ ¤ áRegion ¤ òÄêµÁ ¤ · ¤ Æ ¤ ª ¤ ¤ Þ ¤ · ¤ ç ¤ ¦ ¡£

¤ der l ¤ ì ¤ ¾ ¤ ì ¤ ÎRegion ¤ Î̾Á° ¤ Ï¡ ¢ ¤ ± ¤ à ¤ ³ ¤ ¦ ¤ ¹ ¤ ´ ¤ ¤ ¤ ³ ¤ È ¤ Ë ¤ Ê ¤ à ¤ Æ ¤ ¤ ¤ Þ ¤ ¹ ¤ ¬¡Ä ¥ ½¡¼ ¥ ¹ ¥ ³¡¼ ¥ É ¤ ò ¸«¤ Þ ¤ · ¤ ç ¤ ¦ ¡£
https://github.com/apache/geode/blob/develop/geode-core/src/main/java/org/apache/geode/redis/GeodeRedisServer.java#L223-L239

Gemcached ¤ ÈƱÍÍ¡ ¢ GeodeRedisServer ¤ ËCacheXML¼ «ÂÎ ¤ ò» ØÄê ¤ ¹ ¤ ë¼êÃÊ ¤ Ï ¤ Ê ¤ µ ¤ der l ¤ ¦ ¤ Ê ¤ Î ¤ Ç¡ ¢ CacheXML̾ ¤ òÊÑ ¤ ¨ ¤ und ¤ ¤ ¾ì ¹ ç ¤ Ï ¥ · ¥ ¹ ¥ Æ ¥ à ¥ × ¥ í ¥ Ñ ¥ Æ ¥ £ ¤ ò
»È ¤ ¦ ¤ ³ ¤ È ¤ Ë ¤ Ê ¤ ê ¤ Þ ¤ ¹ ¤ Í¡£

Ãí°ÕÅÀ

¤ È ¤ Þ ¤ ¢ ¡ ¢ ¤ ³ ¤ ó ¤ Ê ´ ¶ ¤ ¸ ¤ Ë »È ¤ ¨ ¤ der l ¤ ¦ ¤ ÊRedis Adapter ¤ Ç ¤ ¹ ¤ ¬¡ ¢ Ãí°ÕÅÀ ¤ â ¤ ¢ ¤ ë ¤ è ¤ ¦ ¤ Ç ¤ ¹ ¡£

How the Redis Adapter Works

¥ µ ¥ Ý¡¼ ¥ È ¤ · ¤ Æ ¤ ¤ ¤ ëRedis ¤ Î ¥ ³ ¥ Þ ¥ ó ¥ É ¤ Ï¡ ¢ GeodeRedisServer ¤ ÎJavadoc ¤ ò³Îǧ ¤ · ¤ Þ ¤ · ¤ ç ¤ ¦ ¡£

GeodeRedisServer (Apache Geode 1.6.0)

¤ È ¤ Ï ¤ ¤ ¤ ¨¡ ¢ ¥ É ¥ ¥ å ¥ á ¥ ó ¥ È ¤ Ë

The Geode Redis Adapter supports all Redis commands for each of the Redis data structures. (See the Javadocs for the GemFireRedisServer class for a detailed list.)

http://geode.apache.org/docs/guide/12/tools_modules/redis_adapter.html#how-the-redis-adapter-wo

¤ È ¤ ¢ ¤ ë ¤ Î ¤ Ç¡ ¢ ¤ Õ ¤ Ä ¤ ¦ ¤ Ë »È ¤ ¦ ʬ ¤ Ë ¤ Ϻ ¤ ¤ é ¤ Ê ¤ ¤ ¤ Î ¤ Ç ¤ Ï ¤ Ê ¤ ¤ ¤« ¤ È¡£

¤ und ¤ À¡ ¢ ¤ ¤ ¤ ¯ ¤ Ä ¤ «Redis ¤ È°Û ¤ Ê ¤ 뿶 ¤ ëÉñ ¤ ¤ ¤ ò ¤ ¹ ¤ ë ¥ ±¡¼ ¥ ¹ ¤ zu ¤ ¢ ¤ ë ¤ è ¤ ¦ ¤ Ç ¤ ¹ ¡£

  • ¥ ¡¼ ¤ òºï½ü ¤ · ¤ ¿ºÝ ¤ ËÊÖ ¤ à ¤ Æ ¤ ¯ ¤ ëºï½ü ¤ µ ¤ ì ¤ und ¥ ¨ ¥ ó ¥ È ¥ ê¿ô ¤ Ï¡ ¢ ¥ í¡¼ ¥ «¥ ëNode ¤ Ç ¤ οô¡Ê ¥ ¯ ¥ é ¥ ¹ ¥ ¿Á´ÂÎ ¤ Ç ¤ Ï ¤ Ê ¤ ¤ ¡Ë¡£ ¤ und ¤ À ¤ ·¡ ¢ ¥ ¨ ¥ ó ¥ È ¥ ê ¤ Ϻï½ü ¤ µ ¤ ì ¤ Æ ¤ ¤ ¤ ë
  • Set ¤ Ë¿· ¤ · ¤ ¤ ¥ á ¥ ó ¥ Ð¡¼ ¤ òÄɲà ¤ · ¤ ¿ºÝ ¤ ÎÌá ¤ êÃÍ ¤ ¬¡ ¢ ÉÔÄê ¤ Ë ¤ Ê ¤ ë¡£ ¥ ³ ¥ Þ ¥ ó ¥ É¼ «ÂÎ ¤ ÏRedis ¥ × ¥ í ¥ È ¥ ³ ¥ ë ¤ ÈƱÍÍ ¤ ËÆ° ¤ ¯ ¤ ¬¡ ¢ Ìá ¤ à ¤ Æ ¤ ¯ ¤ ë¿ô ¤ ÏÀßÄê ¤ · ¤ ¿·ë²Ì ¤ ¬È¿±Ç ¤ µ ¤ ì ¤ Æ ¤ ¤ ¤ ë ¤ È ¤ ϸ ¤ é ¤ Ê ¤ ¤
  • ¥ È ¥ é ¥ ó ¥ ¶ ¥ ¯ ¥ · ¥ ç ¥ ó ¤ Ï¡ ¢ ¥ í¡¼ ¥ «¥ ëNode ¤ ˼ý ¤ Þ ¤ ëÈÏ°Ï ¤ Ǽ ¹ Ô ¤ ¹ ¤ ëɬÍ× ¤ zu ¤ ¢ ¤ ë¡ÊNode ¤ ò ¤ Þ ¤ und ¤ zu ¤ ë¾ì ¹ ç ¤ ÏNG¡ ¢ ¤ Þ ¤ und ¥ È ¥ é ¥ ó ¥ ¶ ¥ ¯ ¥ · ¥ ç ¥ ó ¤ ¬Í¸ú ¤ Ë ¤ Ê ¤ à ¤ Æ ¤ ¤ ¤ Ê ¤ ¤ ±Ê ³ ° èÆâ ¤ Ë ¤ ¢ ¤ ë ¥ Ç¡¼ ¥ und ¤ ËÂÐ ¤ · ¤ Æ ¤ â¡ ¢ ¥ È ¥ é ¥ ó ¥ ¶ ¥ ¯ ¥ · ¥ ç ¥ ó ¤ Ï¼Â ¹ Ô ¤ Ç ¤ ¤ Ê ¤ ¤ ¡Ë
  • ¥ Ç ¥ Õ ¥ © ¥ ë ¥ È ¤ ÇApache Geode ¤ Î ¥ È ¥ é ¥ ó ¥ ¶ ¥ ¯ ¥ · ¥ ç ¥ óÆâ ¤ Î ¥ ¡¼ ¤ ò ¤ ¹ ¤ Ù ¤ Æ´Æ »ë ¤ ¹ ¤ ë ¤ und ¤ á¡ ¢ ¥ ¡¼ ¤ òWATCH ¤ Þ ¤ und ¤ ÏUNWATCH ¤ ¹ ¤ ë ¤ ³ ¤ È ¤ zu ¤ Ç ¤ ¤ Ê ¤ ¤

Set ¤ ÈWATCH¡¿UNWATCH°Ê ³° ¤ Ë ¤ Ä ¤ ¤ ¤ Æ ¤ Ï¡ ¢ Node ¤ ò ¤ Þ ¤ und ¤ zu ¤ à ¤ ¿¾ì ¹ ç ¤ ËRedis ¤ ÈÆ° ¤ ¤ ¬°Û ¤ Ê ¤ ë ´ ¶ ¤ ¸ ¤ Ë ¤ Ê ¤ ë ¤ ß ¤ und ¤ ¤ ¤ Ç ¤ ¹ ¤ Í¡£
¤ ³ ¤ Î ¤ ¢ ¤ und ¤ ê ¤ ¬µöÍÆ ¤ Ç ¤ ¤ ë ¤ Î ¤ Ç ¤ ¢ ¤ ì ¤ С ¢ Redis Adapter ¤ òRedis ¤ ÎÂå ¤ ï ¤ ê ¤ È ¤ · ¤ Æ »È ¤ ¨ ¤ ë ¤ Î ¤ Ç ¤ · ¤ ç ¤ ¦ ¡£

°ì½ï ¤ Ë »È ¤ ¦

¤ Ç¡ ¢ ¤ ³ ¤ ³ ¤ Þ ¤ ǽñ ¤ ¤ ¤ Æ ¤ ¤ ¤ ë ¤ È¡ ¢ Gemcached ¤ ÈRedis Adapter ¤ ÏÊÌ¡ ¹ ¤ Ë »È ¤ ¦ ¤ ³ ¤ È ¤ Ë ¤ Ê ¤ ë ¤ È ¤ ¤ ¤ ¦ ¤« ¡ ¢ Ʊ »þ ¤ Ë» ÈÍÑ ¤ Ç ¤ ¤ Ê ¤ ¤ ¡ © ¤ È ¤ ¤ ¤ ¦ ¤ è ¤ ¦ ¤ ʵ ¤ ¤ â ¤ · ¤ Þ ¤ ¹ ¤ zu
¡ÊξÊý ¤ È ¤ â¡ ¢ Server#start ¤ · ¤ Þ ¤ ¹ ¤ ·¡Ë¡ ¢ ¤ der l ¤ ó ¤ Ê ¤ ³ ¤ È ¤ Ï ¤ Ê ¤ µ ¤ der l ¤ ¦ ¤ Ç ¤ ¹ ¡£

ξÊý ¹ ç ¤ ï ¤ »¤ Æ» È ¤ à ¤ Æ ¤ ß ¤ Þ ¤ · ¤ ¿¡£
src/test/java/org/littlewings/geode/embedded/EmbeddedMemcachedRedisServerTest.java

package org.littlewings.geode.embedded;

import java.io.IOException;
import java.net.InetSocketAddress;
import java.util.concurrent.ExecutionException;

import io.lettuce.core.RedisClient;
import io.lettuce.core.api.StatefulRedisConnection;
import io.lettuce.core.api.sync.RedisCommands;
import net.spy.memcached.MemcachedClient;
import org.apache.geode.memcached.GemFireMemcachedServer;
import org.apache.geode.redis.GeodeRedisServer;
import org.junit.jupiter.api.Test;

import static org.assertj.core.api.Assertions.assertThat;

public class EmbeddedMemcachedRedisServerTest {
    @Test
    public void mixedServer() throws IOException, ExecutionException, InterruptedException {
        GemFireMemcachedServer memcachedServer =
                new GemFireMemcachedServer("localhost", 11211, GemFireMemcachedServer.Protocol.ASCII);
        memcachedServer.start();

        GeodeRedisServer redisServer = new GeodeRedisServer("localhost", 6379);
        redisServer.start();

        MemcachedClient memcachedClient = new MemcachedClient(new InetSocketAddress("localhost", 11211));
        RedisClient redisClient = RedisClient.create("redis://@localhost:6379/0");
        StatefulRedisConnection<String, String> connection = redisClient.connect();

        try {
            memcachedClient.set("key1", 3, "value1").get();  // Future
            assertThat(memcachedClient.get("key1")).isEqualTo("value1");

            RedisCommands<String, String> syncCommands = connection.sync();

            syncCommands.set("key1", "value1");
            assertThat(syncCommands.get("key1")).isEqualTo("value1");
        } finally {
            redisClient.shutdown();
            memcachedClient.shutdown();
            redisClient.shutdown();
            memcachedServer.shutdown();
        }
    }
}

¤ É ¤ Á ¤ é ¤ ÎServer ¤ â¡ ¢ Apache Geode ¤ ÎCache ¤ zu ¤ Ê ¤ ± ¤ ì ¤ кîÀ® ¤ ·¡ ¢ ¤ ¢ ¤ ì ¤ Ð ¤ der l ¤ Á ¤ é ¤ ò »ÈÍÑ ¤ ¹ ¤ ë ¤ è ¤ ¦ ¤ ˼ÂÁõ ¤ µ ¤ ì ¤ Æ ¤ ¤ ¤ ë ¤« ¤ é ¤ Ç ¤ ¹ ¡£
https://167-L171
https://github.com/apache/geode/blob/develop/geode-core/src/main/java/org/apache/geode/redis/GeodeRedisServer.java#L401-L412

Apache Geode¼ «ÂÎ ¤ Ï¡ ¢ ¤ Ò ¤ È ¤ Ä ¤ ÎJavaVM¾å ¤ ÇÊ£¿ô ¤ ÎCache ¤ òºîÀ® ¤ ¹ ¤ ë ¤ ³ ¤ È ¤ ϵöÍÆ ¤ · ¤ Æ ¤ ¤ ¤ Þ ¤» ¤ ó¡£

¤ Ê ¤ Î ¤ Ç¡ ¢ ¤ ³ ¤ ¦ ¤ ¤ ¤ ¦ ¼ÂÁõ ¤ Ë ¤ Ê ¤ à ¤ Æ ¤ ¤ ¤ ì ¤ Ð ¤ ¦ ¤ Þ ¤ ¯ ¤ ¤ ¤ ¤ Þ ¤ ¹ ¤ è ¤ Í¡ ¢ ¤ È¡£

¤ Þ ¤ È ¤ á

Apache Geode ¤ ¬Äó¶¡ ¤ ¹ ¤ ë¡ ¢ Memcached ¤ ª ¤ è ¤ ÓRedis ¤ ÎServer ¤ È ¤ · ¤ Æ ¤ ε¡Ç½ ¤ ò¡ ¢ Java ¥ ¢ ¥ × ¥ ê ¥ ±¡¼ ¥ · ¥ ç ¥ ó ¤ ËÁÈ ¤ ß ¹ þ ¤ ó ¤ Ç »È ¤ à ¤ Æ ¤ ß ¤ Þ ¤ · ¤ ¿¡£

ÆâÉô ¤ Î ¥ ³¡¼ ¥ É ¤ ⾯ ¤ ·ÄÉ ¤ ¤ ¤ Ä ¤ Ä¡ ¢ ³Æ ¥ ¯ ¥ é ¥ ¤ ¥ ¢ ¥ ó ¥ È ¥ é ¥ ¤ ¥ Ö ¥ é ¥ ê ¤ dzÎǧ ¤ Ç ¤ ¤ und ¤ Î ¤ Ç¡ ¢ ¤ Þ ¤ ¢ ÎÉ ¤ · ¤ È ¤ · ¤ Þ ¤ · ¤ ç ¤ ¦ ¡£

¤ ³ ¤ ¦ ¤ ä ¤ à ¤ ÆÁÈ ¤ ß ¹ þ ¤ ó ¤ Ç »È ¤ ¨ ¤ ë ¤ Î ¤ ÏÊØÍø ¤ Ç ¤ ¹ ¤ ¬¡ ¢ ¤ Á ¤ ç ¤ à ¤ Ȱ͸ ¥ é ¥ ¤ ¥ Ö ¥ é ¥ ê ¤ ¬Â¿ ¤ ¤ ¤ Î ¤ ¬ÆñÅÀ ¤ Ç ¤ · ¤ ç ¤ ¦ ¤« ¤ Í ¤ §¡Ä¡£

## ¡Ömvn depencency:tree¡×¤ÎApache Geode¡ÜSpring Shell¤ÎÉôʬ¤Î·ë²Ì
[INFO] +- org.apache.geode:geode-core:jar:1.2.1:compile
[INFO] |  +- com.github.stephenc.findbugs:findbugs-annotations:jar:1.3.9-1:compile
[INFO] |  +- org.jgroups:jgroups:jar:3.6.10.Final:compile
[INFO] |  +- antlr:antlr:jar:2.7.7:compile
[INFO] |  +- com.fasterxml.jackson.core:jackson-annotations:jar:2.8.6:compile
[INFO] |  +- com.fasterxml.jackson.core:jackson-databind:jar:2.8.6:compile
[INFO] |  |  \- com.fasterxml.jackson.core:jackson-core:jar:2.8.6:compile
[INFO] |  +- commons-io:commons-io:jar:2.5:compile
[INFO] |  +- commons-lang:commons-lang:jar:2.6:compile
[INFO] |  +- it.unimi.dsi:fastutil:jar:7.1.0:compile
[INFO] |  +- javax.resource:javax.resource-api:jar:1.7:compile
[INFO] |  |  \- javax.transaction:javax.transaction-api:jar:1.2:compile
[INFO] |  +- net.java.dev.jna:jna:jar:4.0.0:compile
[INFO] |  +- net.sf.jopt-simple:jopt-simple:jar:5.0.3:compile
[INFO] |  +- org.apache.logging.log4j:log4j-api:jar:2.7:compile
[INFO] |  +- org.apache.logging.log4j:log4j-core:jar:2.7:compile
[INFO] |  +- org.apache.shiro:shiro-core:jar:1.3.2:compile
[INFO] |  |  \- org.slf4j:slf4j-api:jar:1.6.4:compile
[INFO] |  +- commons-beanutils:commons-beanutils:jar:1.9.3:compile
[INFO] |  |  +- commons-logging:commons-logging:jar:1.2:compile
[INFO] |  |  \- commons-collections:commons-collections:jar:3.2.2:compile
[INFO] |  +- io.github.lukehutch:fast-classpath-scanner:jar:2.0.11:compile
[INFO] |  +- org.apache.geode:geode-common:jar:1.2.1:compile
[INFO] |  \- org.apache.geode:geode-json:jar:1.2.1:compile
[INFO] +- org.springframework.shell:spring-shell:jar:1.2.0.RELEASE:compile
[INFO] |  +- jline:jline:jar:2.12:compile
[INFO] |  \- org.springframework:spring-core:jar:4.2.4.RELEASE:compile

¥ ¹ ¥ Ñ ¥ àÂкö ¤ Î ¤ und ¤ á ¤ Î ¥ À ¥ ß¡¼ ¤ Ç ¤ ¹ ¡£ ¤ â ¤ · ¸ «¤ ¨ ¤ Æ ¤ ⲿ ¤ âÆþÎÏ ¤ · ¤ Ê ¤ ¤ ¤ Ç ¤ ¯ ¤ À ¤ µ ¤ ¤
¥²¥¹¥È


²èÁüÇ § ¾ Ú

¥ È ¥ é ¥ Ã ¥ ¯ ¥ Ð ¥ Ã ¥ ¯ - http://d.hatena.ne.jp/Kazuhira/20171001/1506866676