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,尽管即使如此软件也能被写出来,然而软件内部代码的组织方式却是不科学的,这会影响到软件的可维护性 ...
随机推荐
- C# list中ConvertAll的使用
static double TakeSquareRoot(int x) { //return Math.Sqrt(x); ; } static void Main(string[] args) { L ...
- 【转】spring framework 5以前体系结构及内部各模块jar之间的maven依赖关系
作者:凌承一 出处:http://www.cnblogs.com/ywlaker/ 很多人都在用spring开发java项目,但是配置maven依赖的时候并不能明确要配置哪些spring的jar, ...
- SSH(三)
在Spring中引用属性文件: 优点: 1.防止随意更改jdbc的连接 2.给不懂代码的人使用 步骤: 1.数据库连接信息写在属性文件中 ...
- Netty学习(1):IO模型之BIO
概述 Netty其实就是一个异步的.基于事件驱动的框架,其作用是用来开发高性能.高可靠的IO程序. 因此下面就让我们从Java的IO模型来逐步深入学习Netty. IO模型 IO模型简单来说,就是采用 ...
- C陷阱与缺陷学习笔记
导读 程序是由符号(token)序列所组成的,将程序分解成符号的过程,成为"词法分析". 符号构成更大的单元--语句和声明,语法细节最终决定了语义. 词法陷阱 符号(token)指 ...
- gentoo在KVM+QEMU中安装笔记
gentoo是比较难安装的,本笔记主要是记录本次安装过程,以备参考. 1.首先,下载镜像,可以去国内各大镜像网站下载,我选择的是清华的镜像源:https://mirrors.tuna.tsinghua ...
- web前端sprite,精灵图,雪碧图
css sprite 俗称:精灵图,雪碧图,指将整个页面不同的图片or图标合并在一张图上:优点:使用CSS Sprite 可以减少网络请求,提高网页加载性能,不会出现网页上端加载完毕下面还在加载中这一 ...
- 【搞定面试官】- Synchronized如何实现同步?锁优化?(1)
前言 说起Java面试中最高频的知识点非多线程莫属.每每提起多线程都绕不过一个Java关键字--synchronized.我们都知道该关键字可以保证在同一时刻,只有一个线程可以执行某个方法或者某个代码 ...
- CCF_ 201403-2_窗口
用deque模拟. #include<iostream> #include<cstdio> #include<deque> using namespace std; ...
- 一口气说出 9种 分布式ID生成方式,面试官有点懵了
整理了一些Java方面的架构.面试资料(微服务.集群.分布式.中间件等),有需要的小伙伴可以关注公众号[程序员内点事],无套路自行领取 本文作者:程序员内点事 原文链接:https://mp.weix ...