隐藏页面特效

Redis在.net 环境下的使用

Redis概念

        Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)。在此基础上,redis支持各种不同方式的排序。与memcached一样,为了保证效率,数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。

        Redis支持主从同步。数据可以从主服务器向任意数量的从服务器上同步,从服务器可以是关联其他从服务器的主服务器。这使得Redis可执行单层树复制。存盘可以有意无意的对数据进行写操作。

1|0Redis 与 Memcached 区别


  • Memcached是多线程,而Redis使用单线程。(个人认为Memcached在读写处理速度上由于Redis)
  • Memcached使用预分配的内存池的方式,Redis使用现场申请内存的方式来存储数据,并且可以配置虚拟内存。
  • Redis可以实现持久化(也就是说redis需要经常将内存中的数据同步到硬盘中来保证持久化),主从复制,实现故障恢复。
  • Memcached只是简单的key与value,但是Redis支持数据类型比较多。包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)。

Redis支持两种持久化方式:

   (1):snapshotting(快照)也是默认方式.(把数据做一个备份,将数据存储到文件)

   (2)Append-only file(缩写aof)的方式 

   快照是默认的持久化方式,这种方式是将内存中数据以快照的方式写到二进制文件中,默认的文件名称为dump.rdb.可以通过配置设置自动做快照持久化的方式。我们可以配置redis在n秒内如果超过m个key键修改就自动做快照.

   aof方式:由于快照方式是在一定间隔时间做一次的,所以如果redis意外down掉的话,就会丢失最后一次快照后的所有修改。aof比快照方式有更好的持久化性,是由于在使用aof时,redis会将每一个收到的写命令都通过write函数追加到文件中,当redis重启时会通过重新执行文件中保存的写命令来在内存中重建整个数据库的内容。 

2|0Windows环境下Redis的安装


windows版本redis下载地址:https://github.com/microsoftarchive/redis/releases

Redis服务端安装  

点击安装文件安装以后,打开本地服务管理器,并启动redis相关服务

 

 

打开redis的安装目录文件

用vs打开 redis.windows-service.conf 可以看到相关配置,如redis服务的端口信息

 

 

 

 

3|0在.net开发环境(客户端)中使用 Redis


 我们创建一个项目,控制台程序或者web程序都可以。然后通过vs的nuget程序包管理工具安装  stackExchange.Redis 包

 

安装以后创建一个 RedisHelper.cs 帮助类,帮助类代码如下:

/// <summary> /// Redis读写帮助类 /// </summary> public class RedisHelper { private string RedisConnectionStr = ConfigurationManager.AppSettings["RedisConnectionStr"]; private ConnectionMultiplexer redis { get; set; } private IDatabase db { get; set; } public RedisHelper() { redis = ConnectionMultiplexer.Connect(RedisConnectionStr); db = redis.GetDatabase(); } #region string类型操作 /// <summary> /// set or update the value for string key /// </summary> /// <param name="key"></param> /// <param name="value"></param> /// <returns></returns> public bool SetStringValue(string key, string value) { return db.StringSet(key, value); } /// <summary> /// 保存单个key value /// </summary> /// <param name="key">Redis Key</param> /// <param name="value">保存的值</param> /// <param name="expiry">过期时间</param> /// <returns></returns> public bool SetStringKey(string key, string value, TimeSpan? expiry = default(TimeSpan?)) { return db.StringSet(key, value, expiry); } /// <summary> /// 保存一个对象 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="key"></param> /// <param name="obj"></param> /// <returns></returns> public bool SetStringKey<T>(string key, T obj, TimeSpan? expiry = default(TimeSpan?)) { string json = JsonHelper.SerializeObject(obj); return db.StringSet(key, json, expiry); } /// <summary> /// 获取一个key的对象 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="key"></param> /// <returns></returns> public T GetStringKey<T>(string key) where T : class { var result= db.StringGet(key); if (string.IsNullOrEmpty(result)) { return null; } try { return JsonHelper.DeserializeObject<T>(result); } catch { return null; } } /// <summary> /// get the value for string key /// </summary> /// <param name="key"></param> /// <returns></returns> public string GetStringValue(string key) { return db.StringGet(key); } /// <summary> /// Delete the value for string key /// </summary> /// <param name="key"></param> /// <returns></returns> public bool DeleteStringKey(string key) { return db.KeyDelete(key); } #endregion #region 哈希类型操作 /// <summary> /// set or update the HashValue for string key /// </summary> /// <param name="key"></param> /// <param name="hashkey"></param> /// <param name="value"></param> /// <returns></returns> public bool SetHashValue(string key, string hashkey, string value) { return db.HashSet(key, hashkey, value); } /// <summary> /// set or update the HashValue for string key /// </summary> /// <typeparam name="T"></typeparam> /// <param name="key"></param> /// <param name="hashkey"></param> /// <param name="t">defined class</param> /// <returns></returns> public bool SetHashValue<T>(String key, string hashkey, T t) where T : class { var json = JsonHelper.SerializeObject(t); return db.HashSet(key, hashkey, json); } /// <summary> /// 保存一个集合 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="key">Redis Key</param> /// <param name="list">数据集合</param> /// <param name="getModelId"></param> public void HashSet<T>(string key, List<T> list, Func<T, string> getModelId) { List<HashEntry> listHashEntry = new List<HashEntry>(); foreach (var item in list) { string json = JsonHelper.SerializeObject(item); listHashEntry.Add(new HashEntry(getModelId(item), json)); } db.HashSet(key, listHashEntry.ToArray()); } /// <summary> /// 获取hashkey所有的值 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="key"></param> /// <returns></returns> public List<T> HashGetAll<T>(string key) where T : class { List<T> result = new List<T>(); HashEntry[] arr = db.HashGetAll(key); foreach (var item in arr) { if (!item.Value.IsNullOrEmpty) { T t; if (JsonHelper.DeserializeJsonToObject<T>(item.Value,out t)) { result.Add(t); } } } return result; //result =JsonHelper.DeserializeJsonToList<T>(arr.ToString()); //return result; } /// <summary> /// get the HashValue for string key and hashkey /// </summary> /// <param name="key">Represents a key that can be stored in redis</param> /// <param name="hashkey"></param> /// <returns></returns> public RedisValue GetHashValue(string key, string hashkey) { RedisValue result = db.HashGet(key, hashkey); return result; } /// <summary> /// get the HashValue for string key and hashkey /// </summary> /// <param name="key">Represents a key that can be stored in redis</param> /// <param name="hashkey"></param> /// <returns></returns> public T GetHashValue<T>(string key, string hashkey) where T : class { RedisValue result = db.HashGet(key, hashkey); if (string.IsNullOrEmpty(result)) { return null; } T t; if (JsonHelper.DeserializeJsonToObject<T>(result,out t)) { return t; } return null; } /// <summary> /// delete the HashValue for string key and hashkey /// </summary> /// <param name="key"></param> /// <param name="hashkey"></param> /// <returns></returns> public bool DeleteHashValue(string key, string hashkey) { return db.HashDelete(key, hashkey); } #endregion }

写一个方法来测试使用Redis

namespace RedisDemo.Controllers { public class HomeController : Controller { public ActionResult Index() { RedisHelper redis = new RedisHelper(); redis.SetStringKey("Name", "ccc"); string Name= redis.GetStringValue("Name"); redis.SetStringKey<List<string>>("list", new List<string> { "dada", "daccz", "ccc" }); return View(); } } }

 

 我们分别插入了一个string类型和list类型的数据

然后通过redis的客户端工具来看看是否能获取到刚才插入的数据

 


__EOF__

本文作者DaiWK
本文链接https://www.cnblogs.com/daiwk/p/11171195.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   DaiWK  阅读(2853)  评论(1编辑  收藏  举报
编辑推荐:
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)
点击右上角即可分享
微信分享提示