一、NoSQL简介

NoSQL并不是No SQL(不再需要SQL),而是指Not Only SQL(不仅仅只有SQL)。NoSQL并不是用来替代关系型数据库的,而是在某些使用关系型数据库不合适的场景中,可以使用NoSQL数据库进行优化,而在系统中主要的、常规的数据仍然使用关系型数据库。
  常用的NoSQL数据库有Memcached、Redis、MongoDB等,其中前两者属于键值对数据库,后者属于文档数据库。它们都有各自的优缺点以及使用场景。

二、Memcached介绍与安装

Memcached是一个专门用来做缓存的数据库,缓存的数据都是在内存当中,当数据库重启之后,数据也就都丢失了。其相当于一个Dictionary键值对集合,根据Key值取Value值。

  1、Memcached安装

   从网上下载Memcached-win64-1.4.4-14.zip安装包。解压后,通过管理员权限执行如下命令,可将其安装成服务:

G:\MemcachedAfterInstall>memcached.exe -d install

   2、Memcached可视化工具

    TreeNMS是一款Redis、Memcached可视化客户端工具,实现基于Web方式对Redis、Memcached数据库进行管理、维护。可通过如下链接http://www.treesoft.cn/dms.html进行下载。

    下图即该工具的使用界面:


  3、Memcached优缺点

    优点:

    1)多线程,可以充分利用CPU多核的处理性能;

    2)做缓存性能高;

    缺点:

    1)只能保存键值对数据,键值只能是字符串,如果有对象数据只能自己序列化Json字符串;

    2)数据只保存在内存中,重启后会丢失;

    3)Key最大长度250个字符,Value最长1M;

 三、在.Net Core中的使用

  1、组件包的安装与使用

    在.Net Core项目中调用Memcached数据库的资源,可以使用EnyimMemcachedCore客户端组件包。

    通过该组件向Memcached数据库存入数据有三种模式,分别如下:

      1)Set:存在则覆盖,不存在则新增;

      2)Replace:如果存在则覆盖,并且返回true;如果不存在则不处理,并且返回false;

      3)Add:如果不存在则新增,并且返回true;如果存在则不处理,并且返回false;

    故,根据以上可知,如果没有特殊要求一般用Set即可。

    注意:Memcached数据库中的key的长度最高为250个字符,value的值最大为1M。

  2、案例演示

    为了演示方便,创建了一个基于.Net Core3.1版本的WPF项目,界面如下:

    

    1)存储数据、读取数据 

public partial class MainWindow : Window
{
  private readonly MemcachedClient _memcachedClient;
  private static readonly ILoggerFactory _loggerFactory = new LoggerFactory();
  public MainWindow()
  {
    InitializeComponent();
    var options = new MemcachedClientOptions();
    options.AddServer("127.0.0.1", );
    _memcachedClient = new MemcachedClient(_loggerFactory, new MemcachedClientConfiguration(_loggerFactory, options));
  }
}
private void btnStorage_Click(object sender, RoutedEventArgs e)
{
  var result = _memcachedClient.Store(StoreMode.Set, "supersnow", "yao");
  MessageBox.Show($"保存成功?{result}");
} private void btnRead_Click(object sender, RoutedEventArgs e)
{
  var result = _memcachedClient.Get("supersnow");
  MessageBox.Show($"读取结果:{result}");
}  

    2)存储类数据、读取类数据

private async void btnStorage_Class_Click(object sender, RoutedEventArgs e)
{
  var person = new Person
  {
    Name = "SuperSnow",
    Age =
  };
  var result = await _memcachedClient.StoreAsync(StoreMode.Set, "person_key", person, TimeSpan.FromSeconds());
  MessageBox.Show($"保存Person成功?{result}");
}
private async void btnRead_Class_Click(object sender, RoutedEventArgs e)
{
  var result = await _memcachedClient.GetAsync<Person>("person_key");
  if (result.Value == null)
    MessageBox.Show("数据已经失效");
  else
    MessageBox.Show($"读取Person结果:{result.Value.Name}:{result.Value.Age}");
}
public class Person
{
  public string Name { get; set; }
  public int Age { get; set; }
}  

    3)读取数据异常

    对于读取数据失败时,返回结果为false。但是,此时并不知道失败的原因是什么,可以通过如下方法获取失败原因:

 private void btnRead_Exception_Click(object sender, RoutedEventArgs e)
{
var result = _memcachedClient.ExecuteRemove("abc");
MessageBox.Show($"结果:{result.Success},Message:{result.Message},Exception:{result.Exception},StatusCode:{result.StatusCode},InnerResult:{result.InnerResult.Message}");

    4)Memcached Cas操作

    Cas操作类似于关系型数据库中的“乐观锁”,查询的时候会顺带查出一个Cas值,在写入的时候会带着这个Cas值,如果发现Cas值改变了,则说明已经有其他操作提前修改了相应的值。本质上来说Cas就是用来解决并发问题,通过读取一个值,然后做一些处理或判断,然后再写回到数据库中,这种操作有可能产生并发问题。

private CasResult<Person> casResult;
private void btnA_Read_Click(object sender, RoutedEventArgs e)
{
casResult = _memcachedClient.GetWithCas<Person>("person_key");
if (casResult.Result != null)
MessageBox.Show($"读取Person结果:{casResult.Result.Name}:{casResult.Result.Age}");
else
MessageBox.Show("没有结果");
} private void btnB_Save_Click(object sender, RoutedEventArgs e)
{
var result = _memcachedClient.GetWithCas<Person>("person_key");
if (result.Result.Age >= )
result.Result.Age++;
var tag = _memcachedClient.Cas(StoreMode.Set, "person_key", result.Result, result.Cas);
if (tag.Result)
MessageBox.Show("修改成功");
else
MessageBox.Show("修改失败");
} private void btnA_Save_Click(object sender, RoutedEventArgs e)
{
if (casResult.Result.Age >= )
casResult.Result.Age++;
else
casResult.Result.Age++;
var tag = _memcachedClient.Cas(StoreMode.Set, "person_key", casResult.Result, casResult.Cas);
if (tag.Result)
MessageBox.Show("修改成功");
else
MessageBox.Show("修改失败");
}

    5)Memcached集群

    Memcached重启之后,在短时间内大量的请求会涌入数据库,给数据库造成巨大压力,解决此类问题的方法就是使用集群,即使用多Memcached服务器提供服务。

    除此之外,Memcached还有可能面临“雪崩”问题,如果所有缓存设置过期时间是一样的,或者失效时间在一个短距离的范围内。那么每隔一段时间就会造成一次数据库访问的高峰。此类问题的解决方法就是将不同缓存的缓存失效时间设置成不一样,如对失效时间加上随机数。

    Memcached集群的节点之间不用进行通讯和数据同步,只需要在多个服务器上启动多个Memcached数据库即可。客户端决定了将数据写入不同的Memcached实例,不用做主从复制操作。

    节点定位算法有很多种,最常用的就是Ketama算法,该算法根据Key算出一个hash值,然后根据hash值再得出服务器。如下例所示:

private readonly MemcachedClient _memcachedClient;
private static readonly ILoggerFactory _loggerFactory = new LoggerFactory();
public MainWindow()
{
InitializeComponent(); var options = new MemcachedClientOptions();
options.AddServer("127.0.0.1", );
options.AddServer("127.0.0.1", );
options.NodeLocatorFactory = new DefaultNodeLocatorFactory();
_memcachedClient = new MemcachedClient(_loggerFactory, new MemcachedClientConfiguration(_loggerFactory, options));
}
private void btnA_Save_Cluster_Click(object sender, RoutedEventArgs e)
{
var person = new Person
{
Name = "张三",
Age =
};
var result = _memcachedClient.Store(StoreMode.Set, "", person);
MessageBox.Show($"保存Person成功?{result}");
} private void btnA_Read_Cluster_Click(object sender, RoutedEventArgs e)
{
var result = _memcachedClient.Get<Person>("");
if (result == null)
MessageBox.Show("数据已经失效");
else
MessageBox.Show($"读取Person结果:{result.Name}:{result.Age}");
} private void btnB_Save_Cluster_Click(object sender, RoutedEventArgs e)
{
var person = new Person
{
Name = "李四",
Age =
};
var result = _memcachedClient.Store(StoreMode.Set, "", person);
MessageBox.Show($"保存Person成功?{result}");
} private void btnB_Read_Cluster_Click(object sender, RoutedEventArgs e)
{
var result = _memcachedClient.Get<Person>("");
if (result == null)
MessageBox.Show("数据已经失效");
else
MessageBox.Show($"读取Person结果:{result.Name}:{result.Age}");

     通过如下命令分别启动两个Memcached实例:

G:\MemcachedAfterInstall>memcached.exe -p 11212
G:\MemcachedAfterInstall>memcached.exe -p 11211

    在TreeNMS系统中配置两个数据库连接:

    由于Key=1和Key=2的hash值不同,所以缓存数据分别存在于两个Memcached实例中,如下图所示:

NoSQL之一:Memcached的更多相关文章

  1. NoSQL、memcached介绍、安装memcached、查看memcached状态

    1.NoSQL 2.memcached介绍     3.安装memcached(二进制包安装) yum install -y memcached libmemcached libevent (若没有安 ...

  2. NoSQL之Memcached

    一.Memcached概念 Memcached是NoSQL产品之中的一个,是一个暂时性键值存储NoSQL数据库,过去被大量使用在互联网站点中,作为应用和数据库之间的缓存层,大大提高查询和訪问速度. M ...

  3. 三、NOSQL之Memcached缓存服务实战精讲第二部

    1.Memcached服务安装 Memcached的安装比较简单,很多平台都是支持Memcached,常见的有:Linux .Windows 服务端端:                cd /home ...

  4. 二、NOSQL之Memcached缓存服务实战精讲第一部

    1.Memcached是一套数据缓存系统或软件. 用于在动态应用系统中缓存数据库的数据,减少数据库的访问压力,达到提升网站系统性能的目的:Memcached在企业应用场景中一般是用来作为数据库的cac ...

  5. Memcached的安装(Linux)、操作、命令

    最近在整理有关分布式缓存的服务器,做了一下老牌nosql服务器memcached的学习总结.文中所述的所有安装均是在联网的情况下进行的. 序: 什么是memcached: Free & ope ...

  6. memcached 缓存数据库应用实践

    1.1 数据库对比 缓存: 将数据存储到内存中,只有当磁盘胜任不了的时候,才会启用缓存   缺点:断电数据丢失(双电),用缓存存储数据的目的只是为了应付大并发的业务. 数据库: mysql(关系型数据 ...

  7. Python学习笔记 - day12 - Python操作NoSQL

    NoSQL(非关系型数据库) NoSQL,指的是非关系型的数据库.NoSQL有时也称作Not Only SQL的缩写,是对不同于传统的关系型数据库的数据库管理系统的统称.用于超大规模数据的存储.(例如 ...

  8. NoSQL和SQL怎么选用?

    NoSQL 有分很多种,其中key-value NoSQL (Redis, MemcacheD, etc) 的选用相对比较清楚些,大多是当后端Data storage的cache层来用.这篇主要想请教 ...

  9. 高级php面试题(转)

    一.mysql相关知识    1. mysql优化方式            MYSQL 优化常用方法            mysql 性能优化方案      2.如何分库分表            ...

  10. 高级php面试题

    在网上看到一些高级php 的面试题目.. 最近接连面试了几家公司,有些重要问题记录一下,督促自己学习提高,同时希望给朋友们一些帮助.内容很多,一点点完善,一步步学习..有些是面试被问,有些是招聘要求, ...

随机推荐

  1. jdk1.7和jdk1.8在接口方面的改动

    1.JDK7及其之前,接口中都是抽象方法,且不能出现static方法 2.接口的变量都是public final static 全局静态常量,无变化 3.接口中可以添加非抽象方法(static),通过 ...

  2. vue显示富文本

    来源:https://segmentfault.com/q/1010000013952512 用  v-html 属性解决

  3. opencv-4-成像系统与Mat图像颜色空间

    opencv-4-成像系统与Mat图像颜色空间 opencvc++qtmat 目标 知道 opencv 处理图像数据的格式 介绍 mat 基础内容 知道 BGR 颜色 显示 颜色转换 BGR 到 灰度 ...

  4. hexo-themes-setting

    hexo-themes-setting hexotheme Hexo 主题配置管理 一半有几种方式, 可以删除git 单独维护 也可以使用 hexo 推荐的方式进行维护 所有需要写在主题配置文件中的配 ...

  5. 【Linux网络基础】网络拓扑、OSI层次模型、TCP/IP协议簇

    一.前言 一个运维有时也要和网络打交道,所以具备最基本的网络知识,对一个运维人员来说是必要的.但,对于我们的工作来说这些并不是重点,因此,我不可能从最基础的网络知识开始讲起.本节内容更多是从一个梳理和 ...

  6. 【蜕变之路】第20天 UUID和时间戳的生成 (2019年3月10日)

    Hello,大家好!我是程序员阿飞!今天主要学习的内容是:字符串UUID的随机生成和时间戳的随机生成.好了,直接进入正题. 1.UUID的随机生成 /*          * uuid的随机生成方式 ...

  7. CentOS配置Tomcat监听80端口,虚拟主机

    2019独角兽企业重金招聘Python工程师标准>>> Tomcat更改默认端口为80 更改的配置文件是: /usr/local/tomcat/conf/server.xml [ro ...

  8. Linux下实现文件共享配置[samba]

    Linux下实现文件共享配置[samba] 第一步:安装samba软件 1.命令:rpm –q samba #查询是否已安装sambayum install samba #使用yum源安装samba, ...

  9. 利用Mysqlbinlog恢复数据库数据

    关于binlog的详解请参考:http://zlyang.blog.51cto.com/1196234/1833062 binlog日志用于记录所有更新了数据或者已经潜在更新了数据的所有语句.语句以& ...

  10. CSDN排名及积分规则

    博客排行榜排名分值=个人Blog全部随笔与文章的阅读数之和+个人Blog全部评论数之和*10+个人所发表的评论数之和*50 CSDN博客积分计算规则: 1.每公布一篇原创或者翻译文章:可获得10分. ...