全部产品
存储与CDN 数据库 域名与网站(万网) 应用服务 数加·人工智能 数加·大数据基础服务 互联网中间件 视频服务 开发者工具 解决方案 物联网 钉钉智能硬件
云数据库 Redis 版

Redis 客户端连接

更新时间:2018-02-13 16:43:48

由于云数据库 Redis 提供的数据库服务与原生的数据库服务完全兼容,连接数据库的方式也基本类似。任何兼容 Redis 协议的客户端都可以访问云数据库 Redis 版服务,您可以根据自身应用特点选用任何 Redis 客户端。

注意:云数据库 Redis 版仅支持阿里云内网访问,不支持外网访问,即只有在同节点的 ECS上安装 Redis 客户端才能与云数据库建立连接并进行数据操作。

Redis 的客户端请参考 http://redis.io/clients

Jedis 客户端

Jedis 客户端访问云数据库 Redis 版服务,有以下两种方法:

  • Jedis单链接
  • JedisPool连接池连接

操作步骤如下:

  1. 下载并安装Jedis客户端:单击下载地址

  2. Jedis 单连接示例

    1. 打开 Eclipse 客户端,创建一个 Project,输入如下代码段:

      1. import redis.clients.jedis.Jedis;
      2. public class jedistest {
      3. public static void main(String[] args) {
      4. try {
      5. String host = "xx.kvstore.aliyuncs.com";//控制台显示访问地址
      6. int port = 6379;
      7. Jedis jedis = new Jedis(host, port);
      8. //鉴权信息
      9. jedis.auth("password");//password
      10. String key = "redis";
      11. String value = "aliyun-redis";
      12. //select db默认为0
      13. jedis.select(1);
      14. //set一个key
      15. jedis.set(key, value);
      16. System.out.println("Set Key " + key + " Value: " + value);
      17. //get 设置进去的key
      18. String getvalue = jedis.get(key);
      19. System.out.println("Get Key " + key + " ReturnValue: " + getvalue);
      20. jedis.quit();
      21. jedis.close();
      22. }
      23. catch (Exception e) {
      24. e.printStackTrace();
      25. }
      26. }
      27. }
    2. 运行上述 Project,在 Eclipse 的控制台输出如下运行结果则表示您已成功连接云数据库 Redis。

      1. Set Key redis Value aliyun-redis
      2. Get Key redis ReturnValue aliyun-redis

      接下来您就可以通过自己的本地客户端 Jedis 操作您的云数据库 Redis。您也可以通过 JedisPool 连接池来连接您的云数据库 Redis。

  3. JedisPool 连接池示例

    1. 打开 Eclipse 客户端,创建一个 Project,配置 pom 文件,具体配置如下所示:

      1. <dependency>
      2. <groupId>redis.clients</groupId>
      3. <artifactId>jedis</artifactId>
      4. <version>2.7.2</version>
      5. <type>jar</type>
      6. <scope>compile</scope>
      7. </dependency>
    2. 在 project 中添加如下应用:

      1. import org.apache.commons.pool2.PooledObject;
      2. import org.apache.commons.pool2.PooledObjectFactory;
      3. import org.apache.commons.pool2.impl.DefaultPooledObject;
      4. import org.apache.commons.pool2.impl.GenericObjectPoolConfig;
      5. import redis.clients.jedis.HostAndPort;
      6. import redis.clients.jedis.Jedis;
      7. import redis.clients.jedis.JedisPool;
      8. import redis.clients.jedis.JedisPoolConfig;
    3. 如果您的 Jedis 客户端版本是 Jedis-2.7.2,在 Project 中输入如下代码:

      1. JedisPoolConfig config = new JedisPoolConfig();
      2. //最大空闲连接数, 应用自己评估,不要超过ApsaraDB for Redis每个实例最大的连接数
      3. config.setMaxIdle(200);
      4. //最大连接数, 应用自己评估,不要超过ApsaraDB for Redis每个实例最大的连接数
      5. config.setMaxTotal(300);
      6. config.setTestOnBorrow(false);
      7. config.setTestOnReturn(false);
      8. String host = "*.aliyuncs.com";
      9. String password = "密码";
      10. JedisPool pool = new JedisPool(config, host, 6379, 3000, password);
      11. Jedis jedis = null;
      12. try {
      13. jedis = pool.getResource();
      14. /// ... do stuff here ... for example
      15. jedis.set("foo", "bar");
      16. String foobar = jedis.get("foo");
      17. jedis.zadd("sose", 0, "car");
      18. jedis.zadd("sose", 0, "bike");
      19. Set<String> sose = jedis.zrange("sose", 0, -1);
      20. } finally {
      21. if (jedis != null) {
      22. jedis.close();
      23. }
      24. }
      25. /// ... when closing your application:
      26. pool.destroy();
    4. 如果您的 Jedis 客户端版本是 Jedis-2.6、Jedis-2.5,在 Project 中输入如下代码:

      1. JedisPoolConfig config = new JedisPoolConfig();
      2. //最大空闲连接数, 应用自己评估,不要超过ApsaraDB for Redis每个实例最大的连接数
      3. config.setMaxIdle(200);
      4. //最大连接数, 应用自己评估,不要超过ApsaraDB for Redis每个实例最大的连接数
      5. config.setMaxTotal(300);
      6. config.setTestOnBorrow(false);
      7. config.setTestOnReturn(false);
      8. String host = "*.aliyuncs.com";
      9. String password = "密码";
      10. JedisPool pool = new JedisPool(config, host, 6379, 3000, password);
      11. Jedis jedis = null;
      12. boolean broken = false;
      13. try {
      14. jedis = pool.getResource();
      15. /// ... do stuff here ... for example
      16. jedis.set("foo", "bar");
      17. String foobar = jedis.get("foo");
      18. jedis.zadd("sose", 0, "car");
      19. jedis.zadd("sose", 0, "bike");
      20. Set<String> sose = jedis.zrange("sose", 0, -1);
      21. }
      22. catch(Exception e)
      23. {
      24. broken = true;
      25. } finally {
      26. if (broken) {
      27. pool.returnBrokenResource(jedis);
      28. } else if (jedis != null) {
      29. pool.returnResource(jedis);
      30. }
      31. }
    5. 运行上述 Project,在 Eclipse 的控制台输出如下运行结果则表示您已成功连接云数据库 Redis。

      1. Set Key redis Value aliyun-redis
      2. Get Key redis ReturnValue aliyun-redis

      接下来您就可以通过自己的本地客户端Jedis操作您的云数据库 Redis。

phpredis 客户端

操作步骤如下所示:

  1. 下载并安装phpredis客户端:单击 下载地址

  2. 在任何一款可以编辑 php 的编辑器中输入如下代码:

    1. <?php
    2. /* 这里替换为连接的实例host和port */
    3. $host = "localhost";
    4. $port = 6379;
    5. /* 这里替换为实例id和实例password */
    6. $user = "test_username";
    7. $pwd = "test_password";
    8. $redis = new Redis();
    9. if ($redis->connect($host, $port) == false) {
    10. die($redis->getLastError());
    11. }
    12. if ($redis->auth($pwd) == false) {
    13. die($redis->getLastError());
    14. }
    15. /* 认证后就可以进行数据库操作,详情文档参考https://github.com/phpredis/phpredis */
    16. if ($redis->set("foo", "bar") == false) {
    17. die($redis->getLastError());
    18. }
    19. $value = $redis->get("foo");
    20. echo $value;
    21. ?>
  3. 执行上述代码,您就可以通过自己的本地客户端 phpredis 访问您的云数据库 Redis,详情文档参考 https://github.com/phpredis/phpredis

redis-py 客户端

操作步骤如下:

  1. 下载并安装 redis-py 客户端:单击 下载地址

  2. 在任何一款可以编辑 Python 的编辑器中输入如下代码,即可建立连接通过本地客户端 redis-py 进行数据库操作。

  1. #!/usr/bin/env python
  2. #-*- coding: utf-8 -*-
  3. import redis
  4. #这里替换为连接的实例host和port
  5. host = 'localhost'
  6. port = 6379
  7. #这里替换为实例password
  8. pwd = 'test_password'
  9. r = redis.StrictRedis(host=host, port=port, password=pwd)
  10. #连接建立后就可以进行数据库操作,详情文档参考https://github.com/andymccurdy/redis-py
  11. r.set('foo', 'bar');
  12. print r.get('foo')

C/C++ 客户端

操作步骤如下所示:

  1. 下载并编译安装C客户端,编译安装代码如下所示:

    1. git clone https://github.com/redis/hiredis.git
    2. cd hiredis
    3. make
    4. sudo make install
  2. 在 C/C++编辑器中编写如下代码:

    1. #include <stdio.h>
    2. #include <stdlib.h>
    3. #include <string.h>
    4. #include <hiredis.h>
    5. int main(int argc, char **argv) {
    6. unsigned int j;
    7. redisContext *c;
    8. redisReply *reply;
    9. if (argc < 4) {
    10. printf("Usage: example xxx.kvstore.aliyuncs.com 6379 instance_id password\n");
    11. exit(0);
    12. }
    13. const char *hostname = argv[1];
    14. const int port = atoi(argv[2]);
    15. const char *instance_id = argv[3];
    16. const char *password = argv[4];
    17. struct timeval timeout = { 1, 500000 }; // 1.5 seconds
    18. c = redisConnectWithTimeout(hostname, port, timeout);
    19. if (c == NULL || c->err) {
    20. if (c) {
    21. printf("Connection error: %s\n", c->errstr);
    22. redisFree(c);
    23. } else {
    24. printf("Connection error: can't allocate redis context\n");
    25. }
    26. exit(1);
    27. }
    28. /* AUTH */
    29. reply = redisCommand(c, "AUTH %s", password);
    30. printf("AUTH: %s\n", reply->str);
    31. freeReplyObject(reply);
    32. /* PING server */
    33. reply = redisCommand(c,"PING");
    34. printf("PING: %s\n", reply->str);
    35. freeReplyObject(reply);
    36. /* Set a key */
    37. reply = redisCommand(c,"SET %s %s", "foo", "hello world");
    38. printf("SET: %s\n", reply->str);
    39. freeReplyObject(reply);
    40. /* Set a key using binary safe API */
    41. reply = redisCommand(c,"SET %b %b", "bar", (size_t) 3, "hello", (size_t) 5);
    42. printf("SET (binary API): %s\n", reply->str);
    43. freeReplyObject(reply);
    44. /* Try a GET and two INCR */
    45. reply = redisCommand(c,"GET foo");
    46. printf("GET foo: %s\n", reply->str);
    47. freeReplyObject(reply);
    48. reply = redisCommand(c,"INCR counter");
    49. printf("INCR counter: %lld\n", reply->integer);
    50. freeReplyObject(reply);
    51. /* again ... */
    52. reply = redisCommand(c,"INCR counter");
    53. printf("INCR counter: %lld\n", reply->integer);
    54. freeReplyObject(reply);
    55. /* Create a list of numbers, from 0 to 9 */
    56. reply = redisCommand(c,"DEL mylist");
    57. freeReplyObject(reply);
    58. for (j = 0; j < 10; j++) {
    59. char buf[64];
    60. snprintf(buf,64,"%d",j);
    61. reply = redisCommand(c,"LPUSH mylist element-%s", buf);
    62. freeReplyObject(reply);
    63. }
    64. /* Let's check what we have inside the list */
    65. reply = redisCommand(c,"LRANGE mylist 0 -1");
    66. if (reply->type == REDIS_REPLY_ARRAY) {
    67. for (j = 0; j < reply->elements; j++) {
    68. printf("%u) %s\n", j, reply->element[j]->str);
    69. }
    70. }
    71. freeReplyObject(reply);
    72. /* Disconnects and frees the context */
    73. redisFree(c);
    74. return 0;
    75. }
  3. 编译上述代码。

    1. gcc -o example -g example.c -I /usr/local/include/hiredis -lhiredis
  4. 测试运行。

    1. example xxx.kvstore.aliyuncs.com 6379 instance_id password

至此完成通过 C/C++ 客户端连接云数据库 Redis。

.net 客户端

操作步骤如下所示:

  1. 下载并使用.net 客户端。

    1. git clone https://github.com/ServiceStack/ServiceStack.Redis
  2. 在.net 客户端中新建 .net 项目。

  3. 添加客户端引用,引用文件在库文件的 ServiceStack.Redis/lib/tests 中。

  4. 在新建的.net 项目中输入如下代码来连接云数据库 Redis。详细的接口用法请参见 https://github.com/ServiceStack/ServiceStack.Redis

    1. using System;
    2. using System.Collections.Generic;
    3. using System.Linq;
    4. using System.Text;
    5. using System.Threading.Tasks;
    6. using ServiceStack.Redis;
    7. namespace ServiceStack.Redis.Tests
    8. {
    9. class Program
    10. {
    11. public static void RedisClientTest()
    12. {
    13. string host = "127.0.0.1";/*访问host地址*/
    14. string password = "password";/*密码*/
    15. RedisClient redisClient = new RedisClient(host, 6379, password);
    16. string key = "test-aliyun";
    17. string value = "test-aliyun-value";
    18. redisClient.Set(key, value);
    19. string listKey = "test-aliyun-list";
    20. System.Console.WriteLine("set key " + key + " value " + value);
    21. string getValue = System.Text.Encoding.Default.GetString(redisClient.Get(key));
    22. System.Console.WriteLine("get key " + getValue);
    23. System.Console.Read();
    24. }
    25. public static void RedisPoolClientTest()
    26. {
    27. string[] testReadWriteHosts = new[] {
    28. "redis://password@127.0.0.1:6379"/*redis://密码@访问地址:端口*/
    29. };
    30. RedisConfig.VerifyMasterConnections = false;//需要设置
    31. PooledRedisClientManager redisPoolManager = new PooledRedisClientManager(10/*连接池个数*/, 10/*连接池超时时间*/, testReadWriteHosts);
    32. for (int i = 0; i < 100; i++){
    33. IRedisClient redisClient = redisPoolManager.GetClient();//获取连接
    34. RedisNativeClient redisNativeClient = (RedisNativeClient)redisClient;
    35. redisNativeClient.Client = null;//ApsaraDB for Redis不支持client setname所以这里需要显示的把client对象置为null
    36. try
    37. {
    38. string key = "test-aliyun1111";
    39. string value = "test-aliyun-value1111";
    40. redisClient.Set(key, value);
    41. string listKey = "test-aliyun-list";
    42. redisClient.AddItemToList(listKey, value);
    43. System.Console.WriteLine("set key " + key + " value " + value);
    44. string getValue = redisClient.GetValue(key);
    45. System.Console.WriteLine("get key " + getValue);
    46. redisClient.Dispose();//
    47. }catch (Exception e)
    48. {
    49. System.Console.WriteLine(e.Message);
    50. }
    51. }
    52. System.Console.Read();
    53. }
    54. static void Main(string[] args)
    55. {
    56. //单链接模式
    57. RedisClientTest();
    58. //连接池模式
    59. RedisPoolClientTest();
    60. }
    61. }
    62. }

node-redis 客户端

操作步骤如下所示:

  1. 下载并安装 node-redis。

    1. npm install hiredis redis
  2. 在 node-redis 客户端中输入如下代码并执行以此连接云数据 Redis 版。

    1. var redis = require("redis"),
    2. client = redis.createClient({detect_buffers: true});
    3. client.auth("password", redis.print)
  3. 使用云数据 Redis 版。

    1. // 写入数据
    2. client.set("key", "OK");
    3. // 获取数据,返回String
    4. client.get("key", function (err, reply) {
    5. console.log(reply.toString()); // print `OK`
    6. });
    7. // 如果传入一个Buffer,返回也是一个Buffer
    8. client.get(new Buffer("key"), function (err, reply) {
    9. console.log(reply.toString()); // print `<Buffer 4f 4b>`
    10. });
    11. client.quit();

C# 客户端 StackExchange.Redis

操作步骤如下所示:

  1. 下载并安装 StackExchange.Redis

  2. 添加引用。

    using StackExchange.Redis;

  3. 初始化 ConnectionMultiplexer。

    ConnectionMultiplexer 是 StackExchange.Redis 的核心,它被整个应用程序共享和重用,应该设置为单例,它的初始化如下:

    1. // redis config
    2. private static ConfigurationOptions configurationOptions = ConfigurationOptions.Parse("127.0.0.1:6379,password=xxx,connectTimeout=2000");
    3. //the lock for singleton
    4. private static readonly object Locker = new object();
    5. //singleton
    6. private static ConnectionMultiplexer redisConn;
    7. //singleton
    8. public static ConnectionMultiplexer getRedisConn()
    9. {
    10. if (redisConn == null)
    11. {
    12. lock (Locker)
    13. {
    14. if (redisConn == null || !redisConn.IsConnected)
    15. {
    16. redisConn = ConnectionMultiplexer.Connect(configurationOptions);
    17. }
    18. }
    19. }
    20. return redisConn;
    21. }

    说明:ConfigurationOptions 包含很多选项,例如 keepAlive、connectRetry、name,具体可以参考StackExchange.Redis.ConfigurationOptions。

  4. GetDatabase()返回的对象是轻量级的,每次用的时候从 ConnectionMultiplexer 对象中获取即可。

    1. redisConn = getRedisConn();
    2. var db = redisConn.GetDatabase();
  5. 下面给出5种数据结构的 demo,它们的 API 和原生略有不同,分别用 String、Hash、List、Set、SortedSet 开头代表5种数据结构。

    • string:

      1. //set get
      2. string strKey = "hello";
      3. string strValue = "world";
      4. bool setResult = db.StringSet(strKey, strValue);
      5. Console.WriteLine("set " + strKey + " " + strValue + ", result is " + setResult);
      6. //incr
      7. string counterKey = "counter";
      8. long counterValue = db.StringIncrement(counterKey);
      9. Console.WriteLine("incr " + counterKey + ", result is " + counterValue);
      10. //expire
      11. db.KeyExpire(strKey, new TimeSpan(0, 0, 5));
      12. Thread.Sleep(5 * 1000);
      13. Console.WriteLine("expire " + strKey + ", after 5 seconds, value is " + db.StringGet(strKey));
      14. //mset mget
      15. KeyValuePair<RedisKey, RedisValue> kv1 = new KeyValuePair<RedisKey, RedisValue>("key1", "value1");
      16. KeyValuePair<RedisKey, RedisValue> kv2 = new KeyValuePair<RedisKey, RedisValue>("key2", "value2");
      17. db.StringSet(new KeyValuePair<RedisKey, RedisValue>[] {kv1,kv2});
      18. RedisValue[] values = db.StringGet(new RedisKey[] {kv1.Key, kv2.Key});
      19. Console.WriteLine("mget " + kv1.Key.ToString() + " " + kv2.Key.ToString() + ", result is " + values[0] + "&&" + values[1]);
    • hash

      1. string hashKey = "myhash";
      2. //hset
      3. db.HashSet(hashKey,"f1","v1");
      4. db.HashSet(hashKey,"f2", "v2");
      5. HashEntry[] values = db.HashGetAll(hashKey);
      6. //hgetall
      7. Console.Write("hgetall " + hashKey + ", result is");
      8. for (int i = 0; i < values.Length;i++)
      9. {
      10. HashEntry hashEntry = values[i];
      11. Console.Write(" " + hashEntry.Name.ToString() + " " + hashEntry.Value.ToString());
      12. }
      13. Console.WriteLine();
    • list

      1. //list key
      2. string listKey = "myList";
      3. //rpush
      4. db.ListRightPush(listKey, "a");
      5. db.ListRightPush(listKey, "b");
      6. db.ListRightPush(listKey, "c");
      7. //lrange
      8. RedisValue[] values = db.ListRange(listKey, 0, -1);
      9. Console.Write("lrange " + listKey + " 0 -1, result is ");
      10. for (int i = 0; i < values.Length; i++)
      11. {
      12. Console.Write(values[i] + " ");
      13. }
      14. Console.WriteLine();
    • set

      1. //set key
      2. string setKey = "mySet";
      3. //sadd
      4. db.SetAdd(setKey, "a");
      5. db.SetAdd(setKey, "b");
      6. db.SetAdd(setKey, "c");
      7. //sismember
      8. bool isContains = db.SetContains(setKey, "a");
      9. Console.WriteLine("set " + setKey + " contains a is " + isContains );
    • sortedset

      1. string sortedSetKey = "myZset";
      2. //sadd
      3. db.SortedSetAdd(sortedSetKey, "xiaoming", 85);
      4. db.SortedSetAdd(sortedSetKey, "xiaohong", 100);
      5. db.SortedSetAdd(sortedSetKey, "xiaofei", 62);
      6. db.SortedSetAdd(sortedSetKey, "xiaotang", 73);
      7. //zrevrangebyscore
      8. RedisValue[] names = db.SortedSetRangeByRank(sortedSetKey, 0, 2, Order.Ascending);
      9. Console.Write("zrevrangebyscore " + sortedSetKey + " 0 2, result is ");
      10. for (int i = 0; i < names.Length; i++)
      11. {
      12. Console.Write(names[i] + " ");
      13. }
      14. Console.WriteLine();
本文导读目录