StackExchange.Redis 系列 1:基础使用
本系列博文已经全部完成,完整系列请访问:https://blog.zhuliang.ltd/tags/StackExchange-Redis%E7%B3%BB%E5%88%97/
本文转自:https://blog.zhuliang.ltd/2020/01/redis/StackExchangeRedis-BasicUsage.html
- 本系列博文是“伪”官方文档翻译,并非完全将官方文档进行翻译,而是我在查阅、测试原始文档并转换为自己东西后进行的“准”翻译。
- 原始文档见此:https://stackexchange.github.io/StackExchange.Redis/
- 本系列本博文基于 redis 5.0.6,系列中部分博文跟官方文档有出入,有不同见解 / 说明不当的地方,还请大家不吝拍砖。
ConnectionMultiplexer 说明
命名空间位于:StackExchange.Redis.ConnectionMultiplexer
- ConnectionMultiplexer 是 StackExchange.Redis 的核心对象,内部继承了 IDisposable,但建议不要用 using 以便可以愉快重用,你就认为它足够安全吧。
- 该对象线程安全,且应该被重用,搞成单例即可,不要每次操作都创建一个。
主从库示例:
ConnectionMultiplexer redis = ConnectionMultiplexer.Connect("server1:6379,server2:6379");
项目中调用实例
说明:示例基于 .NET CORE 2.1,通过 IoC 进行注入,生命周期为“单例”。
如果不通过 IoC 的话建议直接使用“单例模式”。
public class RedisClient : ICache
{
private readonly RedisSettings _redisSettings;
private static IDatabaseAsync _db;
public RedisClient(IOptions<RedisSettings> redisSettings)
{
_redisSettings = redisSettings.Value;
var redis = ConnectionMultiplexer.Connect($"{_redisSettings.Address}:{_redisSettings.Port}");
_db = redis.GetDatabase(_redisSettings.DataBase);
}
#region Implementation of ICache
public async Task<bool> SetStringAsync(string key, string content)
{
return true;
}
public async Task<string> GetStringAsync(string key)
{
var result = await _db.StringGetAsync(key);
return result;
}
#endregion
}
其他一些建议和说明
- StackExchange.Redis 有 3种主要使用机制:
- 同步
- 异步:建议优先使用异步方法而不是同步方法。
- 即发即忘(Fire-And-Forget):当你不需要响应结果的时候,可以使用这种机制,被调用方法会立马返回,但操作会在后台进行执行。。
- “即发即忘”机制补充:StackExchange.Redis 的方法中都有 CommandFlags 枚举,默认值是 “None”,当你需要使用“即发即忘”机制的时候,需要在方法上显示指定 CommandFlags.FireAndForget,需要注意:
- 如果返回值是一个字符串类型,则将总是返回 null。
- 如果返回值是一个 Int64 类型,则将总是返回 0。
- 需要注意的是,如果返回值是一个 boolean,则返回的是 false(但操作是成功的,此时不要用该返回值作为你后续业务的判断依据)。
db.StringIncrement(cacheKey, flags: CommandFlags.FireAndForget);
- StackExchange.Redis.IDatabase 的一些方法,是根据 Redis 的数据类型来进行命名的,如 IDatabase.StringGet,这里的 StringGet 表示的是获取一个 String ,跟 C# 中的字符串并非表示同一个东西,可参考:关于 Redis 的数据类型。
发布/订阅
- 发布/订阅不需要指定 database
例子:
客户端
private readonly RedisSettings _redisSettings;
private static IDatabaseAsync _db;
private static ConnectionMultiplexer _redis;
public RedisClient(IOptions<RedisSettings> redisSettings)
{
_redisSettings = redisSettings.Value;
_redis = ConnectionMultiplexer.Connect($"{_redisSettings.Address}:{_redisSettings.Port}");
_db = _redis.GetDatabase(_redisSettings.DataBase);
}
public async Task Subscribe(string channel, Action<RedisChannel, RedisValue> fun)
{
var sub = _redis.GetSubscriber();
await sub.SubscribeAsync(channel, fun);
}
public async Task Publish(string channel, string message)
{
var sub = _redis.GetSubscriber();
await sub.PublishAsync(channel, message);
}
订阅者
class Program
{
static void Main(string[] args)
{
var builder = new ConfigurationBuilder().AddJsonFile("appsettings.json");
var configuration = builder.Build();
var subscriber = configuration["Subscriber"];
var settings = configuration.GetSection("RedisSettings").Get<RedisSettings>();
var redisClient = new RedisClient(settings);
redisClient.Subscribe(settings.ChannelName, (channel, message) =>
{
System.Console.WriteLine($"{subscriber}:{message}");
}).Wait();
System.Console.WriteLine("started");
System.Console.ReadKey();
}
}
测试效果:
服务器命令
若要使用服务器命令,需要通过 ConnectionMultiplexer 对象获取 Server 对象,如下:
var server = _redis.GetServer($"{_redisSettings.Address}:{_redisSettings.Port},allowAdmin=true");
server.ScriptExists("scripts here");
目前支持的方法如下
StackExchange.Redis 系列 1:基础使用的更多相关文章
- 一、redis系列之基础知识与centos下环境搭建
1. Redis 与其他 key - value 缓存产品有以下三个特点: Redis支持数据的持久化,可以将内存中的数据保持在磁盘中,重启的时候可以再次加载进行使用. Redis不仅仅支持简单的ke ...
- Redis系列(一)--基础API
Redis:Remote Dictionary Server 是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库.缓存和消息中间件.C语言实现,单线程 Redis特性: 1.速度快 ...
- StackExchange.Redis帮助类解决方案RedisRepository封装(基础配置)
本文版权归博客园和作者吴双本人共同所有,转载和爬虫,请注明原文地址.http://www.cnblogs.com/tdws/p/5815735.html 写在前面 这不是教程,分享而已,也欢迎园友们多 ...
- Redis系列(一)StackExchange.Redis的使用
Redis系列(一)StackExchange.Redis的使用 一.DLL安装 用NuGet搜索StackExchange.Redis,然后下载就可以. ConnectionMultiplexer对 ...
- Redis 系列 (一) StackExchange.Redis的使用
一.DLL安装 用NuGet搜索StackExchange.Redis,然后下载就可以. ConnectionMultiplexer对象是StackExchange.Redis最中枢的对象.这个类的实 ...
- RedisRepository封装—Redis发布订阅以及StackExchange.Redis中的使用
本文版权归博客园和作者本人吴双共同所有,转载请注明本Redis系列分享地址.http://www.cnblogs.com/tdws/tag/NoSql/ Redis Pub/Sub模式 基本介绍 Re ...
- StackExchange.Redis帮助类解决方案RedisRepository封装(字符串类型数据操作)
本文版权归博客园和作者本人共同所有,转载和爬虫请注明原文链接 http://www.cnblogs.com/tdws/tag/NoSql/ 目录 一.基础配置封装 二.String字符串类型数据操作封 ...
- StackExchange.Redis 二次封装
在NuGet直接搜索StackExchange.Redis,下载引用包: 帮助类: public class RedisUtils { /// <summary> /// redis配置文 ...
- 深入理解MVC C#+HtmlAgilityPack+Dapper走一波爬虫 StackExchange.Redis 二次封装 C# WPF 用MediaElement控件实现视频循环播放 net 异步与同步
深入理解MVC MVC无人不知,可很多程序员对MVC的概念的理解似乎有误,换言之他们一直在错用MVC,尽管即使如此软件也能被写出来,然而软件内部代码的组织方式却是不科学的,这会影响到软件的可维护性 ...
随机推荐
- 基于spring cloud OAuth2的微服务授权验证服务搭建的一些坑, 包括401,client_secret,invalid_scope等问题
一 先贴成功图,用的是springcloud Finchley.SR1版本,springboot版本2.0.6 问题一: 返回401, Unauthorized 出现这个问题原因很多:首先确保方法开启 ...
- Python里的装饰器
装饰器 装饰器是干什么用的? 装饰器可以在不修改某个函数的情况下,给函数添加功能. 形象点来说,从前有一个王叔叔,他一个人住在家里,每天打扫家,看书.于是定义如下一个函数: def uncle_wan ...
- 迭代器中set的使用
今天对迭代器中的set方法进行了一下简单的使用,由于之前使用过list方法,所以将他与list进行了一下对比. list中加入对象时不会进行查重,也就是只要是一个符合的对象就可以加到list中,而对于 ...
- 谷歌翻译API
http://translate.google.cn/translate_a/t?client=t&text=你好&hl=zh-CN&sl=zh-CN&tl=en&am ...
- python UnicodeDecodeError: 'gbk' codec can't decode byte 0x99 in position 87: illegal multibyte sequence异常解决
我们处理文本文件时,经常会遇到这样的报错: UnicodeDecodeError: 'gbk' codec can't decode byte 0x99 in position 87: illegal ...
- Pycharm2018.3.5永久破解
声明:不做商业用途,电脑系统win10专业版,亲测有效. 首先:可以先去lookdiv.com钥匙:lookdiv.com去使用更新的激活码,免费版的有效期待考量. 或者:可以下面方式破解 注意:破解 ...
- It is possible and safe to monitor a table DML history on sqlserver
He is my test step: In a test enviroument, I make a table "test"/ demo table:create table ...
- 11g与12c启动,关闭RAC
oracle11g 关闭,启动顺序 1.关闭数据库(oracle)srvctl stop database -d rac 2.关闭集群(root)crsctl stop cluster -all 3. ...
- mongodb 配置文件解释(转)
Mongodb 3.x配置说明,本文内容忽略了Enterprise版和一些不常用的配置. 一.配置说明 在Mongod安装包中,包含2个进程启动文件:mongod和mongos:其中mongd是核心基 ...
- python学习(1)python的基本概念
1.python是世界上最流行的程序语言之一,用途广泛. 2.python是解释型语言,与C++编译类语言相比,python扩展性强,简单易上手.但是缺点也很明显,执行速度慢. 3.python定义中 ...