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 進行端口映射實現。
-
登錄 ECS Windows 服務器,在 cmd 執行以下命令:
netsh interface portproxy add v4tov4 listenaddress=ECS服務器的公網IP地址 listenport=6379 connectaddress=雲數據庫Redis的連接地址 connectport=6379

如果需要查看當前服務器存在的映射,可用
netsh interface portproxy show all命令。 -
設置完成后在本地進行驗證測試。

-
在本地通過 redis-cli 連接 ECS Windows 服務器。假設 ECS Windows 服務器的 IP 是 1.1.1.1,即
telnet 1.1.1.1 6379。 -
連接上 ECS windows 服務器后,輸入連接 Redis 的密碼:
auth Redis的連接密碼。 -
進行數據寫入及查詢驗證。
通過上述步驟即可實現:您本地 PC 或服務器通過公網連接 ECS Windows 6379端口,對雲數據庫 Redis 進行訪問。
注意:因 portproxy 由微軟官方提供,未開源使用,您如果配置使用過程中遇到疑問,可參看 netsh 的 portproxy 使用說明或向微軟官方咨詢確認。或者您也可以考慮通過其他的方案實現,比如通過 portmap 配置代理映射。
-
-
完成相關操作后,如需刪除公網轉發,可用
netsh interface portproxy delete v4tov4 listenaddress=ECS公網服務器的私網IP地址 listenport=6379刪除不需要的映射。
ECS Linux 篇
目前雲數據庫 Redis 版需要通過 ECS 進行內網連接訪問。如果您本地需要通過公網訪問雲數據庫 Redis,可以在 ECS Linux 雲服務器中安裝 rinetd 進行轉發實現。
-
在雲服務器 ECS Linux 中安裝 rinetd。
wget http://www.boutell.com/rinetd/http/rinetd.tar.gz&&tar -xvf rinetd.tar.gz&&cd rinetdsed -i 's/65536/65535/g' rinetd.c (修改端口范圍)mkdir /usr/man&&make&&make install
注意:rinetd 安裝包下載地址不確保下載可用性,您可以自行搜索安裝包進行下載使用。
-
打開配置文件 rinetd.conf。
vi /etc/rinetd.conf
-
在配置文件中輸入如下內容:
0.0.0.0 6379 Redis 的鏈接地址 6379logfile /var/log/rinetd.log
說明:您可以使用
cat /etc/rinetd.conf命令來檢驗配置文件是否修改正確。
-
執行如下命令啟動 rinetd。
rinetd
注意
-
您可以通過
echo rinetd >>/etc/rc.local將 rinetd 設置為自啟動。 -
若遇到綁定報錯,可以執行
pkill rinetd結束進程,再執行rinetd啟動進程 rinetd。 -
rinetd 正常啟動后, 執行
netstat -anp | grep 6379確認服務是否正常運行。

-
在本地進行驗證測試。
-
您可以在本地通過 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。 -
連接上 ECS Linux 服務器后,輸入連接 Redis 的密碼:
auth Redis的連接密碼。 -
進行數據寫入及查詢驗證。

-
通過上述步驟即可實現:您本地的 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 官方進行聯系確認。
