2

后端:推荐 2 个 .NET 操作的 Redis 客户端类库

 7 months ago
source link: https://www.51cto.com/article/769352.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

Redis ,是一个高性能(NOSQL)的key-value数据库,Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。Redis是完全开源免费的,遵守BSD协议、

Redis特点

  • 性能极高 – Redis能读的速度是110000次/s,写的速度是81000次/s 。
  • 丰富的数据类型 – Redis支持的类型 String, Hash,List, , Set 及 Ordered Set 数据类型操作。
  • 原子性 – Redis的所有操作都是原子性的,意思就是要么成功执行要么失败完全不执行。单个操作是原子性的。多个操作也支持事务,即原子性,通过MULTI和EXEC指令包起来。
  • 丰富的特性 – Redis还支持 publish/subscribe, 通知, key 过期等等特性。
  • 高速读写,redis使用自己实现的分离器,代码量很短,没有使用lock(MySQL),因此效率非常高。

Redis特点

缓存现在几乎是所有中大型网站都在用的必杀技,合理的利用缓存不仅能够提升网站访问速度,还能大大降低数据库的压力。Redis提供了键过期功能,也提供了灵活的键淘汰策略,所以,现在Redis用在缓存的场合非常多。

2、排行榜

很多网站都有排行榜应用的,如京东的月度销量榜单、商品按时间的上新排行榜等。Redis提供的有序集合数据类构能实现各种复杂的排行榜应用。

3、计数器

什么是计数器,如电商网站商品的浏览量、视频网站视频的播放数等。为了保证数据实时效,每次浏览都得给+1,并发量高时如果每次都请求数据库操作无疑是种挑战和压力。Redis提供的incr命令来实现计数器功能,内存操作,性能非常好,非常适用于这些计数场景。

4、分布式会话

集群模式下,在应用不多的情况下一般使用容器自带的session复制功能就能满足,当应用增多相对复杂的系统中,一般都会搭建以Redis等内存数据库为中心的session服务,session不再由容器管理,而是由session服务及内存数据库管理。

5、分布式锁

在很多互联网公司中都使用了分布式技术,分布式技术带来的技术挑战是对同一个资源的并发访问,如全局ID、减库存、秒杀等场景,并发量不大的场景可以使用数据库的悲观锁、乐观锁来实现,但在并发量高的场合中,利用数据库锁来控制资源的并发访问是不太理想的,大大影响了数据库的性能。可以利用Redis的setnx功能来编写分布式的锁,如果设置返回1说明获取锁成功,否则获取锁失败,实际应用中要考虑的细节要更多。

6、 社交网络

点赞、踩、关注/被关注、共同好友等是社交网站的基本功能,社交网站的访问量通常来说比较大,而且传统的关系数据库类型不适合存储这种类型的数据,Redis提供的哈希、集合等数据结构能很方便的的实现这些功能。

7、最新列表

Redis列表结构,LPUSH可以在列表头部插入一个内容ID作为关键字,LTRIM可用来限制列表的数量,这样列表永远为N个ID,无需查询最新的列表,直接根据ID去到对应的内容页即可。

8、消息系统

消息队列是大型网站必用中间件,如ActiveMQ、RabbitMQ、Kafka等流行的消息队列中间件,主要用于业务解耦、流量削峰及异步处理实时性低的业务。Redis提供了发布/订阅及阻塞队列功能,能实现一个简单的消息队列系统。另外,这个不能和专业的消息中间件相比。

今天给大家分享3 款 .NET 流行的 Redis 客户端类库。

1. StackExchange.Redis

StackExchange.Redis是一款.NET平台上的高性能、异步的Redis客户端类库,由StackExchange团队开发。

官网:https://github.com/StackExchange/StackExchange.Redis

图片

图片

StackExchange.Redis通过使用异步方法和IO多路复用等技术,提高了Redis访问的性能和并发性。它还提供了丰富的功能和选项,如连接池、管道、事务、发布/订阅、Lua脚本等,支持多种序列化和压缩方式,可以轻松地与其他.NET应用程序集成。

StackExchange.Redis还支持Redis Sentinel和Redis Cluster等高可用性和集群方案,使得应用程序可以更容易地管理和扩展Redis实例。它是.NET平台上操作Redis数据库的最优秀的客户端类库。

使用示例:

首先,需要在项目中安装 StackExchange.Redis 包,

图片

图片

可以通过 NuGet 管理器来安装,也可以手动下载安装。

然后,在代码中创建 ConnectionMultiplexer 对象,这个对象代表与 Redis 服务器的连接。通常来说,应该只创建一个 ConnectionMultiplexer 对象,然后在需要访问 Redis 数据库时使用它。

using StackExchange.Redis;
//初始化
ConnectionMultiplexer _conn = RedisConnectionHelp.Instance;
var database = _conn.GetDatabase(0);//指定连接的库 0

简单使用方法

//设置StringSet(key, value)
database.StringSet("name", "小明");
string str = database.StringGet("name");//输出结果:小明
//设置时间,30s后过期。
database.StringSet("name_two", str, TimeSpan.FromSeconds(30));

除了字符串之外,StackExchange.Redis 还支持许多其他 Redis 数据类型,比如哈希表、列表、集合和有序集合。可以使用相应的 API 来执行相关的操作,比如:

// 操作hash表
string json = JsonConvert.SerializeObject(demo);//序列化
database.HashSet("user", "cang", json);
database.HashSet("user", "shan", json);
database.HashSet("user", "yun", json);
//获取Model
string hashcang = database.HashGet("user", "cang");
demo = JsonConvert.DeserializeObject<Demo>(hashcang);//反序列化




//获取List
RedisValue[] values = database.HashValues("user");//获取所有value
IList<Demo> demolist = new List<Demo>();
foreach (var item in values)
{
    Demo hashmodel = JsonConvert.DeserializeObject<Demo>(item);
    demolist.Add(hashmodel);
}

2. FreeRedis

基于 .NET 的 Redis 客户端,支持 .NET Core 2.1+、.NET Framework 4.0+ 以及 Xamarin。

  • 所有方法名与 redis-cli 保持一致
  • 支持 Redis 集群(服务端要求 3.2 及以上版本)
  • 支持 Redis 哨兵模式
  • 支持主从分离(Master-Slave)
  • 支持发布订阅(Pub-Sub)
  • 支持 Redis Lua 脚本
  • 支持管道(Pipeline)
  • 支持 GEO 命令(服务端要求 3.2 及以上版本)
  • 支持 STREAM 类型命令(服务端要求 5.0 及以上版本)
  • 支持本地缓存(Client-side-cahing,服务端要求 6.0 及以上版本)
  • 支持 Redis 6 的 RESP3 协议

🚀 快速入门

public static RedisClient cli = 
new RedisClient("127.0.0.1:6379,password=123,defaultDatabase=12");
//打印命令日志
cli.Notice += (s, e) => Console.WriteLine(e.Log); 
cli.Set("name", "小明");
cli.MSet("name", "小明", "age", 33);
string value1 = cli.Get("name");
string[] vals = cli.MGet("name", "age");

🎣 Master-Slave (读写分离)

public static RedisClient cli = new RedisClient(
"127.0.0.1:6379,password=123,defaultDatabase=11",
"127.0.0.1:6380,password=123,defaultDatabase=11",
"127.0.0.1:6381,password=123,defaultDatabase=11"
);
var value = cli.Get("name");

💻 Pipeline (管道)示例

using (var pipe = cli.StartPipe())
{
pipe.IncrBy("age", 50);
pipe.Set("name", );
pipe.Get("age");


object[] ret = pipe.EndPipe();
Console.WriteLine(ret[0] + ", " + ret[2]);
}

🌌 Redis Cluster (集群)

假如你有一个 Redis Cluster 集群,其中有三个主节点(7001-7003)、三个从节点(7004-7006),则连接此集群的代码:

public static RedisClient cli = new RedisClient(
new ConnectionStringBuilder[] { "192.168.0.2:7001"
, "192.168.0.2:7002", "192.168.0.2:7003" }
);

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK