全内存的redis用习惯了?那能突破内存限制类redis产品ssdb呢?

首先说一下背景,在双十一的时候,我们系统接受X宝的订单推送,原先的实现方式是使用 redis 的 List 作为推送数据的承载,在非大促的场景下,一切运行正常,内存占用大概3-4G,机器是16G内存。由于提前预计不足,在双十一来临的时候,订单瞬时量达到了平时的 10X 倍,内存非常吃紧,情况算是非常紧急了,采取的临时解决方案就是再开一个redis,将程序中的redis地址指向这台新的,重启一下程序,把数据暂时引导过去。

一:分析

redis确实是一个好东西,一个如此强大的内存数据结构服务器,全内存存储,有些场景,恰恰你会死在全内存上,而且相对ssd硬盘来说,内存还是太小了。内存很便宜,但是内存和ssd比起来很贵,况且有些场景你可能根本不需要使用全内存,使用硬盘也许会更能帮助我们节省成本,你可能会说,现在业界标准已经差不多是kafka了,有时候我们还需要redis里面的hash,也就是说我现在需要 kafka + redis 的一个综合体的产品,这就是本篇和大家说到的ssdb,当然ssdb和kafka还是不能相提并论的哈,毕竟我是在选择一个轻量级的解决方案。

二:ssdb说明

ssdb是一个使用 leveldb 做为底层存储的nosql数据库,好处就是可以利用redis中的所有数据结构,而且数据还是基于硬盘的,可以存储的数据比redis大的不要太多,官方文档的说法就是用来替代redis的,而且让你眼前一亮的就是,它对 .net 的支持还是比较友好,一个很不错的解决方案,不过成熟度不如redis,大家前期可以当缓存用用,或者存储一些非关键性数据,节省节省内存空间。目前我在项目中用起来了。

  • 使用hash来存customerID 和customerNick的映射关系。

  • 使用List来承载X宝的订单推送。

三:快速搭建

官方下载:http://ssdb.io, 有一点要注意的就是官方文档明确表示,CentOS7的文件句柄设置问题,建议不要在centos7上进行搭建,具体的说明可以看看这个:http://ssdb.io/docs/zh_cn/config.html ,大家可以用用 centos6.5 或者 ubantu 吧。

1. wget下载和unzip解压。


[root@localhost apps]# wget https://codeload.github.com/ideawu/ssdb/zip/master--2017-12-02 03:02:18-- https://codeload.github.com/ideawu/ssdb/zip/masterResolving codeload.github.com (codeload.github.com)... 192.30.255.120, 192.30.255.121Connecting to codeload.github.com (codeload.github.com)|192.30.255.120|:443... connected.HTTP request sent, awaiting response... 200 OKLength: 1595060 (1.5M) [application/zip]Saving to: ‘master’100%[==================================================================>] 1,595,060 69.3KB/s in 36s2017-12-02 03:02:57 (43.7 KB/s) - ‘master’ saved [1595060/1595060][root@localhost apps]#unzip master[root@localhost apps]# lsmaster ssdb-master

2. 使用make对C++代码进行编译


[root@localhost ssdb-master]# make

3. 编译完之后,一泡尿的功夫,这个ssdb-server可执行文件就出来了。


[root@localhost ssdb-master]# ls
api              ChangeLog  Dockerfile  Makefile   ssdb.conf        tools      version
build_config.mk  data       docs        README.md  ssdb-server      var
build.sh         deps       LICENSE     src        ssdb_slave.conf  var_slave

4. 然后我们把ssdb.conf配置一下

这里面有三个配置要注意下:

  • work_dir:存放data和meta的目录,可以在ssdb-master文件夹下mkdir data文件夹。

  • ip:设为0.0.0.0,让所有的主机都能够连接上来。

  • port 8888 :这个是默认的ssdbserver端口号,大家可以看情况修改。

完整配置如下:


# ssdb-server config
# MUST indent by TAB!# absolute path, or relative to path of this file, directory must exists
work_dir = /usr/apps/ssdb-master/data
pidfile = ./var/ssdb.pidserver:ip: 0.0.0.0port: 8888# bind to public ip#ip: 0.0.0.0# format: allow|deny: all|ip_prefix# multiple allows or denys is supported#deny: all#allow: 127.0.0.1#allow: 192.168# auth password must be at least 32 characters#auth: very-strong-password#readonly: yes# in ms, to log slowlog with WARN level#slowlog_timeout: 5replication:binlog: yes# Limit sync speed to *MB/s, -1: no limitsync_speed: -1slaveof:# to identify a master even if it moved(ip, port changed)# if set to empty or not defined, ip:port will be used.#id: svc_2# sync|mirror, default is sync#type: sync#host: localhost#port: 8889logger:level: debugoutput: log.txtrotate:size: 1000000000leveldb:# in MBcache_size: 500# in MBwrite_buffer_size: 64# in MB/scompaction_speed: 1000# yes|nocompression: yes

5. 启动ssdb-server,指定一下配置文件,采取静默启动


[root@localhost ssdb-master]# ./ssdb-server ./ssdb.conf -d
ssdb-server 1.9.6
Copyright (c) 2012-2015 ssdb.io[root@localhost ssdb-master]# netstat -tlnp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 192.168.122.1:53        0.0.0.0:*               LISTEN      1869/dnsmasq
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      1115/sshd
tcp        0      0 127.0.0.1:631           0.0.0.0:*               LISTEN      1117/cupsd
tcp        0      0 0.0.0.0:8888            0.0.0.0:*               LISTEN      12994/./ssdb-server
tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN      1627/master
tcp6       0      0 :::22                   :::*                    LISTEN      1115/sshd
tcp6       0      0 ::1:631                 :::*                    LISTEN      1117/cupsd
tcp6       0      0 ::1:25                  :::*                    LISTEN      1627/master
[root@localhost ssdb-master]#

可以看到,上面的8888端口已经成功开启,没毛病。

四:使用C#客户端

在 http://ssdb.io/docs/zh_cn/clients.html 上面列出了各个语言的客户端SDK,这里我就选择C#的SDK:https://github.com/ssdb/dotnetssdb。

可以看到,里面没啥东西,就三个破文件,里面并没有实现ssdb应该有的所有功能,所以大家可以根据自己的需要进行封装,连接池啥的都要你自己根据需要实现吧,好了,接下来我用hash简单的测试一下:

class Program{static void Main(string[] args){Client client = new Client("192.168.23.153", 8888);client.hset("customerHash", "customerID", "1000");string val = string.Empty;client.hget("customerHash", "customerID", out val);Debug.WriteLine("customerID= " + val);client.close();}}

好了,本篇先就说到这里,希望对你有帮助。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/308890.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Prototype(原型)--对象创建模式

Prototype(原型)–对象创建模式 一、意图 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。 二、动机 1.在软件系统中,经常面临着“某些结构复杂的对象”的创建工作;由于需求的变化,这些…

[计组]寄存器的基本含义

寄存器基本含义: 寄存器是CPU内部用来存放数据的一些小型存储区域,用来暂时存放参与运算的数据和运算结果。其实寄存器就是一种常用的时序逻辑电路,但这种时序逻辑电路只包含存储电路。寄存器的存储电路是由锁存器或触发器构成的&#xff0c…

认证授权方案之授权揭秘 (上篇)

一、前言回顾:认证授权方案之授权初识从上一节中,我们在对授权系统已经有了初步的认识和使用,可以发现,asp.net core为我们提供的授权策略是一个非常强大丰富且灵活的认证授权方案,能够满足大部分的授权场景。在Config…

Singleton(单件)--对象创建模式

Singleton(单件)–对象创建模式 一、意图 保证一个类仅有一个实例,并提供一个访问它的全局访问点。 二、动机 1.在软件系统中,经常有这样一些特殊的类,必须保证它们在系统中只存在一个实例,才能确保它们的…

[计组]断定方式

断定方式: 微地址的形成方法之一。 断定方式:根据机器状态决定下一条微指令的地址,下一条微指令的地址包含在当前微指令的代码中。 这是一种直接给定微地址和测试判定地址相结合的方式。为了实现多路分支,将微地址的若干低位作为可断定的部分…

龙芯团队 在移值 MIPS64 下的.NET Core 进度速报

写在开始前我们的主要业务基于 dotnet core 2.x 与 3.1 完成,目前 dotnet core 3.1 支持的 CPU 架构列表中还不包含龙芯,且在 gitlab issue 中表示官方当前没有对 MIPS 的支持计划。更具体操作系统与 CPU 架构列表见 [Download .NET Core 3.1](https://d…

Adapter(适配器)--类对象结构型模式

Adapter(适配器)–类对象结构型模式 一、意图 将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本接口不兼容而不能一起工作的那些类可以一起工作。 二、动机 1.在软件系统中,由于应用环境的变化,常常需要将“一…

[计组]压缩BCD码指二进制编码的十进制

压缩BCD码指二进制编码的十进制 压缩BCD码指一个字节8位存储2位BCD码。比如32用8421BCD码表示如下:非压缩BCD码表示:00000011 00000010;压缩BCD码表示:0011 0010;使用BCD码表示10进位制数字比较好理解,且占…

如何使用ABP框架(2)三层架构与领域驱动设计的对比

本文来自长沙.NET技术社区,原创:邹溪源。全文共有8500字,读完需耗时10分钟。题图来自pixabay简述上一篇简述了ABP框架中的一些基础理论,包括ABP前后端项目的分层结构,以及后端项目中涉及到的知识点,例如DTO…

Bridge(桥接)--对象结构模式

Bridge(桥接)–对象结构模式 一、意图 将抽象部分与它的实现部分分离,使它们都可以独立的变化。 二、动机 1.由于某些类型的固有的实现逻辑,使得它们具有两个变化的维度,乃至多个纬度的变化。 2.如何应对这种“多维度…

自然数,实数,有理数,整数,分数,无理数

自然数:即非负整数 实数:包括有理数和无理数 有理数:整数、分数 整数包括:0、正整数和负整数 分数:包括正分数和负分数 无理数:无限不循环小数 自然数用以计量事物的件数或表示事物次序的数。即用数码…

数学中R,Z,N,Q都代表什么意思?

N:非负整数集合或自然数集合{0,1,2,3,…n} R:实数集合(包括有理数和无理数) Z:整数集合{…,-1,0,1,…} Q:有理数集合 N*/ N:正整数集合{1,2,3,…n} 在数学中没有用Z*表示的概念。 其他常见集合符号&a…

Composite(组合)--对象结构型模式

Composite(组合)–对象结构型模式 一、意图 将对象组合成树形结构以表示“部分-整体”的层次结构。Composite使得用户对单个对象和组合对象的使用具有一致性。 二、动机 1.软件在某些情况下,客户代码过多的依赖于对象容器复杂的内部实现结构…

魔幻艰难的2020上半年!

阅读本文大概需要 2.8分钟。告诉大家一个很震惊的消息!2020年已度过一半!在过去这半年的时间里,这个世界发生了巨大变化,并且很难恢复如初。2019年的最后一天,罗胖在跨年演讲中借用何帆老师的一句话与众人共勉&#xf…

[SpringBoot2]ajax函数中data参数的数据设置方式

ajax函数中data参数的数据设置方式:

Blazor带我重玩前端(二)

概览Blazor目前有两种托管模式,一种是Server-Side模式,一种是WebAssembly模式。官方首先支持的是Service-Side模式,使用WebAssembly模式,需要更新到最新版VS2019。小编目前的精力是更多的专注于Blazor-WebAssembly模式的研究&…

Decorator(装饰)--对象结构型模式

Decorator(装饰)–对象结构型模式 一、意图 1.动态地给一个对象添加一些额外的职责。就增加功能来说,Decorator模式相比生成子类更为灵活。 二、动机 1.在某些情况下我们可能会“过度地使用继承来扩展对象的功能”, 由于继承为类…

[mybatis]Getting Started

总体流程 1.根据xml配置文件(全局配置文件)创建一个SqlSessionFactory对象2.sql映射文件;配置了每一个sql,以及sql的封装规则等3.将sql映射文件注册在全局配置文件中4.写代码1)根据全局配置文件得到SqlSessionFactory2)使用sqlSession工厂,获…

Facade(外观)--对象结构型模式

Facade(外观)–对象结构型模式 一、意图 为子系统中的一组接口提供一个一致的界面,Facade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。 二、动机 1.上述左边方案的问题在于组件的客户和组件中各种复杂的子系…

.NET Core微服务开发网篇-ocelot

通过上篇我们知道,网关是外部访问的统一入口,本文采用Ocelot作为Api网关。环境要求:vs2019.NetCore3.1Ocelot16.0.1创建一个产品服务Api站点(AAStore.ProductCatalog.Api)添加一个ProductController[Route("api/[…