Redis 客戶端連接


Redis 的客戶端請參考 http://redis.io/clients 。

  • Jedis 客戶端
  • phpredis 客戶端
  • redis-py 客戶端
  • C/C++ 客戶端
  • .net 客戶端
  • node-redis 客戶端
  • C# 客戶端 StackExchange.Redis
  • Jedis 客戶端


Jedis 客戶端訪問雲數據庫 Redis 版服務,有以下兩種方法:

Jedis單鏈接
JedisPool連接池連接
操作步驟如下:

下載並安裝Jedis客戶端:單擊下載地址。

Jedis 單連接示例

打開 Eclipse 客戶端,創建一個 Project,輸入如下代碼段:

import redis.clients.jedis.Jedis;
public class jedistest {
public static void main(String[] args) {
try {
     String host = "xx.kvstore.aliyuncs.com";//控制台顯示訪問地址
     int port = 6379;
     Jedis jedis = new Jedis(host, port);
     //鑒權信息
     jedis.auth("password");//password
     String key = "redis";
     String value = "aliyun-redis";
     //select db默認為0
     jedis.select(1);
     //set一個key
     jedis.set(key, value);
     System.out.println("Set Key " + key + " Value: " + value);
     //get 設置進去的key
     String getvalue = jedis.get(key);
     System.out.println("Get Key " + key + " ReturnValue: " + getvalue);
     jedis.quit();
     jedis.close();
}
catch (Exception e) {
 e.printStackTrace();
 }
}
}

 
運行上述 Project,在 Eclipse 的控制台輸出如下運行結果則表示您已成功連接雲數據庫 Redis。

Set Key redis Value aliyun-redis
Get Key redis ReturnValue aliyun-redis


接下來您就可以通過自己的本地客戶端 Jedis 操作您的雲數據庫 Redis。您也可以通過 JedisPool 連接池來連接您的雲數據庫 Redis。

JedisPool 連接池示例

打開 Eclipse 客戶端,創建一個 Project,配置 pom 文件,具體配置如下所示:

<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.7.2</version>
<type>jar</type>
<scope>compile</scope>
</dependency>


在 project 中添加如下應用:

import org.apache.commons.pool2.PooledObject;
import org.apache.commons.pool2.PooledObjectFactory;
import org.apache.commons.pool2.impl.DefaultPooledObject;
import org.apache.commons.pool2.impl.GenericObjectPoolConfig;
import redis.clients.jedis.HostAndPort;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;


如果您的 Jedis 客戶端版本是 Jedis-2.7.2,在 Project 中輸入如下代碼:

JedisPoolConfig config = new JedisPoolConfig();
//最大空閑連接數, 應用自己評估,不要超過ApsaraDB for Redis每個實例最大的連接數
config.setMaxIdle(200);
//最大連接數, 應用自己評估,不要超過ApsaraDB for Redis每個實例最大的連接數
config.setMaxTotal(300);
config.setTestOnBorrow(false);
config.setTestOnReturn(false);
String host = "*.aliyuncs.com";
String password = "密碼";
JedisPool pool = new JedisPool(config, host, 6379, 3000, password);
Jedis jedis = null;
try {
jedis = pool.getResource();
/// ... do stuff here ... for example
jedis.set("foo", "bar");
String foobar = jedis.get("foo");
jedis.zadd("sose", 0, "car");
jedis.zadd("sose", 0, "bike");
Set<String> sose = jedis.zrange("sose", 0, -1);
} finally {
if (jedis != null) {
jedis.close();
}
}
/// ... when closing your application:
pool.destroy();


如果您的 Jedis 客戶端版本是 Jedis-2.6、Jedis-2.5,在 Project 中輸入如下代碼:

JedisPoolConfig config = new JedisPoolConfig();
//最大空閑連接數, 應用自己評估,不要超過ApsaraDB for Redis每個實例最大的連接數
config.setMaxIdle(200);
//最大連接數, 應用自己評估,不要超過ApsaraDB for Redis每個實例最大的連接數
config.setMaxTotal(300);
config.setTestOnBorrow(false);
config.setTestOnReturn(false);
String host = "*.aliyuncs.com";
String password = "密碼";
JedisPool pool = new JedisPool(config, host, 6379, 3000, password);
Jedis jedis = null;
boolean broken = false;
try {
     jedis = pool.getResource();
     /// ... do stuff here ... for example
     jedis.set("foo", "bar");
     String foobar = jedis.get("foo");
     jedis.zadd("sose", 0, "car");
     jedis.zadd("sose", 0, "bike");
     Set<String> sose = jedis.zrange("sose", 0, -1);
}
catch(Exception e)
{
     broken = true;
} finally {
if (broken) {
     pool.returnBrokenResource(jedis);
} else if (jedis != null) {
     pool.returnResource(jedis);
 }
}


運行上述 Project,在 Eclipse 的控制台輸出如下運行結果則表示您已成功連接雲數據庫 Redis。

Set Key redis Value aliyun-redis
Get Key redis ReturnValue aliyun-redis


接下來您就可以通過自己的本地客戶端Jedis操作您的雲數據庫 Redis。

phpredis 客戶端

操作步驟如下所示:

下載並安裝phpredis客戶端:單擊 下載地址。

在任何一款可以編輯 php 的編輯器中輸入如下代碼:

 <?php
 /* 這里替換為連接的實例host和port */
 $host = "localhost";
 $port = 6379;
 /* 這里替換為實例id和實例password */
 $user = "test_username";
 $pwd = "test_password";
 $redis = new Redis();
 if ($redis->connect($host, $port) == false) {
         die($redis->getLastError());
   }
 if ($redis->auth($pwd) == false) {
         die($redis->getLastError());
  }
  /* 認證后就可以進行數據庫操作,詳情文檔參考https://github.com/phpredis/phpredis */
 if ($redis->set("foo", "bar") == false) {
         die($redis->getLastError());
 }
 $value = $redis->get("foo");
 echo $value;
 ?>


執行上述代碼,您就可以通過自己的本地客戶端 phpredis 訪問您的雲數據庫 Redis,詳情文檔參考 https://github.com/phpredis/phpredis 。
redis-py 客戶端

操作步驟如下:

下載並安裝 redis-py 客戶端:單擊 下載地址。

在任何一款可以編輯 Python 的編輯器中輸入如下代碼,即可建立連接通過本地客戶端 redis-py 進行數據庫操作。

#!/usr/bin/env python
#-*- coding: utf-8 -*-
import redis
#這里替換為連接的實例host和port
host = 'localhost'
port = 6379
#這里替換為實例password
pwd = 'test_password'
r = redis.StrictRedis(host=host, port=port, password=pwd)
#連接建立后就可以進行數據庫操作,詳情文檔參考https://github.com/andymccurdy/redis-py
r.set('foo', 'bar');
print r.get('foo')


C/C++ 客戶端

操作步驟如下所示:

下載並編譯安裝C客戶端,編譯安裝代碼如下所示:

     git clone https://github.com/redis/hiredis.git
     cd hiredis
     make
     sudo make install


在 C/C++編輯器中編寫如下代碼:

     #include <stdio.h>
     #include <stdlib.h>
     #include <string.h>
     #include <hiredis.h>
     int main(int argc, char **argv) {
     unsigned int j;
     redisContext *c;
     redisReply *reply;
     if (argc < 4) {
             printf("Usage: example xxx.kvstore.aliyuncs.com 6379 instance_id password\n");
             exit(0);
     }
     const char *hostname = argv[1];
     const int port = atoi(argv[2]);
     const char *instance_id = argv[3];
     const char *password = argv[4];
     struct timeval timeout = { 1, 500000 }; // 1.5 seconds
     c = redisConnectWithTimeout(hostname, port, timeout);
     if (c == NULL || c->err) {
     if (c) {
             printf("Connection error: %s\n", c->errstr);
             redisFree(c);
     } else {
             printf("Connection error: can't allocate redis context\n");
     }
     exit(1);
     }
     /* AUTH */
     reply = redisCommand(c, "AUTH %s", password);
     printf("AUTH: %s\n", reply->str);
     freeReplyObject(reply);
     /* PING server */
     reply = redisCommand(c,"PING");
     printf("PING: %s\n", reply->str);
     freeReplyObject(reply);
     /* Set a key */
     reply = redisCommand(c,"SET %s %s", "foo", "hello world");
     printf("SET: %s\n", reply->str);
     freeReplyObject(reply);
     /* Set a key using binary safe API */
     reply = redisCommand(c,"SET %b %b", "bar", (size_t) 3, "hello", (size_t) 5);
     printf("SET (binary API): %s\n", reply->str);
     freeReplyObject(reply);
     /* Try a GET and two INCR */
     reply = redisCommand(c,"GET foo");
     printf("GET foo: %s\n", reply->str);
     freeReplyObject(reply);
     reply = redisCommand(c,"INCR counter");
     printf("INCR counter: %lld\n", reply->integer);
     freeReplyObject(reply);
     /* again ... */
     reply = redisCommand(c,"INCR counter");
     printf("INCR counter: %lld\n", reply->integer);
     freeReplyObject(reply);
     /* Create a list of numbers, from 0 to 9 */
     reply = redisCommand(c,"DEL mylist");
     freeReplyObject(reply);
     for (j = 0; j < 10; j++) {
             char buf[64];
             snprintf(buf,64,"%d",j);
             reply = redisCommand(c,"LPUSH mylist element-%s", buf);
             freeReplyObject(reply);
         }
     /* Let's check what we have inside the list */
     reply = redisCommand(c,"LRANGE mylist 0 -1");
     if (reply->type == REDIS_REPLY_ARRAY) {
             for (j = 0; j < reply->elements; j++) {
             printf("%u) %s\n", j, reply->element[j]->str);
     }
     }
     freeReplyObject(reply);
     /* Disconnects and frees the context */
     redisFree(c);
     return 0;
     }

 


編譯上述代碼。

 gcc -o example -g example.c -I /usr/local/include/hiredis -lhiredis
測試運行。

 example xxx.kvstore.aliyuncs.com 6379 instance_id password
至此完成通過 C/C++ 客戶端連接雲數據庫 Redis。

.net 客戶端

操作步驟如下所示:

下載並使用.net 客戶端。

 git clone https://github.com/ServiceStack/ServiceStack.Redis
在.net 客戶端中新建 .net 項目。

添加客戶端引用,引用文件在庫文件的 ServiceStack.Redis/lib/tests 中。

在新建的.net 項目中輸入如下代碼來連接雲數據庫 Redis。詳細的接口用法請參見 https://github.com/ServiceStack/ServiceStack.Redis 。

 using System;
 using System.Collections.Generic;
 using System.Linq;
 using System.Text;
 using System.Threading.Tasks;
 using ServiceStack.Redis;
 namespace ServiceStack.Redis.Tests
 {
         class Program
 {
 public static void RedisClientTest()
 {
         string host = "127.0.0.1";/*訪問host地址*/
         string password = "password";/*密碼*/
         RedisClient redisClient = new RedisClient(host, 6379, password);
         string key = "test-aliyun";
         string value = "test-aliyun-value";
         redisClient.Set(key, value);
         string listKey = "test-aliyun-list";
         System.Console.WriteLine("set key " + key + " value " + value);
         string getValue = System.Text.Encoding.Default.GetString(redisClient.Get(key));
         System.Console.WriteLine("get key " + getValue);
         System.Console.Read();
 }
 public static void RedisPoolClientTest()
 {
         string[] testReadWriteHosts = new[] {
         "redis://password@127.0.0.1:6379"/*redis://密碼@訪問地址:端口*/
 };
 RedisConfig.VerifyMasterConnections = false;//需要設置
 PooledRedisClientManager redisPoolManager = new PooledRedisClientManager(10/*連接池個數*/, 10/*連接池超時時間*/, testReadWriteHosts);
 for (int i = 0; i < 100; i++){
         IRedisClient redisClient = redisPoolManager.GetClient();//獲取連接
         RedisNativeClient redisNativeClient = (RedisNativeClient)redisClient;
         redisNativeClient.Client = null;//ApsaraDB for Redis不支持client setname所以這里需要顯示的把client對象置為null
 try
 {
         string key = "test-aliyun1111";
         string value = "test-aliyun-value1111";
         redisClient.Set(key, value);
         string listKey = "test-aliyun-list";
         redisClient.AddItemToList(listKey, value);
         System.Console.WriteLine("set key " + key + " value " + value);
         string getValue = redisClient.GetValue(key);
         System.Console.WriteLine("get key " + getValue);
         redisClient.Dispose();//
 }catch (Exception e)
 {
         System.Console.WriteLine(e.Message);
 }
 }
         System.Console.Read();
 }
 static void Main(string[] args)
 {
         //單鏈接模式
         RedisClientTest();
         //連接池模式
         RedisPoolClientTest();
 }
 }
 }


node-redis 客戶端

操作步驟如下所示:

下載並安裝 node-redis。

 npm install hiredis redis
在 node-redis 客戶端中輸入如下代碼並執行以此連接雲數據 Redis 版。

 var redis = require("redis"),
 client = redis.createClient({detect_buffers: true});
 client.auth("password", redis.print)
使用雲數據 Redis 版。

   // 寫入數據
 client.set("key", "OK");
 // 獲取數據,返回String
 client.get("key", function (err, reply) {
 console.log(reply.toString()); // print `OK`
 });
 // 如果傳入一個Buffer,返回也是一個Buffer
 client.get(new Buffer("key"), function (err, reply) {
 console.log(reply.toString()); // print `<Buffer 4f 4b>`
 });
 client.quit();
C# 客戶端 StackExchange.Redis

操作步驟如下所示:

下載並安裝 StackExchange.Redis。

添加引用。

using StackExchange.Redis;

初始化 ConnectionMultiplexer。

ConnectionMultiplexer 是 StackExchange.Redis 的核心,它被整個應用程序共享和重用,應該設置為單例,它的初始化如下:

 // redis config
 private static ConfigurationOptions configurationOptions = ConfigurationOptions.Parse("127.0.0.1:6379,password=xxx,connectTimeout=2000");
  //the lock for singleton
 private static readonly object Locker = new object();
  //singleton
 private static ConnectionMultiplexer redisConn;
 //singleton
 public static ConnectionMultiplexer getRedisConn()
 {
     if (redisConn == null)
     {
         lock (Locker)
         {
             if (redisConn == null || !redisConn.IsConnected)
             {
                 redisConn = ConnectionMultiplexer.Connect(configurationOptions);
             }
         }
     }
     return redisConn;
 }

 


說明:ConfigurationOptions 包含很多選項,例如 keepAlive、connectRetry、name,具體可以參考StackExchange.Redis.ConfigurationOptions。
GetDatabase()返回的對象是輕量級的,每次用的時候從 ConnectionMultiplexer 對象中獲取即可。

 redisConn = getRedisConn();
 var db = redisConn.GetDatabase();
下面給出5種數據結構的 demo,它們的 API 和原生略有不同,分別用 String、Hash、List、Set、SortedSet 開頭代表5種數據結構。

string//set get
string strKey = "hello";
string strValue = "world";
bool setResult = db.StringSet(strKey, strValue);
Console.WriteLine("set " + strKey + " " + strValue + ", result is " + setResult);
//incr
string counterKey = "counter";
long counterValue = db.StringIncrement(counterKey);
Console.WriteLine("incr " + counterKey + ", result is " + counterValue);
//expire
db.KeyExpire(strKey, new TimeSpan(0, 0, 5));
Thread.Sleep(5 * 1000);
Console.WriteLine("expire " + strKey + ", after 5 seconds, value is " + db.StringGet(strKey));
//mset mget
KeyValuePair<RedisKey, RedisValue> kv1 = new KeyValuePair<RedisKey, RedisValue>("key1", "value1");
KeyValuePair<RedisKey, RedisValue> kv2 = new KeyValuePair<RedisKey, RedisValue>("key2", "value2");
db.StringSet(new KeyValuePair<RedisKey, RedisValue>[] {kv1,kv2});            
RedisValue[] values = db.StringGet(new RedisKey[] {kv1.Key, kv2.Key});
Console.WriteLine("mget " + kv1.Key.ToString() + " " + kv2.Key.ToString() + ", result is " + values[0] + "&&" + values[1]);
hash

string hashKey = "myhash";
//hset
db.HashSet(hashKey,"f1","v1");
db.HashSet(hashKey,"f2", "v2");
HashEntry[] values = db.HashGetAll(hashKey);
//hgetall
Console.Write("hgetall " + hashKey + ", result is");
for (int i = 0; i < values.Length;i++)
{
  HashEntry hashEntry = values[i];
  Console.Write(" " + hashEntry.Name.ToString() + " " + hashEntry.Value.ToString());
}
Console.WriteLine();
list

//list key
string listKey = "myList";
//rpush
db.ListRightPush(listKey, "a");
db.ListRightPush(listKey, "b");
db.ListRightPush(listKey, "c");
//lrange
RedisValue[] values = db.ListRange(listKey, 0, -1);
Console.Write("lrange " + listKey + " 0 -1, result is ");
for (int i = 0; i < values.Length; i++)
{
 Console.Write(values[i] + " ");
}
Console.WriteLine();
set

//set key
string setKey = "mySet";
//sadd
db.SetAdd(setKey, "a");
db.SetAdd(setKey, "b");
db.SetAdd(setKey, "c");
//sismember
bool isContains = db.SetContains(setKey, "a");
Console.WriteLine("set " + setKey + " contains a is " + isContains );
sortedset

string sortedSetKey = "myZset";
//sadd
db.SortedSetAdd(sortedSetKey, "xiaoming", 85);
db.SortedSetAdd(sortedSetKey, "xiaohong", 100);
db.SortedSetAdd(sortedSetKey, "xiaofei", 62);
db.SortedSetAdd(sortedSetKey, "xiaotang", 73);
//zrevrangebyscore
RedisValue[] names = db.SortedSetRangeByRank(sortedSetKey, 0, 2, Order.Ascending);
Console.Write("zrevrangebyscore " + sortedSetKey + " 0 2, result is ");
for (int i = 0; i < names.Length; i++)
{
  Console.Write(names[i] + " ");
}
Console.WriteLine();

 

 

 

Redis公網連接

前提條件

如果您需要從本地 PC 端訪問 Redis 實例進行數據操作,可以通過在 ECS 上配置端口映射或者端口轉發實現。但必須符合以下前提條件:

  • 若 Redis 實例屬於專有網絡(VPC),ECS 必須與 Redis 實例屬於同一個 VPC。

  • 若 Redis 實例屬於經典網絡,ECS 必須與 Redis 實例屬於同一節點(地域)。

  • 若 Redis 實例開啟了 IP 白名單,必須將 ECS 的內網地址加入白名單列表內。

ECS Windows 篇

目前雲數據庫 Redis 版需要通過 ECS 的內網進行連接訪問,如果您需要本地通過公網訪問雲數據庫 Redis 版,可以在 ECS Windows 雲服務器中通過 netsh 進行端口映射實現。

  1. 登錄 ECS Windows 服務器,在 cmd 執行以下命令:

    1. netsh interface portproxy add v4tov4 listenaddress=ECS服務器的公網IP地址 listenport=6379 connectaddress=雲數據庫Redis的連接地址 connectport=6379

    netsh interface

    如果需要查看當前服務器存在的映射,可用netsh interface portproxy show all命令。

  2. 設置完成后在本地進行驗證測試。

    本地驗證

    1. 在本地通過 redis-cli 連接 ECS Windows 服務器。假設 ECS Windows 服務器的 IP 是 1.1.1.1,即 telnet 1.1.1.1 6379

    2. 連接上 ECS windows 服務器后,輸入連接 Redis 的密碼:auth Redis的連接密碼

    3. 進行數據寫入及查詢驗證。

      通過上述步驟即可實現:您本地 PC 或服務器通過公網連接 ECS Windows 6379端口,對雲數據庫 Redis 進行訪問。

      注意:因 portproxy 由微軟官方提供,未開源使用,您如果配置使用過程中遇到疑問,可參看 netsh 的 portproxy 使用說明或向微軟官方咨詢確認。或者您也可以考慮通過其他的方案實現,比如通過 portmap 配置代理映射。

  3. 完成相關操作后,如需刪除公網轉發,可用netsh interface portproxy delete v4tov4 listenaddress=ECS公網服務器的私網IP地址 listenport=6379刪除不需要的映射。

ECS Linux 篇

目前雲數據庫 Redis 版需要通過 ECS 進行內網連接訪問。如果您本地需要通過公網訪問雲數據庫 Redis,可以在 ECS Linux 雲服務器中安裝 rinetd 進行轉發實現。

  1. 在雲服務器 ECS Linux 中安裝 rinetd。

    1. wget http://www.boutell.com/rinetd/http/rinetd.tar.gz&&tar -xvf rinetd.tar.gz&&cd rinetd
    2. sed -i 's/65536/65535/g' rinetd.c (修改端口范圍)
    3. mkdir /usr/man&&make&&make install

    注意:rinetd 安裝包下載地址不確保下載可用性,您可以自行搜索安裝包進行下載使用。

  2. 打開配置文件 rinetd.conf。

    1. vi /etc/rinetd.conf
  3. 在配置文件中輸入如下內容:

    1. 0.0.0.0 6379 Redis 的鏈接地址 6379
    2. logfile /var/log/rinetd.log

    說明:您可以使用 cat /etc/rinetd.conf命令來檢驗配置文件是否修改正確。

  4. 執行如下命令啟動 rinetd。

    1. rinetd

    注意

    • 您可以通過 echo rinetd >>/etc/rc.local 將 rinetd 設置為自啟動。

    • 若遇到綁定報錯,可以執行 pkill rinetd 結束進程,再執行 rinetd啟動進程 rinetd。

    • rinetd 正常啟動后, 執行netstat -anp | grep 6379 確認服務是否正常運行。

    netstat 驗證

  5. 在本地進行驗證測試。

    1. 您可以在本地通過 redis-cli 連接 ECS Linux 服務器后進行登錄驗證,比如安裝了 rinetd 的服務器的 IP 是 1.1.1.1,即redis-cli -h 1.1.1.1 -a Redis的實例ID:Redis密碼。或者通過 telent 連接 ECS Linux 服務器后進行操作驗證。假設 ECS Linux 服務器的 IP 是 1.1.1.1,即 telnet 1.1.1.1 6379

    2. 連接上 ECS Linux 服務器后,輸入連接 Redis 的密碼:auth Redis的連接密碼

    3. 進行數據寫入及查詢驗證。

      本地驗證

通過上述步驟即可實現:您本地的 PC 或服務器通過公網連接 ECS Linux 6379 端口,對雲數據庫 Redis 進行訪問。

https://help.aliyun.com/document_detail/43848.html?spm=5176.11065259.1996646101.searchclickresult.57f17f2dz4kMTq#5

https://help.aliyun.com/document_detail/43850.html

 

注意:您可以通過該方案進行測試使用,因 rinetd 為開源軟件,如在使用過程中存在疑問,您可以參看其官方文檔或與 rinetd 官方進行聯系確認。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM