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