V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
CharlieBrown
V2EX  ›  Redis

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

  •  
  •   CharlieBrown · 2018-11-12 11:49:52 +08:00 · 12117 次点击
    这是一个创建于 2195 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

    想问:

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

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

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

    40 条回复    2018-11-13 13:50:40 +08:00
    leriou
        2
    leriou  
       2018-11-12 11:55:50 +08:00   ❤️ 1
    90 万, 容量没问题, 还得考虑访问频次, 2, 重要指令没必要改, redis 部署为内网访问就行了,最好可以选择集群方案 3, 默认有持久化, 最好还是 自己配置一下 rdb+ aof 频次自己多尝试一下, 弄好持久化, 重启不会丢太多数据, 会丢 1-2s 的数据
    luozic
        3
    luozic  
       2018-11-12 12:03:18 +08:00 via iPhone
    听说过 bloom filter 没有?你这内存大大有余量。
    dingyaguang117
        4
    dingyaguang117  
       2018-11-12 12:07:21 +08:00
    bloom filter +1
    很多年前造的轮子 https://github.com/dingyaguang117/BloomFilter
    colincat
        5
    colincat  
       2018-11-12 12:07:33 +08:00 via iPhone
    楼上说的没毛病,11 亿够用不,512m 内存就够啦
    huashengshu
        6
    huashengshu  
       2018-11-12 12:24:53 +08:00
    1000w 的短 key 也就 1-2G 吧,key 越多,内存膨胀越厉害,可以考虑分桶+hashmap
    如果不需要精确值,可以考虑 HyperLogLog、bitmap,redis 也支持这两种数据结构
    SummerWQM
        7
    SummerWQM  
       2018-11-12 12:28:10 +08:00
    还等什么 上 spark hadoop
    cdwyd
        8
    cdwyd  
       2018-11-12 12:30:04 +08:00 via Android   ❤️ 1
    才 90 万每月,现在的配置够用几年了
    huashengshu
        9
    huashengshu  
       2018-11-12 12:30:53 +08:00
    @SummerWQM 讲道理,spark/hadoop 是需要巨大成本的,1000w 一年的量,一个列式数据库就搞定了
    reus
        10
    reus  
       2018-11-12 12:30:58 +08:00   ❤️ 2
    一个数据库唯一键就能解决的事情
    CharlieBrown
        11
    CharlieBrown  
    OP
       2018-11-12 13:34:45 +08:00
    @leriou 好的,谢谢指点
    CharlieBrown
        12
    CharlieBrown  
    OP
       2018-11-12 13:35:35 +08:00
    @luozic
    @dingyaguang117
    @colincat
    bloom filter 听说过,不过不是上亿数据量以上才会使用吗
    CharlieBrown
        13
    CharlieBrown  
    OP
       2018-11-12 13:36:06 +08:00
    @SummerWQM 学习成本太大,我就做个爬虫去重而已。。
    zhengxiaowai
        14
    zhengxiaowai  
       2018-11-12 13:39:04 +08:00
    @CharlieBrown bloom filter 没有学习成本,两个命令而已,还有计算计算公式能评估错误率和所需要的容量,很好用。
    watzds
        15
    watzds  
       2018-11-12 13:47:05 +08:00 via Android
    90w 应该 90MB 不到,写入 redis 看一下内存占用
    jatesun
        16
    jatesun  
       2018-11-12 14:02:19 +08:00
    90w 跟没有数据有啥区别(如果一条数据没有图片超大文本之类的)
    ClutchBear
        17
    ClutchBear  
       2018-11-12 14:03:36 +08:00   ❤️ 1
    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
        18
    ClutchBear  
       2018-11-12 14:05:03 +08:00
    这个语法是手动创建一个新 key
    BF.RESERVE 2018_ccgp 0.0001 28000000
    容量是两千八百万, 占用空间是 64m
    feverzsj
        19
    feverzsj  
       2018-11-12 14:09:35 +08:00
    你先确定你是否要用 redis,为什么不用 mysql
    CharlieBrown
        20
    CharlieBrown  
    OP
       2018-11-12 14:20:38 +08:00
    @zhengxiaowai 我说的是 spark hadoop 的学习成本。。。
    CharlieBrown
        21
    CharlieBrown  
    OP
       2018-11-12 14:21:45 +08:00
    @ClutchBear 好的,我去看看
    CharlieBrown
        22
    CharlieBrown  
    OP
       2018-11-12 14:23:06 +08:00
    @huashengshu
    @jatesun
    数据是文章标题,一般是 30 个汉字以内
    CharlieBrown
        23
    CharlieBrown  
    OP
       2018-11-12 14:47:29 +08:00
    @feverzsj 用 MySQL 去重可能造成数据库压力过大吧
    colincat
        24
    colincat  
       2018-11-12 14:50:13 +08:00
    @CharlieBrown 学习能力这么差吗,偶尔我也搞爬虫,bloom filter 这个完全满足你的需求,就用这个就行,不要考虑增长问题
    gsralex
        25
    gsralex  
       2018-11-12 14:50:37 +08:00
    bloom filter 就是 hash 之后放到数组,和你用 redis 的 hash 做一个道理。就是对存储 hash key 有缩减。
    likuku
        26
    likuku  
       2018-11-12 14:51:53 +08:00
    @CharlieBrown #10 的建议就很好啊,MySQL 觉得压力太大,那就 Sqlite 嘛~ 现有数据重插一次
    gsralex
        27
    gsralex  
       2018-11-12 14:55:38 +08:00
    mysql 压力很小的,用 mysql 就行,redis 是放在内存的。而且你为了做持久化的话,也会占用硬盘。并且 redis 的数据是在启动的时候一次性加载到内存的。你如果紧张内存就放 mysql,mysql 你加入索引,查询复杂度 log2n。
    CharlieBrown
        28
    CharlieBrown  
    OP
       2018-11-12 15:25:05 +08:00
    @colincat 好的,已经在研究 bloom filter,以前也看过一些


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

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

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

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

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

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

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

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

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

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

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

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

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


    或者 Redis 不保存标题 md5 值,直接使用标题?
    susecjh
        39
    susecjh  
       2018-11-13 09:51:53 +08:00
    可以看看 pika
    colincat
        40
    colincat  
       2018-11-13 13:50:40 +08:00 via iPhone
    就这么一个小东西考虑太多就是过度设计了,孩子
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   4540 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 10:02 · PVG 18:02 · LAX 02:02 · JFK 05:02
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.