Redis在.net 环境下的使用
Redis概念
Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)。在此基础上,redis支持各种不同方式的排序。与memcached一样,为了保证效率,数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。
Redis支持主从同步。数据可以从主服务器向任意数量的从服务器上同步,从服务器可以是关联其他从服务器的主服务器。这使得Redis可执行单层树复制。存盘可以有意无意的对数据进行写操作。
Redis 与 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重启时会通过重新执行文件中保存的写命令来在内存中重建整个数据库的内容。
Windows环境下Redis的安装
windows版本redis下载地址:https://github.com/microsoftarchive/redis/releases
Redis服务端安装 
点击安装文件安装以后,打开本地服务管理器,并启动redis相关服务

打开redis的安装目录文件

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

在.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的客户端工具来看看是否能获取到刚才插入的数据

Redis在.net 环境下的使用的更多相关文章
- [原]Redis主从复制各种环境下测试
Redis 主从复制各种环境下测试 测试环境: Linux ubuntu 3.11.0-12-generic 2GB Mem 1 core of Intel(R) Core(TM) i5-3470 C ...
- Redis在windows环境下ThinkPHP的安装和使用
1.Redis概述: 2.Redis在windows环境下的安装: 下载地址:https://github.com/dmajkic/redis/downloads,选取其中一个zip压缩包:
- Shiro权限管理框架(二):Shiro结合Redis实现分布式环境下的Session共享
首发地址:https://www.guitu18.com/post/2019/07/28/44.html 本篇是Shiro系列第二篇,使用Shiro基于Redis实现分布式环境下的Session共享. ...
- 基础--Redis在Linux环境下的安装
1. 安装redis服务 1.1 检查安装依赖程序 yum install gcc-c++yum install -y tclyum install wget 1.1.1 下载redis安装包 (或者 ...
- Redis学习——Windows环境下Redis的安装(二)
一.说明 之前介绍了Linux环境下Redis的安装,这次介绍一下Windows环境下Redis的安装,首先要讲的是,Redis官方只支持Linux,还好 Microsoft Open Tech gr ...
- Redis学习——Linux环境下Redis的安装(一)
一.关于Redis Redis最为一款开源的key-value存储系统,自推出到现在一直受到编程人员的喜爱.它支持存储多种value类型,String .List .Set .Zset .Hash.这 ...
- Redis在.NET环境下实践篇(一)
redis简介 Redis是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value数据库,和Memcached类似,它支持存储的value类型相对更多,包括st ...
- Redis集群环境下的键值空间监听事件实现方案
一直想记录工作中遇到的问题和解决的方法,奈何没有找到一方乐土,最近经常反思,是否需要记录平时的点滴,后台还是决定下定决心记录一些,以便以后用到的时候找不着,实现这样的一个功能主要也是业务所需要的. 需 ...
- Redis在linux环境下的安装
下载Redis安装包 wget http://download.redis.io/releases/redis-3.2.9.tar.gz 解压Redis安装包 tar -zxvf redis-3.2. ...
随机推荐
- .NET CORE EnvironmentVariable
.NET CORE System variables SETIn System variablese.g1:Variable name: ASPNETCORE_ENVIRONMENTVariable ...
- 浅谈Android高通(Qualcomm)和联发科(MTK)平台
一款CPU好不好是要从多个方面考虑的,并不是说简简单单看一个主频.几个核心数就完了,更重要的是它的综合实力到底有多强,这里面当然也会牵扯到价格问题,性能相似当然是便宜的获胜,这是毋庸置疑的. 事实上, ...
- Mac OS启动服务优化高级篇(launchd tuning)禁用某些服务
http://kenwublog.com/mac-os-launchd-tuning Mac下的启动服务主要有三个地方可配置:1,系统偏好设置->帐户->登陆项2,/System/Libr ...
- Android动画基础——属性动画(Property Animation)
本篇涉及例子下载:Github 本篇讲android 3.0引入的属性动画框架,上篇写视图动画View Animation时就说过ViewAnimation的缺点,那就是动画作用的是view本身的视觉 ...
- Android零基础入门第88节:Fragment显示和隐藏、绑定和解绑
在上一期我们学习了FragmentManager和FragmentTransaction的作用,并用案例学习了Fragment的添加.移除和替换,本期一起来学习Fragment显示和隐藏.绑定和解绑. ...
- 程序的开机关机重启,开机启动,休眠功能delphi实现(使用AdjustTokenPrivileges提升权限)
TShutDownStatus = (sdShutDown,sdReboot,sdLogOff,sdPowerOff); procedure ShutDown(sdStatus : TShutDown ...
- Android实现dialog时候弹出软键盘dialog移位问题
Window win = getWindow(); WindowManager.LayoutParams params = win.getAttributes(); win.setSoftInputM ...
- Windows RabbitMQ 安装
操作系统 Win10 企业版 目标: 在win10上安装RabbitMQ 安装步骤 1.安装RabbitMQ需要先安装Erlang语言开发包,下载地址:http://www.erlang.org/d ...
- React Native v0.4 发布,用 React 编写移动应用
React Native v0.4 发布,自从 React Native 开源以来,包括超过 12.5k stars,1000 commits,500 issues,380 pull requests ...
- C++ crash 堆栈信息获取(三篇)
最近在做程序异常时堆栈信息获取相关工作,上一篇文章成功的在程序creash时写下了dump文件,而有些情况写dump文件是 不可以的,比如在jni开发时,C++只做底层处理,而整个项目是android ...