现在有一台 4G 运行内存的 centos 服务器,
想将文章标题 md5 后存到 Redis 进行去重,
数据量大概是 90w/月,并且不断累积。
想问:
( 1 )服务器大概需要多少内存(以一年数据大概 1000w 计算)
( 2 ) Redis 除了改重要指令名字,加长密码,限制 ip 外,安全方面还有什么要注意的吗
( 3 )要是服务器重启,数据会丢失吗,持久化是 Redis 自动的还是得设置
2
leriou 2018-11-12 11:55:50 +08:00 1
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 1
才 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 2
一个数据库唯一键就能解决的事情
|
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 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) |
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 好的,我去看看
|
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 1
@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 1
如果查询稳定,某秒不过百,建议数据库吧;架构简单易维护。
|
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 服务器。 |
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
就这么一个小东西考虑太多就是过度设计了,孩子
|