用 Redis 去重,数据量大概 90w/月,不断累积,服务器需要多少内存 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
CharlieBrown
V2EX    Redis

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

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

    现在有一台 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 /td>
        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     Solana     2811 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 28ms UTC 13:34 PVG 21:34 LAX 06:34 JFK 09:34
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86