CharlieBrown
V2EX  ›  Redis

用 Redis 去重,数据量大概 90w/月,不断累积,服务器需要多少内存

  •  
  •   CharlieBrown · Nov 12, 2018 · 13467 views
    This topic created in 2917 days ago, the information mentioned may be changed or developed.

    现在有一台 4G 运行内存的 centos 服务器,

    想将文章标题 md5 后存到 Redis 进行去重,

    数据量大概是 90w/月,并且不断累积。

    想问:

    ( 1 )服务器大概需要多少内存(以一年数据大概 1000w 计算)

    ( 2 ) Redis 除了改重要指令名字,加长密码,限制 ip 外,安全方面还有什么要注意的吗

    ( 3 )要是服务器重启,数据会丢失吗,持久化是 Redis 自动的还是得设置

    40 replies  •  2018-11-13 13:50:40 +08:00
    leriou
    leriou
    Nov 12, 2018❤️1
    2
    90 万, 容量没问题, 还得考虑访问频次, 2, 重要指令没必要改, redis 部署为内网访问就行了,最好可以选择集群方案 3, 默认有持久化, 最好还是 自己配置一下 rdb+ aof 频次自己多尝试一下, 弄好持久化, 重启不会丢太多数据, 会丢 1-2s 的数据
    luozic
    luozic
    Nov 12, 2018 via iPhone
    3
    听说过 bloom filter 没有?你这内存大大有余量。
    dingyaguang117
    dingyaguang117
    Nov 12, 2018
    4
    bloom filter +1
    很多年前造的轮子 https://github.com/dingyaguang117/BloomFilter
    colincat
    colincat
    Nov 12, 2018 via iPhone
    5
    楼上说的没毛病,11 亿够用不,512m 内存就够啦
    huashengshu
    huashengshu
    Nov 12, 2018
    6
    1000w 的短 key 也就 1-2G 吧,key 越多,内存膨胀越厉害,可以考虑分桶+hashmap
    如果不需要精确值,可以考虑 HyperLogLog、bitmap,redis 也支持这两种数据结构
    SummerWQM
    SummerWQM
    Nov 12, 2018
    7
    还等什么 上 spark hadoop
    cdwyd
    cdwyd
    Nov 12, 2018 via Android❤️1
    8
    才 90 万每月,现在的配置够用几年了
    huashengshu
    huashengshu
    Nov 12, 2018
    9
    @SummerWQM 讲道理,spark/hadoop 是需要巨大成本的,1000w 一年的量,一个列式数据库就搞定了
    reus
    reus
    Nov 12, 2018❤️2
    10
    一个数据库唯一键就能解决的事情
    CharlieBrown
    CharlieBrown
    OP
    Nov 12, 2018
    11
    @leriou 好的,谢谢指点
    CharlieBrown
    CharlieBrown
    OP
    Nov 12, 2018
    12
    @luozic
    @dingyaguang117
    @colincat
    bloom filter 听说过,不过不是上亿数据量以上才会使用吗
    CharlieBrown
    CharlieBrown
    OP
    Nov 12, 2018
    13
    @SummerWQM 学习成本太大,我就做个爬虫去重而已。。
    zhengxiaowai
    zhengxiaowai
    Nov 12, 2018
    14
    @CharlieBrown bloom filter 没有学习成本,两个命令而已,还有计算计算公式能评估错误率和所需要的容量,很好用。
    watzds
    watzds
    Nov 12, 2018 via Android
    15
    90w 应该 90MB 不到,写入 redis 看一下内存占用
    jatesun
    jatesun
    Nov 12, 2018
    16
    90w 跟没有数据有啥区别(如果一条数据没有图片超大文本之类的)
    ClutchBear
    ClutchBear
    Nov 12, 2018❤️1
    17
    bloom filter,
    redis 4.0 以上版本, 开启插件就行.

    ./src/redis-server redis.conf --loadmodule /usr/rebloom/rebloom.so INITIAL_SIZE 1000000 ERROR_RATE 0.0001
    # 容量 100 万, 容错率万分之一, 占用空间是 4m

    需要的时候自动创建一个容量 100 万, 容错率万分之一的 bf key
    语法就是
    bf.add(key, value)
    ClutchBear
    ClutchBear
    Nov 12, 2018
    18
    这个语法是手动创建一个新 key
    BF.RESERVE 2018_ccgp 0.0001 28000000
    容量是两千八百万, 占用空间是 64m
    feverzsj
    feverzsj
    Nov 12, 2018
    19
    你先确定你是否要用 redis,为什么不用 mysql
    CharlieBrown
    CharlieBrown
    OP
    Nov 12, 2018
    20
    @zhengxiaowai 我说的是 spark hadoop 的学习成本。。。
    CharlieBrown
    CharlieBrown
    OP
    Nov 12, 2018
    21
    @ClutchBear 好的,我去看看
    CharlieBrown
    CharlieBrown
    OP
    Nov 12, 2018
    22
    @huashengshu
    @jatesun
    数据是文章标题,一般是 30 个汉字以内
    CharlieBrown
    CharlieBrown
    OP
    Nov 12, 2018
    23
    @feverzsj 用 MySQL 去重可能造成数据库压力过大吧
    colincat
    colincat
    Nov 12, 2018
    24
    @CharlieBrown 学习能力这么差吗,偶尔我也搞爬虫,bloom filter 这个完全满足你的需求,就用这个就行,不要考虑增长问题
    gsralex
    gsralex
    Nov 12, 2018
    25
    bloom filter 就是 hash 之后放到数组,和你用 redis 的 hash 做一个道理。就是对存储 hash key 有缩减。
    likuku
    likuku
    Nov 12, 2018
    26
    @CharlieBrown #10 的建议就很好啊,MySQL 觉得压力太大,那就 Sqlite 嘛~ 现有数据重插一次
    gsralex
    gsralex
    Nov 12, 2018
    27
    mysql 压力很小的,用 mysql 就行,redis 是放在内存的。而且你为了做持久化的话,也会占用硬盘。并且 redis 的数据是在启动的时候一次性加载到内存的。你如果紧张内存就放 mysql,mysql 你加入索引,查询复杂度 log2n。
    CharlieBrown
    CharlieBrown
    OP
    Nov 12, 2018
    28
    @colincat 好的,已经在研究 bloom filter,以前也看过一些


    @likuku
    @gsralex
    其实就是想用用 Redis。。。现在已经是 MySQL 去重了。

    我这边目前系统盘 20G,数据盘 200G,不知道能不能 Redis 装系统盘,数据放数据盘
    gsralex
    gsralex
    Nov 12, 2018❤️1
    29
    @CharlieBrown 可以,先考虑下 redis 是否需要持久化
    CharlieBrown
    CharlieBrown
    OP
    Nov 12, 2018
    30
    @gsralex 应该是需要持久化的,毕竟要一直记录用于去重
    gsralex
    gsralex
    Nov 12, 2018
    31
    @CharlieBrown 那我觉得就用 mysql 好了
    yzmm
    yzmm
    Nov 12, 2018
    32
    sort |uniq
    Linxing
    Linxing
    Nov 12, 2018
    33
    持久化常用的两种 配置文件中都可以改
    2owe
    2owe
    Nov 12, 2018 via Android❤️1
    34
    如果查询稳定,某秒不过百,建议数据库吧;架构简单易维护。
    metrxqin
    metrxqin
    Nov 12, 2018❤️2
    35
    我不准备正面回应你的问题,只想谈谈这种设计引入的成本和风险。

    根据上述设计,存储前必须要先计算标题 MD5 值,连接 Redis 检查 MD5 是否存储,最终存储到 SQL 数据库。

    计算、时延成本:
    首先,计算 MD5 值十分消耗 CPU 资源,其次查询 Redis 将引起额外的网络时延,保存新的 MD5 也会产生网络时延。

    单点风险:
    由于 OP 仅部署单个 Redis,整个系统存在单点故障的风险。这样的系统无疑极其脆弱,一旦 Redis 崩溃将导致业务中断(无法保存新的文章),因此必须再增加两台主机来构成 Redis Sentinal 集群,成本将大大增加。

    编码、调试、诊断困难:
    必须在本地环境配置 Redis 服务器方可调试,同时需要处理 Redis 请求失败的情况。生产环境一旦发生异常,不容易诊断。

    维护成本:
    需要额外维护三台 Redis 服务器。
    rebill
    rebill
    Nov 12, 2018
    36
    BloomFilter 原理,实现及优化: http://oserror.com/backend/bloomfilter/
    CharlieBrown
    CharlieBrown
    OP
    Nov 13, 2018
    37
    @2owe
    好的,肯定是每秒不过百,

    之所以想用 Redis,除了学习使用外,

    其实还有一个原因是我们的 MySQL 数据库最初设计的很烂,导致后期很多问题,崩溃什么的。

    加上我不是那边的人员,不好插手,所以才想用 Redis,算是缓解那边压力吧
    CharlieBrown
    CharlieBrown
    OP
    Nov 13, 2018
    38
    @metrxqin
    说的很全面,长见识了。

    不过我们产品一共才 3 个服务器。。。要 3 台 Redis 来维持一个健壮的系统,显然老板是不会同意的。

    由于文章的表是在 MySQL 上,所以 Redis 其实是只有标题的 md5 值 加上未来的一个 ip 池

    一旦 Redis 数据库丢失 ,我能想到的做法也只有从 MySQL 提取文章标题再传入 Redis


    或者 Redis 不保存标题 md5 值,直接使用标题?
    darylc
    darylc
    Nov 13, 2018
    39
    可以看看 pika
    colincat
    colincat
    Nov 13, 2018 via iPhone
    40
    就这么一个小东西考虑太多就是过度设计了,孩子
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   1701 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 59ms · UTC 10:30 · PVG 18:30 · LAX 02:30 · JFK 05:30
    ♥ Do have faith in what you're doing.