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

2023-11-06 05:38

本文主要是介绍全内存的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();}}

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

这篇关于全内存的redis用习惯了?那能突破内存限制类redis产品ssdb呢?的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/354753

相关文章

Redis中Stream详解及应用小结

《Redis中Stream详解及应用小结》RedisStreams是Redis5.0引入的新功能,提供了一种类似于传统消息队列的机制,但具有更高的灵活性和可扩展性,本文给大家介绍Redis中Strea... 目录1. Redis Stream 概述2. Redis Stream 的基本操作2.1. XADD

Knife4j+Axios+Redis前后端分离架构下的 API 管理与会话方案(最新推荐)

《Knife4j+Axios+Redis前后端分离架构下的API管理与会话方案(最新推荐)》本文主要介绍了Swagger与Knife4j的配置要点、前后端对接方法以及分布式Session实现原理,... 目录一、Swagger 与 Knife4j 的深度理解及配置要点Knife4j 配置关键要点1.Spri

怎样通过分析GC日志来定位Java进程的内存问题

《怎样通过分析GC日志来定位Java进程的内存问题》:本文主要介绍怎样通过分析GC日志来定位Java进程的内存问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、GC 日志基础配置1. 启用详细 GC 日志2. 不同收集器的日志格式二、关键指标与分析维度1.

Java内存分配与JVM参数详解(推荐)

《Java内存分配与JVM参数详解(推荐)》本文详解JVM内存结构与参数调整,涵盖堆分代、元空间、GC选择及优化策略,帮助开发者提升性能、避免内存泄漏,本文给大家介绍Java内存分配与JVM参数详解,... 目录引言JVM内存结构JVM参数概述堆内存分配年轻代与老年代调整堆内存大小调整年轻代与老年代比例元空

Redis出现中文乱码的问题及解决

《Redis出现中文乱码的问题及解决》:本文主要介绍Redis出现中文乱码的问题及解决,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1. 问题的产生2China编程. 问题的解决redihttp://www.chinasem.cns数据进制问题的解决中文乱码问题解决总结

全面解析MySQL索引长度限制问题与解决方案

《全面解析MySQL索引长度限制问题与解决方案》MySQL对索引长度设限是为了保持高效的数据检索性能,这个限制不是MySQL的缺陷,而是数据库设计中的权衡结果,下面我们就来看看如何解决这一问题吧... 目录引言:为什么会有索引键长度问题?一、问题根源深度解析mysql索引长度限制原理实际场景示例二、五大解决

Redis的持久化之RDB和AOF机制详解

《Redis的持久化之RDB和AOF机制详解》:本文主要介绍Redis的持久化之RDB和AOF机制,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录概述RDB(Redis Database)核心原理触发方式手动触发自动触发AOF(Append-Only File)核

Redis分片集群、数据读写规则问题小结

《Redis分片集群、数据读写规则问题小结》本文介绍了Redis分片集群的原理,通过数据分片和哈希槽机制解决单机内存限制与写瓶颈问题,实现分布式存储和高并发处理,但存在通信开销大、维护复杂及对事务支持... 目录一、分片集群解android决的问题二、分片集群图解 分片集群特征如何解决的上述问题?(与哨兵模

SpringBoot连接Redis集群教程

《SpringBoot连接Redis集群教程》:本文主要介绍SpringBoot连接Redis集群教程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1. 依赖2. 修改配置文件3. 创建RedisClusterConfig4. 测试总结1. 依赖 <de

SpringBoot+Redis防止接口重复提交问题

《SpringBoot+Redis防止接口重复提交问题》:本文主要介绍SpringBoot+Redis防止接口重复提交问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不... 目录前言实现思路代码示例测试总结前言在项目的使用使用过程中,经常会出现某些操作在短时间内频繁提交。例