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

最新文章

  1. 使用 Swagger 自动生成 ASP.NET Core Web API 的文档、在线帮助测试文档(ASP.NET Core Web API 自动生成文档)
  2. C和指针 第十六章 标准函数库 本地跳转setjmp.h
  3. eclipse的package, folder, source folder 异同以及相互转化
  4. GIT版本管理工具
  5. Go语言实战 - revel框架教程之权限控制
  6. iOS-不用网线搭建IPv6网络测试环境
  7. Linux下修改mysql密码
  8. Linux下Bash入门学习笔记
  9. C++函数内存占用
  10. SQL RIGHT JOIN 关键字
  11. java线程(3)-多线程死锁
  12. MIPS 跳转指令BAL vs JAL
  13. 转:LINUX/UNIX下的回车换行与WINDOWS下的区别
  14. React-Native采坑总结
  15. kali访问宿主机Web页面解决方案
  16. winscp的root连接ubuntu“拒绝访问”的解决方法
  17. pythone函数基础(9)操作数据库连接
  18. Memcache简单使用
  19. android-DNS服务找不到
  20. 关于Unity中拖尾渲染器的使用

热门文章

  1. WPF 左键单击弹出菜单 ContextMenu
  2. ASP.NET Core SameSite 设置引起 Cookie 在 QQ 浏览器中不起作用
  3. WPF编游戏系列 之九 物品清单再优化
  4. Qt之使用setWindowFlags方法遇到的问题(追踪进入QWidget的源码分析原因,最后用WINAPI解决问题)good
  5. 图像滤镜艺术--编码基础(Photoshop基础变换的代码实现)
  6. CSS计数器:counter
  7. ArcGIS for Desktop入门教程_第八章_Desktop学习资源 - ArcGIS知乎-新一代ArcGIS问答社区
  8. 零元学Expression Blend 4 - Chapter 19 如何让做好的Blend专案变Silverlight网页
  9. UWP-磁贴初识
  10. C#函数参数前的修饰符