Basic usage
Whenever possible, server responses are mapped to the appropriate CLR type. using (var redis = new RedisClient("yourhost"))//只需输入redis 服务器的ip 端口默认为 6379
{
string ping = redis.Ping();
string echo = redis.Echo("hello world");
DateTime time = redis.Time();
}
Asynchronous commands are also available. using (var redis = new RedisClient("localhost"))
{
// fire-and-forget: results are not captured
for (int i = ; i < ; i++)
{
redis.IncrAsync("test1");
} // callback via ContinueWith: Ping is executed asyncronously, and when a result is ready, the response is printed to screen.
redis.TimeAsync().ContinueWith(t => Console.WriteLine(t.Result)); // blocking call
string result = redis.GetAsync("test1").Result;
}
Use the IRedisClient or IRedisClientAsync interfaces to use synconous or asyncronous methods exclusively. using (IRedisClient csredis = new RedisClient(Host))
{
// only syncronous methods exposed
} using (IRedisClientAsync csredis = new RedisClient(Host))
{
// only asyncronous methods exposed
}
Pipelining
CSRedis supports pipelining commands to lessen the effects of network overhead on sequential server calls. To enable pipelining, wrap a group of commands between StartPipe() and EndPipe(). Note that redis-server currently has a 1GB limit on client buffers but CSRedis does not enforce this. Similar performance gains may be obtained by using the deferred Task/Asyncronous methods. using (var redis = new RedisClient("localhost"))
{
redis.StartPipe();
var empty1 = redis.Echo("hello"); // returns immediately with default(string)
var empty2 = redis.Time(); // returns immediately with default(DateTime)
object[] result = redis.EndPipe(); // all commands sent to the server at once
var item1 = (string)result[]; // cast result objects to appropriate types
var item2 = (DateTime)result[]; // automatic MULTI/EXEC pipeline: start a pipe that is also a MULTI/EXEC transaction
redis.StartPipeTransaction();
redis.Set("key", "value");
redis.Set("key2", "value2");
object[] result2 = redis.EndPipe(); // transaction is EXEC'd automatically if DISCARD was not called first // DISCARD pipelined transaction
redis.StartPipeTransaction();
redis.Set("key", );
redis.Set("key2", "abc");
redis.Discard();
}
Why csredis?
There are a handful of .NET redis clients in active development, but none quite suited my needs: clean interface of the native Redis API; Sentinel support; easy-to-use pipelining/async. If there are gaps between CSRedis and another implementation please open an Issue or Pull Request. Authentication
Password authentication is handled according to the native API (i.e. not in the connection constructor): redis.Auth("mystrongpasword");
Reconnecting
CSRedis supports a simple reconnect option to handle dropped connections to the same Redis host. See RedisSentinelManager for a fuller implementation between multiple masters. using (var redis = new RedisClient("localhost"))
{
redis.Connected += (s, e) => redis.Auth(Password); // set AUTH, CLIENT NAME, etc
redis.ReconnectAttempts = ;
redis.ReconnectWait = ;
// connection will retry 3 times with 200ms in between before throwing an Exception
}
Flexible hash mapping
Pass any POCO or anonymous object to the generic hash methods:
//批量设置值
redis.HMSet("myhash", new
{
Field1 = "string",
Field2 = true,
Field3 = DateTime.Now,
});
//批量取值
string[] a = new string[] { "Field1", "Field2", "Field3" };
redis.HMGet("myhash", a);
// 强类型映射
MyPOCO hash = redis.HGetAll<MyPOCO>("my-hash-key");
Or use a string Dictionary: redis.HMSet("mydict", new Dictionary<string, string>
{
{ "F1", "string" },
{ "F2", "true" },
{ "F3", DateTime.Now.ToString() },
}); Dictionary<string, string> mydict = redis.HGetAll("my-hash-key");
Or use the native API: redis.HMSet("myhash", new[] { "F1", "string", "F2", "true", "F3", DateTime.Now.ToString() });
Transactions
Synchronous transactions are handled using the API calls MULTI/EXEC/DISCARD. Attach an event handler to RedisClient.TransactionQueued event to observe server queue replies (typically 'OK'). When inside of a transaction, command return values will be default(T). redis.TransactionQueued += (s, e) =>
{
Console.WriteLine("Transaction queued: {0}({1}) = {2}", e.Command, String.Join(", ", e.Arguments), e.Status);
};
redis.Multi();
var empty1 = redis.Set("test1", "hello"); // returns default(String)
var empty2 = redis.Set("test2", "world"); // returns default(String)
var empty3 = redis.Time(); // returns default(DateTime)
object[] result = redis.Exec();
var item1 = (string)result[];
var item2 = (string)result[];
var item3 = (DateTime)result[];
Subscription model
The subscription model is event based. Attach a handler to one or both of SubscriptionChanged/SubscriptionReceived to receive callbacks on subscription events. Opening the first subscription channel blocks the main thread, so unsubscription (and new subscriptions) must be handled by a background thread/task. SubscriptionChanged: Occurs when a subsciption channel is opened or closed
RedisSubscriptionReceived: Occurs when a subscription message has been received Example: redis.SubscriptionChanged += (s, e) =>
{
Console.WriteLine("There are now {0} open channels", e.Response.Count);
};
redis.SubscriptionReceived += (s, e) =>
{
Console.WriteLine("Message received: {0}", e.Message.Body);
};
redis.PSubscribe("*");
Future-proof
CSRedis exposes a basic Call() method that sends arbitrary commands to the Redis server. Use this command to easily implement future Redis commands before they are included in CSRedis. This can also be used to work with "bare-metal" server responses or if a command has been renamed in redis.conf. object resp = redis.Call("ANYTHING", "arg1", "arg2", "arg3");
Note that the response object will need to be cast according to the Redis unified protocol: status (System.String), integer (System.Int64), bulk (System.String), multi-bulk (System.Object[]). Streaming responses
For large result sizes, it may be preferred to stream the raw bytes from the server rather than allocating large chunks of memory in place. This can be achieved with RedisClient.StreamTo(). Note that this only applies to BULK responses (e.g. GET, HGET, LINDEX, etc). Attempting to stream any other response will result in an InvalidOperationException. Here is an example that stores the response in a MemoryStream bytes at a time. A more useful example might use a FileStream and a larger buffer size. redis.Set("test", new string('x', )); // 1MB string
using (var ms = new MemoryStream())
{
redis.StreamTo(ms, , r => r.Get("test")); // read in small 64 byte blocks
byte[] bytes = ms.ToArray(); // optional: get the bytes if needed
}
Tracing
Use .NET tracing to expose low level TCP messages Sentinel
RedisSentinelManager is a managed connection that will automatically obtain a connection to a Redis master node based on information from one or more Redis Sentinel nodes. Async methods coming soon using (var sentinel = new RedisSentinelManager("host1:123", "host2:456"))
{
sentinel.Add(Host); // add host using default port
sentinel.Add(Host, ); // add host using specific port
sentinel.Connected += (s, e) => sentinel.Call(x => x.Auth(Password)); // this will be called each time a master connects
sentinel.Connect("mymaster"); // open connection
var test2 = sentinel.Call(x => x.Time()); // use the Call() lambda to access the current master connection
}
© GitHub, Inc.

csredis base usage的更多相关文章

  1. StickyListHeaders的使用

    我们知道在ios中字母的导航有悬停的效果,在android中,git上有大神实现了这种悬停的功能,我们只要将普通的Listview改为StickyListHeadersListView然后设置adap ...

  2. C++11智能指针 share_ptr,unique_ptr,weak_ptr用法

    0x01  智能指针简介  所谓智能指针(smart pointer)就是智能/自动化的管理指针所指向的动态资源的释放.它是存储指向动态分配(堆)对象指针的类,用于生存期控制,能够确保自动正确的销毁动 ...

  3. Python 处理脚本的命令行参数(三):使用argparse

    # coding:utf-8 # 测试argparse模块的基本用法 import argparse # 创建参数解析对象,并添加脚本用法帮助 parser = argparse.ArgumentPa ...

  4. $python打包工具pyinstaller的用法

    pyinstaller是一个很好用的python打包工具,在Windows环境下可以将python脚本打包成一个exe可执行文件,并且脚本中所依赖的各种第三方库在打包时候都会被统一处理到一起,这样打包 ...

  5. $命令行参数解析模块argparse的用法

    argparse是python内置的命令行参数解析模块,可以用来为程序配置功能丰富的命令行参数,方便使用,本文总结一下其基本用法. 测试脚本 把以下脚本存在argtest.py文件中: # codin ...

  6. Python3常用模块的安装

    1.mysql驱动:mysql-connector-python 1.安装 $ pip3 install mysql-connector-python --allow-external mysql-c ...

  7. C++11 新特性之智能指针(shared_ptr, unique_ptr, weak_ptr)

    这是C++11新特性介绍的第五部分,涉及到智能指针的相关内容(shared_ptr, unique_ptr, weak_ptr). shared_ptr shared_ptr 基本用法 shared_ ...

  8. maven install

    1. install maven under ubuntu apt install maven 2 speed up package download vim ~/.m2/settings.xml & ...

  9. [转]Dynamic SQL & Stored Procedure Usage in T-SQL

    转自:http://www.sqlusa.com/bestpractices/training/scripts/dynamicsql/ Dynamic SQL & Stored Procedu ...

随机推荐

  1. typescript泛型类 泛型方法

    /* 泛型:软件工程中,我们不仅要创建一致的定义良好的API,同时也要考虑可重用性. 组件不仅能够支持当前的数据类型,同时也能支持未来的数据类型,这在创建大型系统时为你提供了十分灵活的功能. 在像C# ...

  2. MySQL 索引建立原则及注意事项

    一.索引建立的几大原则: 1) 最左前缀匹配原则,非常重要的原则,mysql会一直向右匹配直到遇到范围查询(>.<.between.like)就停止匹配,比如a = 1 and b = 2 ...

  3. 实用JS代码

    浏览器功能 1.0 浏览器判断 如下代码判断是手机还是电脑访问的网站 function IsPC () { var userAgentInfo = navigator.userAgent var Ag ...

  4. C#多线程学习笔记之(abort与join配合使用)

    今天刚开始学多线程,尽管以前用过一点点,但是只是照着网上代码抄,没有真正理解,现在回过头来想研究研究,慢慢弄懂,下面就是我在网上所找资料的例子,相信大家都看过,做了小点改动 View Code nam ...

  5. 安装memcache集群管理工具

    安装memcache集群管理工具magent 一.安装libevent tar xf libevent--stable.tar.gz cd libevent- ./configure --prefix ...

  6. flask-日料网站搭建-ajax传值+返回json字符串

    引言:想使用python的flask框架搭建一个日料网站,主要包含web架构,静态页面,后台系统,交互,今天教大家实现ajax操作,返回json. 本节知识:jquery,json,ajax pyth ...

  7. MySQL完整性约束foreign key与表操作。

    一  MySQL中表的完整性约束: 我们首先知道约束条件跟类型的宽度一样,都是可选的,也就是说,我们在创建表的时候可以不指定,但是为了创建的表更加的完整,我们一般会加一些约束条件,name下面我们讲一 ...

  8. 剑指Offer(四):重建二叉树

    说明: 1.本系列是根据<剑指Offer>这个系列做的一个小笔记. 2.直接动力是因为师兄师姐找工作很难,而且机械出生的我面试算法更难. 3.刚开始准备刷LeetCode.LintCode ...

  9. python2和python3的内存使用情况

    python2 对回收后的整数复用内存不作处理 python3则改进了改设计,极大的减少了内存占用 例如 a = range(1000000000000) del a 此时: python2 对于a占 ...

  10. ChannelSftp 远程下载目录

    ChannelSftp 并不直接支持远程下载目录, 直接下载, 出现 : not supported to get directory ... 需要自己实现, 我的实现如下: /** * @param ...