现在有一台 4G 运行内存的 centos 服务器,
想将文章标题 md5 后存到 Redis 进行去重,
数据量大概是 90w/月,并且不断累积。
想问:
( 1 )服务器大概需要多少内存(以一年数据大概 1000w 计算)
( 2 ) Redis 除了改重要指令名字,加长密码,限制 ip 外,安全方面还有什么要注意的吗
( 3 )要是服务器重启,数据会丢失吗,持久化是 Redis 自动的还是得设置
2 leriou 2018-11-12 11:55:50 +08:00 ![]() 90 万, 容量没问题, 还得考虑访问频次, 2, 重要指令没必要改, redis 部署为内网访问就行了,最好可以选择集群方案 3, 默认有持久化, 最好还是 自己配置一下 rdb+ aof 频次自己多尝试一下, 弄好持久化, 重启不会丢太多数据, 会丢 1-2s 的数据 |
3 luozic 2018-11-12 12:03:18 +08:00 via iPhone 听说过 bloom filter 没有?你这内存大大有余量。 |
![]() | 4 dingyaguang117 2018-11-12 12:07:21 +08:00 bloom filter +1 很多年前造的轮子 https://github.com/dingyaguang117/BloomFilter |
![]() | 5 colincat 2018-11-12 12:07:33 +08:00 via iPhone 楼上说的没毛病,11 亿够用不,512m 内存就够啦 |
6 huashengshu 2018-11-12 12:24:53 +08:00 1000w 的短 key 也就 1-2G 吧,key 越多,内存膨胀越厉害,可以考虑分桶+hashmap 如果不需要精确值,可以考虑 HyperLogLog、bitmap,redis 也支持这两种数据结构 |
7 SummerWQM 2018-11-12 12:28:10 +08:00 还等什么 上 spark hadoop |
8 cdwyd 2018-11-12 12:30:04 +08:00 via Android ![]() 才 90 万每月,现在的配置够用几年了 |
9 huashengshu 2018-11-12 12:30:53 +08:00 @SummerWQM 讲道理,spark/hadoop 是需要巨大成本的,1000w 一年的量,一个列式数据库就搞定了 |
![]() | 10 reus 2018-11-12 12:30:58 +08:00 ![]() 一个数据库唯一键就能解决的事情 |
![]() | 11 CharlieBrown OP @leriou 好的,谢谢指点 |
![]() | 12 CharlieBrown OP |
![]() | 13 CharlieBrown OP @SummerWQM 学习成本太大,我就做个爬虫去重而已。。 |
![]() | 14 zhengxiaowai 2018-11-12 13:39:04 +08:00 @CharlieBrown bloom filter 没有学习成本,两个命令而已,还有计算计算公式能评估错误率和所需要的容量,很好用。 |
15 watzds 2018-11-12 13:47:05 +08:00 via Android 90w 应该 90MB 不到,写入 redis 看一下内存占用 |
![]() | 16 jatesun 2018-11-12 14:02:19 +08:00 90w 跟没有数据有啥区别(如果一条数据没有图片超大文本之类的) |
![]() | 17 ClutchBear 2018-11-12 14:03:36 +08:00 ![]() 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) |
![]() | 18 ClutchBear 2018-11-12 14:05:03 +08:00 这个语法是手动创建一个新 key BF.RESERVE 2018_ccgp 0.0001 28000000 容量是两千八百万, 占用空间是 64m |
19 feverzsj 2018-11-12 14:09:35 +08:00 你先确定你是否要用 redis,为什么不用 mysql |
![]() | 20 CharlieBrown OP @zhengxiaowai 我说的是 spark hadoop 的学习成本。。。 |
![]() | 21 CharlieBrown OP @ClutchBear 好的,我去看看 |
![]() | /td> | 22 CharlieBrown OP |
![]() | 23 CharlieBrown OP @feverzsj 用 MySQL 去重可能造成数据库压力过大吧 |
![]() | 24 colincat 2018-11-12 14:50:13 +08:00 @CharlieBrown 学习能力这么差吗,偶尔我也搞爬虫,bloom filter 这个完全满足你的需求,就用这个就行,不要考虑增长问题 |
![]() | 25 gsralex 2018-11-12 14:50:37 +08:00 bloom filter 就是 hash 之后放到数组,和你用 redis 的 hash 做一个道理。就是对存储 hash key 有缩减。 |
![]() | 26 likuku 2018-11-12 14:51:53 +08:00 @CharlieBrown #10 的建议就很好啊,MySQL 觉得压力太大,那就 Sqlite 嘛~ 现有数据重插一次 |
![]() | 27 gsralex 2018-11-12 14:55:38 +08:00 mysql 压力很小的,用 mysql 就行,redis 是放在内存的。而且你为了做持久化的话,也会占用硬盘。并且 redis 的数据是在启动的时候一次性加载到内存的。你如果紧张内存就放 mysql,mysql 你加入索引,查询复杂度 log2n。 |
![]() | 28 CharlieBrown OP |
![]() | 29 gsralex 2018-11-12 15:28:16 +08:00 ![]() @CharlieBrown 可以,先考虑下 redis 是否需要持久化 |
![]() | 30 CharlieBrown OP @gsralex 应该是需要持久化的,毕竟要一直记录用于去重 |
![]() | 31 gsralex 2018-11-12 15:34:16 +08:00 @CharlieBrown 那我觉得就用 mysql 好了 |
![]() | 32 yzmm 2018-11-12 17:08:44 +08:00 sort |uniq |
![]() | 33 Linxing 2018-11-12 18:50:33 +08:00 持久化常用的两种 配置文件中都可以改 |
![]() | 34 2owe 2018-11-12 19:12:18 +08:00 via Android ![]() 如果查询稳定,某秒不过百,建议数据库吧;架构简单易维护。 |
![]() | 35 metrxqin 2018-11-12 22:24:44 +08:00 ![]() 我不准备正面回应你的问题,只想谈谈这种设计引入的成本和风险。 根据上述设计,存储前必须要先计算标题 MD5 值,连接 Redis 检查 MD5 是否存储,最终存储到 SQL 数据库。 计算、时延成本: 首先,计算 MD5 值十分消耗 CPU 资源,其次查询 Redis 将引起额外的网络时延,保存新的 MD5 也会产生网络时延。 单点风险: 由于 OP 仅部署单个 Redis,整个系统存在单点故障的风险。这样的系统无疑极其脆弱,一旦 Redis 崩溃将导致业务中断(无法保存新的文章),因此必须再增加两台主机来构成 Redis Sentinal 集群,成本将大大增加。 编码、调试、诊断困难: 必须在本地环境配置 Redis 服务器方可调试,同时需要处理 Redis 请求失败的情况。生产环境一旦发生异常,不容易诊断。 维护成本: 需要额外维护三台 Redis 服务器。 |
36 rebill 2018-11-12 23:38:44 +08:00 BloomFilter 原理,实现及优化: http://oserror.com/backend/bloomfilter/ |
![]() | 37 CharlieBrown OP @2owe 好的,肯定是每秒不过百, 之所以想用 Redis,除了学习使用外, 其实还有一个原因是我们的 MySQL 数据库最初设计的很烂,导致后期很多问题,崩溃什么的。 加上我不是那边的人员,不好插手,所以才想用 Redis,算是缓解那边压力吧 |
![]() | 38 CharlieBrown OP @metrxqin 说的很全面,长见识了。 不过我们产品一共才 3 个服务器。。。要 3 台 Redis 来维持一个健壮的系统,显然老板是不会同意的。 由于文章的表是在 MySQL 上,所以 Redis 其实是只有标题的 md5 值 加上未来的一个 ip 池 一旦 Redis 数据库丢失 ,我能想到的做法也只有从 MySQL 提取文章标题再传入 Redis 或者 Redis 不保存标题 md5 值,直接使用标题? |
![]() | 39 susecjh 2018-11-13 09:51:53 +08:00 可以看看 pika |
![]() | 40 colincat 2018-11-13 13:50:40 +08:00 via iPhone 就这么一个小东西考虑太多就是过度设计了,孩子 |