c# 如何操作 redis

发布时间 - 2025-12-27 00:00:00    点击率:
首选 StackExchange.Redis 客户端,需全局复用单例 ConnectionMultiplexer 实例连接 Redis;StringSet/StringGet 仅操作 RedisValue,存对象须手动序列化;Hash/List/Set 应按语义使用对应 API;常见异常多因连接管理不当。

用 C# 操作 Redis,首选 StackExchange.Redis —— 它是目前 .NET 生态中事实标准、免费、线程安全、支持连接池和集群的成熟客户端。

怎么连上 Redis?ConnectionMultiplexer 是关键

ConnectionMultiplexer 不是“每次操作都新建连接”,而是长生命周期的单例连接管理器。它自动复用 TCP 连接、重连失败节点、处理多数据库切换。错误做法是每次 new ConnectionMultiplexer.Connect(...),这会导致连接泄漏和性能暴跌。

  • 必须全局复用一个 ConnectionMultiplexer 实例(推荐 static readonly 或 DI 注册为 Singleton)
  • 连接字符串支持多种格式:"localhost:6379""192.168.3.42:6500,password=123456,defaultDatabase=2""server1:6379,server2:6379,allowAdmin=true"
  • 首次调用 .Connect() 会阻塞直到连接就绪;建议加超时或用 .ConnectAsync() 避免启动卡死
using StackExchange.Redis;

public static class RedisHelper { private static readonly ConnectionMultiplexer _multiplexer = ConnectionMultiplexer.Connect("localhost:6379"); public static IDatabase Db => _multiplexer.GetDatabase(); }

StringSet/StringGet 为什么有时返回空?注意类型和序列化

IDatabase.StringSet()IDatabase.StringGet() 只操作原始 RedisValue,不是自动 JSON 序列化的“万能存取”。传入 string 没问题,但传 DateTimeint 或对象会隐式转成字符串(如 DateTime.Now.ToString()),读出来仍是字符串,不会自动反序列化。

  • 若需存对象,必须手动序列化:db.StringSet("user:1", JsonConvert.SerializeObject(user))
  • 读取后要手动反序列化:JsonConvert.DeserializeObject(db.StringGet("user:1"))
  • 不要依赖 StringGet() —— 这个泛型方法只对基础类型(intboolDateTime)做简单解析,且失败时静默返回默认值,极易埋坑
  • 过期时间用 TimeSpan:例如 db.StringSet("token", "abc", TimeSpan.FromMinutes(30))

Hash、List、Set 等结构怎么用?别直接拼 key 名

Redis 的数据结构操作不是“模拟 SQL”,而是按语义使用对应 API。比如用户信息用 Hash 存,就该用 HashSet/HashGetAll,而不是把整个对象塞进 StringSet

  • 哈希表(Hash)适合实体字段拆存:db.HashSet("user:1001", new HashEntry[] { new("name", "Alice"), new("age", "28") })
  • 列表(List)用于队列/栈:db.ListLeftPush("queue:mail", "mail-123") + db.ListRightPop("queue:mail")
  • 集合(Set)去重:db.SetAdd("tags:post:42", "c#", "redis", "c#") → 实际只存两个元素
  • 所有 key 命名建议带业务前缀(如 cache:user:lock:order:),避免冲突,也方便后期 KEYS cache:user:* 扫描清理

常见报错和坑:NullReferenceException / “No connection is available”

绝大多数运行时报错都源于连接管理失当,而非语法错误。

  • NullReferenceException 在调用 db.StringSet 时发生?→ 极大概率是 _multiplexer 初始化失败(密码错、端口不通、防火墙拦截),但你没捕获 Connect 异常,导致返回 null
  • No connection is available to service this operation → 连接已断开且未自动重连(常见于网络抖动或 Redis 重启后),应监听 _multiplexer.ConnectionFailed 事件并记录日志
  • 本地开发用 redis-server.exe 启动时,默认不启用密码、绑定 127.0.0.1、端口 6379;生产环境务必配 requirepassbind,否则 StackExchange.Redis 会因认证失败静默断连

真正难的不是写对一行 StringSet,而是让连接稳如磐石、序列化不丢精度、key 设计能支撑未来删查改——这些细节在压测或上线后才暴露,但补救成本远高于初期想清楚。


# word  # redis  # js  # json  # 防火墙  # 端口  #   # ai  # c#  # .net  # 为什么  # red  # sql  # Static  # String  # mail  # Token  # 字符串  # bool  # int  # 数据结构  # 泛型  # 线程  # 对象  # 事件  # this  # 数据库  # 序列化  # 复用  # 客户端  # 首次  # 它是  # 仍是  # 你没  # 管理器  # 报错 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 想要更高端的建设网站,这些原则一定要坚持!  Android实现代码画虚线边框背景效果  如何在阿里云香港服务器快速搭建网站?  网站制作免费,什么网站能看正片电影?  Laravel如何实现文件上传和存储?(本地与S3配置)  如何挑选高效建站主机与优质域名?  Laravel与Inertia.js怎么结合_使用Laravel和Inertia构建现代单页应用  php增删改查怎么学_零基础入门php数据库操作必知基础【教程】  制作电商网页,电商供应链怎么做?  Laravel怎么写单元测试_PHPUnit在Laravel项目中的基础测试入门  如何用VPS主机快速搭建个人网站?  Laravel storage目录权限问题_Laravel文件写入权限设置  laravel怎么配置Redis作为缓存驱动_laravel Redis缓存配置教程  什么是javascript作用域_全局和局部作用域有什么区别?  Win11怎么修改DNS服务器 Win11设置DNS加速网络【指南】  Laravel如何配置中间件Middleware_Laravel自定义中间件拦截请求与权限校验【步骤】  Laravel如何使用Guzzle调用外部接口_Laravel发起HTTP请求与JSON数据解析【详解】  Swift中循环语句中的转移语句 break 和 continue  Laravel全局作用域是什么_Laravel Eloquent Global Scopes应用指南  详解Android中Activity的四大启动模式实验简述  详解一款开源免费的.NET文档操作组件DocX(.NET组件介绍之一)  如何用ChatGPT准备面试 模拟面试问答与职场话术练习教程  Laravel怎么使用Intervention Image库处理图片上传和缩放  Laravel如何监控和管理失败的队列任务_Laravel失败任务处理与监控  北京网站制作公司哪家好一点,北京租房网站有哪些?  Laravel如何处理表单验证?(Requests代码示例)  如何快速生成凡客建站的专业级图册?  Laravel怎么上传文件_Laravel图片上传及存储配置  Chrome浏览器标签页分组怎么用_谷歌浏览器整理标签页技巧【效率】  Laravel怎么使用Session存储数据_Laravel会话管理与自定义驱动配置【详解】  laravel怎么通过契约(Contracts)编程_laravel契约(Contracts)编程方法  Python面向对象测试方法_mock解析【教程】  零基础网站服务器架设实战:轻量应用与域名解析配置指南  Laravel Seeder怎么填充数据_Laravel数据库填充器的使用方法与技巧  LinuxShell函数封装方法_脚本复用设计思路【教程】  如何快速查询域名建站关键信息?  VIVO手机上del键无效OnKeyListener不响应的原因及解决方法  如何自定义safari浏览器工具栏?个性化设置safari浏览器界面教程【技巧】  胶州企业网站制作公司,青岛石头网络科技有限公司怎么样?  Laravel如何集成第三方登录_Laravel Socialite实现微信QQ微博登录  Laravel如何使用Telescope进行调试?(安装和使用教程)  如何快速重置建站主机并恢复默认配置?  移动端手机网站制作软件,掌上时代,移动端网站的谷歌SEO该如何做?  Bootstrap CSS布局之列表  Laravel如何生成和使用数据填充?(Seeder和Factory示例)  Laravel如何实现全文搜索_Laravel Scout集成Algolia或Meilisearch教程  图片制作网站免费软件,有没有免费的网站或软件可以将图片批量转为A4大小的pdf?  Laravel如何与Vue.js集成_Laravel + Vue前后端分离项目搭建指南  Linux系统运维自动化项目教程_Ansible批量管理实战  javascript基于原型链的继承及call和apply函数用法分析