`
jianFengGong
  • 浏览: 20488 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

readis windows servrer 搭建与Java客户端的连接

    博客分类:
  • JAVA
阅读更多
1:首先下载redis:redis-2.0.2.zip (32 bit),解压。
从下面地址下:http://code.google.com/p/servicestack/wiki/RedisWindowsDownload,看到下面有redis-2.0.2.zip (32 bit),就是他了,下载完成后,解压到D:\redis-2.0.2.
2:创建redis.conf文件:
这是一个配置文件,指定了redis的监听端口,timeout等。如下面有:port 6379。
把下面内容COPY到一新建文件中,取名redis.conf,再保存到redis-2.0.2目录下:


# Redis configuration file example

# By default Redis does not run as a daemon. Use 'yes' if you need it.
# Note that Redis will write a pid file in /var/run/redis.pid when daemonized.
daemonize no

# When run as a daemon, Redis write a pid file in /var/run/redis.pid by default.
# You can specify a custom pid file location here.
pidfile /var/run/redis.pid

# Accept connections on the specified port, default is 6379
port 6379

# If you want you can bind a single interface, if the bind option is not
# specified all the interfaces will listen for connections.
#
# bind 127.0.0.1

# Close the connection after a client is idle for N seconds (0 to disable)
timeout 300

# Set server verbosity to 'debug'
# it can be one of:
# debug (a lot of information, useful for development/testing)
# notice (moderately verbose, what you want in production probably)
# warning (only very important / critical messages are logged)
loglevel debug

# Specify the log file name. Also 'stdout' can be used to force
# the demon to log on the standard output. Note that if you use standard
# output for logging but daemonize, logs will be sent to /dev/null
logfile stdout

# Set the number of databases. The default database is DB 0, you can select
# a different one on a per-connection basis using SELECT <dbid> where
# dbid is a number between 0 and 'databases'-1
databases 16

################################ SNAPSHOTTING  #################################
#
# Save the DB on disk:
#
#   save <seconds> <changes>
#
#   Will save the DB if both the given number of seconds and the given
#   number of write operations against the DB occurred.
#
#   In the example below the behaviour will be to save:
#   after 900 sec (15 min) if at least 1 key changed
#   after 300 sec (5 min) if at least 10 keys changed
#   after 60 sec if at least 10000 keys changed
save 900 1
save 300 10
save 60 10000

# Compress string objects using LZF when dump .rdb databases?
# For default that's set to 'yes' as it's almost always a win.
# If you want to save some CPU in the saving child set it to 'no' but
# the dataset will likely be bigger if you have compressible values or keys.
rdbcompression yes

# The filename where to dump the DB
dbfilename dump.rdb

# For default save/load DB in/from the working directory
# Note that you must specify a directory not a file name.
dir ./

################################# REPLICATION #################################

# Master-Slave replication. Use slaveof to make a Redis instance a copy of
# another Redis server. Note that the configuration is local to the slave
# so for example it is possible to configure the slave to save the DB with a
# different interval, or to listen to another port, and so on.
#
# slaveof <masterip> <masterport>

# If the master is password protected (using the "requirepass" configuration
# directive below) it is possible to tell the slave to authenticate before
# starting the replication synchronization process, otherwise the master will
# refuse the slave request.
#
# masterauth <master-password>

################################## SECURITY ###################################

# Require clients to issue AUTH <PASSWORD> before processing any other
# commands.  This might be useful in environments in which you do not trust
# others with access to the host running redis-server.
#
# This should stay commented out for backward compatibility and because most
# people do not need auth (e.g. they run their own servers).
#
# requirepass foobared

################################### LIMITS ####################################

# Set the max number of connected clients at the same time. By default there
# is no limit, and it's up to the number of file descriptors the Redis process
# is able to open. The special value '0' means no limts.
# Once the limit is reached Redis will close all the new connections sending
# an error 'max number of clients reached'.
#
# maxclients 128

# Don't use more memory than the specified amount of bytes.
# When the memory limit is reached Redis will try to remove keys with an
# EXPIRE set. It will try to start freeing keys that are going to expire
# in little time and preserve keys with a longer time to live.
# Redis will also try to remove objects from free lists if possible.
#
# If all this fails, Redis will start to reply with errors to commands
# that will use more memory, like SET, LPUSH, and so on, and will continue
# to reply to most read-only commands like GET.
#
# WARNING: maxmemory can be a good idea mainly if you want to use Redis as a
# 'state' server or cache, not as a real DB. When Redis is used as a real
# database the memory usage will grow over the weeks, it will be obvious if
# it is going to use too much memory in the long run, and you'll have the time
# to upgrade. With maxmemory after the limit is reached you'll start to get
# errors for write operations, and this may even lead to DB inconsistency.
#
# maxmemory <bytes>

############################## APPEND ONLY MODE ###############################

# By default Redis asynchronously dumps the dataset on disk. If you can live
# with the idea that the latest records will be lost if something like a crash
# happens this is the preferred way to run Redis. If instead you care a lot
# about your data and don't want to that a single record can get lost you should
# enable the append only mode: when this mode is enabled Redis will append
# every write operation received in the file appendonly.log. This file will
# be read on startup in order to rebuild the full dataset in memory.
#
# Note that you can have both the async dumps and the append only file if you
# like (you have to comment the "save" statements above to disable the dumps).
# Still if append only mode is enabled Redis will load the data from the
# log file at startup ignoring the dump.rdb file.
#
# The name of the append only file is "appendonly.log"
#
# IMPORTANT: Check the BGREWRITEAOF to check how to rewrite the append
# log file in background when it gets too big.

appendonly no

# The fsync() call tells the Operating System to actually write data on disk
# instead to wait for more data in the output buffer. Some OS will really flush
# data on disk, some other OS will just try to do it ASAP.
#
# Redis supports three different modes:
#
# no: don't fsync, just let the OS flush the data when it wants. Faster.
# always: fsync after every write to the append only log . Slow, Safest.
# everysec: fsync only if one second passed since the last fsync. Compromise.
#
# The default is "always" that's the safer of the options. It's up to you to
# understand if you can relax this to "everysec" that will fsync every second
# or to "no" that will let the operating system flush the output buffer when
# it want, for better performances (but if you can live with the idea of
# some data loss consider the default persistence mode that's snapshotting).

appendfsync always
# appendfsync everysec
# appendfsync no

############################### ADVANCED CONFIG ###############################

# Glue small output buffers together in order to send small replies in a
# single TCP packet. Uses a bit more CPU but most of the times it is a win
# in terms of number of queries per second. Use 'yes' if unsure.
glueoutputbuf yes

# Use object sharing. Can save a lot of memory if you have many common
# string in your dataset, but performs lookups against the shared objects
# pool so it uses more CPU and can be a bit slower. Usually it's a good
# idea.
#
# When object sharing is enabled (shareobjects yes) you can use
# shareobjectspoolsize to control the size of the pool used in order to try
# object sharing. A bigger pool size will lead to better sharing capabilities.
# In general you want this value to be at least the double of the number of
# very common strings you have in your dataset.
#
# WARNING: object sharing is experimental, don't enable this feature
# in production before of Redis 1.0-stable. Still please try this feature in
# your development environment so that we can test it better.
# shareobjects no
# shareobjectspoolsize 1024

3:在cmd下面执行以下命令,指定它使用我们的redis.conf,同时也是启动,把redis运行起来,这里指定用redis.conf的配置运行服务器
D:\redis-2.0.2>redis-server.exe redis.conf

4:开一新DOS窗口cmd.执行以下命令,这是Redis的客户端程序:
redis-cli.exe -h 172.18.5.1 -p 6379
172.18.5.1是我本机IP地址,端口6379就是上面配置文件中指定的监听端口
执行完成后,应该能看到redis启动了,这时在第一个cmd窗口可以看到连接信息。

接下来就是Java客户端的连接了:
一、普通同步方式

最简单和基础的调用方式,

@Test
public void test1Normal() {
    Jedis jedis = new Jedis("localhost");
    long start = System.currentTimeMillis();
    for (int i = 0; i < 100000; i++) {
        String result = jedis.set("n" + i, "n" + i);
    }
    long end = System.currentTimeMillis();
    System.out.println("Simple SET: " + ((end - start)/1000.0) + " seconds");
    jedis.disconnect();
}

很简单吧,每次set之后都可以返回结果,标记是否成功。
二、事务方式(Transactions)

redis的事务很简单,他主要目的是保障,一个client发起的事务中的命令可以连续的执行,而中间不会插入其他client的命令。

看下面例子:

@Test
public void test2Trans() {
    Jedis jedis = new Jedis("localhost");
    long start = System.currentTimeMillis();
    Transaction tx = jedis.multi();
    for (int i = 0; i < 100000; i++) {
        tx.set("t" + i, "t" + i);
    }
    List<Object> results = tx.exec();
    long end = System.currentTimeMillis();
    System.out.println("Transaction SET: " + ((end - start)/1000.0) + " seconds");
    jedis.disconnect();
}

我们调用jedis.watch(…)方法来监控key,如果调用后key值发生变化,则整个事务会执行失败。另外,事务中某个操作失败,并不会回滚其他操作。这一点需要注意。还有,我们可以使用discard()方法来取消事务。
三、管道(Pipelining)

有时,我们需要采用异步方式,一次发送多个指令,不同步等待其返回结果。这样可以取得非常好的执行效率。这就是管道,调用方法如下:

@Test
public void test3Pipelined() {
    Jedis jedis = new Jedis("localhost");
    Pipeline pipeline = jedis.pipelined();
    long start = System.currentTimeMillis();
    for (int i = 0; i < 100000; i++) {
        pipeline.set("p" + i, "p" + i);
    }
    List<Object> results = pipeline.syncAndReturnAll();
    long end = System.currentTimeMillis();
    System.out.println("Pipelined SET: " + ((end - start)/1000.0) + " seconds");
    jedis.disconnect();
}

四、管道中调用事务

就Jedis提供的方法而言,是可以做到在管道中使用事务,其代码如下:

@Test
public void test4combPipelineTrans() {
    jedis = new Jedis("localhost");
    long start = System.currentTimeMillis();
    Pipeline pipeline = jedis.pipelined();
    pipeline.multi();
    for (int i = 0; i < 100000; i++) {
        pipeline.set("" + i, "" + i);
    }
    pipeline.exec();
    List<Object> results = pipeline.syncAndReturnAll();
    long end = System.currentTimeMillis();
    System.out.println("Pipelined transaction: " + ((end - start)/1000.0) + " seconds");
    jedis.disconnect();
}

但是经测试(见本文后续部分),发现其效率和单独使用事务差不多,甚至还略微差点。
五、分布式直连同步调用

@Test
public void test5shardNormal() {
    List<JedisShardInfo> shards = Arrays.asList(
            new JedisShardInfo("localhost",6379),
            new JedisShardInfo("localhost",6380));

    ShardedJedis sharding = new ShardedJedis(shards);

    long start = System.currentTimeMillis();
    for (int i = 0; i < 100000; i++) {
        String result = sharding.set("sn" + i, "n" + i);
    }
    long end = System.currentTimeMillis();
    System.out.println("Simple@Sharing SET: " + ((end - start)/1000.0) + " seconds");

    sharding.disconnect();
}

这个是分布式直接连接,并且是同步调用,每步执行都返回执行结果。类似地,还有异步管道调用。
六、分布式直连异步调用

@Test
public void test6shardpipelined() {
    List<JedisShardInfo> shards = Arrays.asList(
            new JedisShardInfo("localhost",6379),
            new JedisShardInfo("localhost",6380));

    ShardedJedis sharding = new ShardedJedis(shards);

    ShardedJedisPipeline pipeline = sharding.pipelined();
    long start = System.currentTimeMillis();
    for (int i = 0; i < 100000; i++) {
        pipeline.set("sp" + i, "p" + i);
    }
    List<Object> results = pipeline.syncAndReturnAll();
    long end = System.currentTimeMillis();
    System.out.println("Pipelined@Sharing SET: " + ((end - start)/1000.0) + " seconds");

    sharding.disconnect();
}

七、分布式连接池同步调用

如果,你的分布式调用代码是运行在线程中,那么上面两个直连调用方式就不合适了,因为直连方式是非线程安全的,这个时候,你就必须选择连接池调用。

@Test
public void test7shardSimplePool() {
    List<JedisShardInfo> shards = Arrays.asList(
            new JedisShardInfo("localhost",6379),
            new JedisShardInfo("localhost",6380));

    ShardedJedisPool pool = new ShardedJedisPool(new JedisPoolConfig(), shards);

    ShardedJedis one = pool.getResource();

    long start = System.currentTimeMillis();
    for (int i = 0; i < 100000; i++) {
        String result = one.set("spn" + i, "n" + i);
    }
    long end = System.currentTimeMillis();
    pool.returnResource(one);
    System.out.println("Simple@Pool SET: " + ((end - start)/1000.0) + " seconds");

    pool.destroy();
}

上面是同步方式,当然还有异步方式。
八、分布式连接池异步调用

@Test
public void test8shardPipelinedPool() {
    List<JedisShardInfo> shards = Arrays.asList(
            new JedisShardInfo("localhost",6379),
            new JedisShardInfo("localhost",6380));

    ShardedJedisPool pool = new ShardedJedisPool(new JedisPoolConfig(), shards);

    ShardedJedis one = pool.getResource();

    ShardedJedisPipeline pipeline = one.pipelined();

    long start = System.currentTimeMillis();
    for (int i = 0; i < 100000; i++) {
        pipeline.set("sppn" + i, "n" + i);
    }
    List<Object> results = pipeline.syncAndReturnAll();
    long end = System.currentTimeMillis();
    pool.returnResource(one);
    System.out.println("Pipelined@Pool SET: " + ((end - start)/1000.0) + " seconds");
    pool.destroy();
}

九、需要注意的地方

    事务和管道都是异步模式。在事务和管道中不能同步查询结果。比如下面两个调用,都是不允许的:

     Transaction tx = jedis.multi();
     for (int i = 0; i < 100000; i++) {
         tx.set("t" + i, "t" + i);
     }
     System.out.println(tx.get("t1000").get());  //不允许

     List<Object> results = tx.exec();

     …
     …

     Pipeline pipeline = jedis.pipelined();
     long start = System.currentTimeMillis();
     for (int i = 0; i < 100000; i++) {
         pipeline.set("p" + i, "p" + i);
     }
     System.out.println(pipeline.get("p1000").get()); //不允许

     List<Object> results = pipeline.syncAndReturnAll();

    事务和管道都是异步的,个人感觉,在管道中再进行事务调用,没有必要,不如直接进行事务模式。

    分布式中,连接池的性能比直连的性能略好(见后续测试部分)。

    分布式调用中不支持事务。

    因为事务是在服务器端实现,而在分布式中,每批次的调用对象都可能访问不同的机器,所以,没法进行事务。
分享到:
评论

相关推荐

    Alluxio java 客户端demo

    总之,Alluxio Java客户端是开发人员与Alluxio系统交互的主要工具,提供了一套丰富的API来进行文件管理。通过学习和实践这个示例,你可以更好地理解Alluxio的工作原理,并将其高效地整合到你的数据处理流程中。

    k8s的Java客户端的帮助文档,从官网代码生成的JavaDoc

    Kubernetes(简称K8s)是目前广泛使用的容器编排系统,而Kubernetes Java客户端则是开发者与K8s集群进行交互的重要工具。这个JavaDoc文档集合是针对Kubernetes Java客户端的详细API参考,由官方代码自动生成,适用于...

    java客户端程序源代码

    根据给定的文件信息,以下是对“Java客户端程序源代码”的详细分析与解释: ### Java客户端程序概述 此Java客户端程序旨在实现一个简单的文本聊天功能。它通过建立Socket连接与服务器进行通信,发送和接收消息。 ...

    Java开发Client客户端,连接Windows的Telnet服务器,解决了中文乱码问题

    通过以上步骤,我们可以成功地创建一个能与Windows Telnet服务器进行通信的Java客户端,并有效避免中文乱码的问题。在实际开发中,还应注意异常处理、资源关闭等最佳实践,以提高程序的健壮性和效率。

    windows服务端+多客户端socket tcp通信

    本项目“windows服务端+多客户端socket tcp通信”是基于Windows平台,利用Visual Studio 2013开发的一个示例,旨在实现服务端与多个客户端之间的实时通讯,类似于QQ群聊天的功能,同时还支持消息的群发和文件的二...

    C++写的服务器与Java写的客户端通过Socket通信java代码

    - 建立连接:客户端的Socket尝试与服务器建立连接。 - 数据收发:客户端使用`getOutputStream()`获取输出流对象,用于发送数据;使用`getInputStream()`获取输入流对象,用于接收数据。Java中通常会使用`...

    java代码readis相关资料

    在Java中,我们可以使用Jedis、Lettuce等客户端库来与Redis进行交互。以下是一些关于Java操作Redis的重要知识点: 1. **Jedis库的使用**:Jedis是Java社区广泛使用的Redis客户端,提供了丰富的API来执行各种Redis...

    STM32单片机作TCP服务器,实现PC多客户端连接Demo

    3. **并发连接处理**:当有新的连接请求时,`accept()`返回一个新的套接字用于与新客户端通信。在嵌入式系统中,通常会用一个循环或者事件队列来处理这些新连接,而不是创建新的线程或进程。 4. **数据收发**:使用`...

    C#之网络编程服务器与客户端连接并传送数据

    本篇文章将深入探讨如何使用C#进行网络编程,包括服务器与客户端的连接以及数据的传输。 首先,我们要了解C#中的网络编程基本概念。在C#中,我们可以使用System.Net命名空间下的类来实现网络通信。其中,Socket类是...

    Java Telnet客户端实例源码

    Java Telnet客户端是一种基于TCP协议的应用程序,它允许用户通过Java编程语言与远程服务器上的Telnet服务进行交互。在Java中实现一个Telnet客户端可以帮助开发者远程控制或测试其他支持Telnet的服务,例如网络设备...

    Java连接opc所需的jar包,以及Java实现opc server客户端的源码.zip

    Java连接OPC(OLE for Process Control)主要涉及的是在Java应用程序中与工业自动化设备或系统的交互,这通常用于数据采集和控制。OPC是微软Windows平台上的标准接口,但通过各种库和API,也能在非Windows环境如Java...

    java版tcp客户端与服务器连接

    2. 使用`serverSocket.accept()`方法监听客户端的连接请求,返回一个`Socket`对象,代表与客户端的连接。 3. 通过`Socket`对象获取输入流和输出流,进行数据读写。例如,`InputStream in = socket.getInputStream();...

    Delphi idtcpserver断开与连接客户端

    这个操作将关闭与客户端的套接字连接,释放`TIdContext`对象,并从服务器的连接列表中移除。`TIdTCPServer`的`OnDisconnect`事件会在断开连接后触发,可以在该事件中执行清理工作,比如释放资源或更新状态。 5. **...

    java实现tcp客户端发送服务端解析程序

    客户端通常会通过`Socket`类建立与服务器的连接。以下是一个简单的示例: ```java Socket socket = new Socket("服务器IP", 服务器端口号); OutputStream outputStream = socket.getOutputStream(); outputStream....

    QTcpServer实现多客户端连接

    在整个过程中,标签"QTcpSocket"提示我们,QTcpSocket是与客户端进行数据交换的主要工具,它提供了读写数据、管理连接状态等基本功能。多线程技术("多线程"标签)确保了服务器能够同时处理多个并发连接,提高系统...

    JAVA nio异步长连接服务端与客户端

    在标题中提到的"JAVA nio异步长连接服务端与客户端",我们可以理解为使用Java NIO实现的TCP长连接通信。TCP长连接是指在客户端和服务端之间保持一个持久的连接,可以多次收发数据,而不必每次通信都建立新的连接。这...

    windows版Rsync服务端和客户端cwRsync-4.1.0

    cwRsync是Windows下的Rsync实现,允许用户在Windows环境下享受Rsync的功能,进行文件和目录的同步与备份。 本文将详细介绍cwRsync 4.1.0版本在Windows上的安装、配置和使用方法,以及其在运维工作中的重要性。 ###...

    java TCP 服务器和客户端

    它返回一个新的`Socket`对象,代表与客户端的连接。 ```java Socket clientSocket = serverSocket.accept(); // 接受客户端连接 ``` 3. **数据交换**: 通过`Socket`对象,我们可以获取输入流和输出流,用于与...

    JAVA NIO 异步通信客户端

    Selector负责监控多个通道的状态变化,而Channel是数据传输的通道,例如SocketChannel,用于客户端与服务器之间的TCP连接。 以下是关于JAVA NIO异步通信客户端的一些关键知识点: 1. **Channels**: Channel是NIO的...

Global site tag (gtag.js) - Google Analytics