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

简介: 原文:全内存的redis用习惯了?那能突破内存限制类redis产品ssdb呢?             首先说一下背景,在双十一的时候,我们系统接受X宝的订单推送,同事原先的实现方式是使用redis的List作为推送数据的承载,在非大促的场景下, 一切运行正常,内存占用大概3-4G,机器是16G内存。
原文: 全内存的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,大家前期可以当缓存用用,或者存储一些非关键性数据,节省节省内存空间。目前我在项目中用起来了。

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

2. 使用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/master

Resolving codeload.github.com (codeload.github.com)... 192.30.255.120, 192.30.255.121

Connecting to codeload.github.com (codeload.github.com)|192.30.255.120|:443... connected.

HTTP request sent, awaiting response... 200 OK

Length: 1595060 (1.5M) [application/zip]

Saving to: ‘master’

 
100%[==================================================================>] 1,595,060 69.3KB/s in 36s

 
2017-12-02 03:02:57 (43.7 KB/s) - ‘master’ saved [1595060/1595060]

[root@localhost apps]#unzip master

[root@localhost apps]# ls

master 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配置一下

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

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

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

<3> 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.pid

server:
        ip: 0.0.0.0
        port: 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: 5

replication:
        binlog: yes
        # Limit sync speed to *MB/s, -1: no limit
        sync_speed: -1
        slaveof:
                # 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: 8889

logger:
        level: debug
        output: log.txt
        rotate:
                size: 1000000000

leveldb:
        # in MB
        cache_size: 500
        # in MB
        write_buffer_size: 64
        # in MB/s
        compaction_speed: 1000
        # yes|no
        compression: 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();
        }
    }

 

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

目录
相关文章
|
运维 NoSQL 测试技术
Redis:内存陡增100%深度复盘
本文深度分析了Redis内存陡增100%的一些细节和解决方案。
479 1
Redis:内存陡增100%深度复盘
|
9月前
|
Arthas 存储 算法
深入理解JVM,包含字节码文件,内存结构,垃圾回收,类的声明周期,类加载器
JVM全称是Java Virtual Machine-Java虚拟机JVM作用:本质上是一个运行在计算机上的程序,职责是运行Java字节码文件,编译为机器码交由计算机运行类的生命周期概述:类的生命周期描述了一个类加载,使用,卸载的整个过类的生命周期阶段:类的声明周期主要分为五个阶段:加载->连接->初始化->使用->卸载,其中连接中分为三个小阶段验证->准备->解析类加载器的定义:JVM提供类加载器给Java程序去获取类和接口字节码数据类加载器的作用:类加载器接受字节码文件。
825 55
|
5月前
|
存储 缓存 NoSQL
工作 10 年!Redis 内存淘汰策略 LRU 和传统 LRU 差异,还傻傻分不清
小富带你深入解析Redis内存淘汰机制:LRU与LFU算法原理、实现方式及核心区别。揭秘Redis为何采用“近似LRU”,LFU如何解决频率老化问题,并结合实际场景教你如何选择合适策略,提升缓存命中率。
642 3
|
8月前
|
存储 监控 NoSQL
流量洪峰应对术:Redis持久化策略与内存压测避坑指南
本文深入解析Redis持久化策略与内存优化技巧,涵盖RDB快照机制、AOF重写原理及混合持久化实践。通过实测数据揭示bgsave内存翻倍风险、Hash结构内存节省方案,并提供高并发场景下的主从复制冲突解决策略。结合压测工具链构建与故障恢复演练,总结出生产环境最佳实践清单。
311 9
|
10月前
|
存储 NoSQL Redis
阿里面试:Redis 为啥那么快?怎么实现的100W并发?说出了6大架构,面试官跪地: 纯内存 + 尖端结构 + 无锁架构 + EDA架构 + 异步日志 + 集群架构
阿里面试:Redis 为啥那么快?怎么实现的100W并发?说出了6大架构,面试官跪地: 纯内存 + 尖端结构 + 无锁架构 + EDA架构 + 异步日志 + 集群架构
阿里面试:Redis 为啥那么快?怎么实现的100W并发?说出了6大架构,面试官跪地: 纯内存 + 尖端结构 +  无锁架构 +  EDA架构  + 异步日志 + 集群架构
|
12月前
|
存储 算法 Java
JVM: 内存、类与垃圾
分代收集算法将内存分为新生代和老年代,分别使用不同的垃圾回收算法。新生代对象使用复制算法,老年代对象使用标记-清除或标记-整理算法。
187 6
|
11月前
|
Java
非静态内部类持有外部类引用导致内存溢出
非静态内部类持有外部类引用导致内存溢出
|
NoSQL 算法 Redis
redis内存淘汰策略
Redis支持8种内存淘汰策略,包括noeviction、volatile-ttl、allkeys-random、volatile-random、allkeys-lru、volatile-lru、allkeys-lfu和volatile-lfu。这些策略分别针对所有键或仅设置TTL的键,采用随机、LRU(最近最久未使用)或LFU(最少频率使用)等算法进行淘汰。
388 5
|
存储 编译器 Linux
【c++】类和对象(上)(类的定义格式、访问限定符、类域、类的实例化、对象的内存大小、this指针)
本文介绍了C++中的类和对象,包括类的概念、定义格式、访问限定符、类域、对象的创建及内存大小、以及this指针。通过示例代码详细解释了类的定义、成员函数和成员变量的作用,以及如何使用访问限定符控制成员的访问权限。此外,还讨论了对象的内存分配规则和this指针的使用场景,帮助读者深入理解面向对象编程的核心概念。
705 4
|
存储 Java 程序员
结构体和类的内存管理方式在不同编程语言中的表现有何异同?
不同编程语言中结构体和类的内存管理方式既有相似之处,又有各自的特点。了解这些异同点有助于开发者在不同的编程语言中更有效地使用结构体和类来进行编程,合理地管理内存,提高程序的性能和可靠性。
295 3