1
jessynt 2018-11-14 20:07:59 +08:00 via iPhone 1
yac?
|
2
eggshell 2018-11-14 20:10:27 +08:00
“打算把一个程序运行期间高频使用的数据集保存到一个常量多维数组” , redis 不符合要求吗?
|
3
webgrin OP @eggshell 惭愧,只会简单编程,暂时只考虑不借助外在工具,完全使用 php 实现。谢谢回复,有时间再学下 redis
|
4
zjsxwc 2018-11-14 20:20:02 +08:00 via Android
文件缓存,实现方式千变万化
|
5
0ZXYDDu796nVCFxq 2018-11-14 20:20:30 +08:00 via Android
是什么让你产生读数据库比读文件快的错觉……
另外,文件需要更新,你怎么保证线程安全的同时性能不明显下降?每更新一次需要写入整个数组 随便一个数据库都比你这个方案强 |
6
dobelee 2018-11-14 20:21:05 +08:00 via Android
php 常驻进程。这种情况 redis 最简单。
|
7
Lax 2018-11-14 20:24:35 +08:00
正确的写个文件缓存系统,可真不如直接用成熟的方案,除非是条件不允许。
|
8
zjsxwc 2018-11-14 20:25:18 +08:00 via Android
搜索了下,除了$_SESSION 变量,php 居然有个神奇的变量应该可以满足楼主需求 $_ENV['foobar']
|
9
zjsxwc 2018-11-14 20:26:24 +08:00 via Android
$_ENV 改 linux 全局环境变量来共享数据
|
10
chinvo 2018-11-14 20:29:41 +08:00 via iPhone
PHP-FPM/Apache Mod 正常情况下执行是一次访问一个实例的,执行完即销毁,除了 session env 之外就只能用 文件 /memcached/redis 等了
|
11
visonme 2018-11-14 20:35:56 +08:00 1
不依赖第三方,比较常用的应该就是文件方式存储(数据存储结构以那种方式优,自己评估),全局共享内存,SESSION,当然如果可以还是最推荐通过 redis 来存储
|
13
webgrin OP @zjsxwc 使用全局变量好像不解决问题,全局变量也无法跨文件使用。如果所有文件都引用一个共同的文件,就又回到了起点,相当于每个文件都需要查询一次数据库然后再转换数据得到目标数组。
|
14
loginv2 2018-11-14 20:53:18 +08:00 via Android
php 可以用共享内存的,和读写文件一样的操作
|
15
loginv2 2018-11-14 20:53:39 +08:00 via Android
其他语言也可以读写
|
17
Event 2018-11-14 21:03:51 +08:00
redis/memcached
|
18
0xff0x77 2018-11-14 21:05:51 +08:00 1
楼主想法很好,但是你考虑过 IO 性能吗?
没有什么方案可选的,其实楼主就是在纠结这么几点。 1、文件缓存 2、redis 缓存 3、shm 缓存 4、数据库读取 到底用哪个? 这四个中,shm 最快,其他都差不多,数据库最慢。 但是 shm 和文件不支持分布式 shm 可以使用余庆大佬的 https://github.com/happyfish100/libshmcache 也可以考虑鸟哥之前的 APCU,当然两者有区别,本质上性能比 redis 和数据库等需要 io 操作的东西快 100 倍 |
19
xiaoz 2018-11-14 21:47:38 +08:00 via Android
redis 进行缓存比较符合要求,而且效率很高。
|
20
ywisax 2018-11-14 22:00:31 +08:00
直接存放 redis 比较好
|
21
Actrace 2018-11-14 22:54:39 +08:00
一般 /tmp 似乎是挂内存的,直接在 /tmp 读写文件共享数据就好了,如果要求保持一致性的话,写的时候记得加个锁。
|
22
akira 2018-11-14 23:55:59 +08:00
这就是典型的内存缓存的作用啊,memcache 和 redis 都可以满足你的需求
|
23
t6attack 2018-11-15 00:22:28 +08:00
用文件当缓存,有个最简单方式,很多人使用过 ramdisk 类软件,弄出的内存虚拟盘,接近内存的读写效率。
而 centos 下,/dev/shm 目录就是系统自带的 ramdisk。把文件存在这里,就是内存的读写效率,重启后自动消失。 |
24
rebill 2018-11-15 00:35:44 +08:00
APCu 了解一下。`apcu_fetch` `apcu_store` 应该就能满足你的需求了。
|
25
msg7086 2018-11-15 01:32:54 +08:00 2
"只会简单编程,暂时只考虑不借助外在工具,完全使用 php 实现"
有点意思,放着简单好用的外部工具不用,自己去用 PHP 实现? "打算弄辆车。只会做简单的手工,所以暂时只考虑不买车,完全手工制作一辆车出来" 我只能说,加油吧兄弟,希望你早日用 PHP 写一个 Redis 的雏形出来。 |
27
lihongming 2018-11-15 02:16:50 +08:00 via iPhone
为什么都推荐 redis 而不是 memcache ?
|
28
Canon1014 2018-11-15 08:43:43 +08:00
楼主意思应该是不想用其他技术 只靠简单 php 语法实现这个功能.
|
29
sagaxu 2018-11-15 08:53:08 +08:00 via Android
swoole 了解一下
|
30
encro 2018-11-15 08:54:49 +08:00
if file_exist("config.php")
$config = file_get_contents("config.php"); else file_put_contents ("config.php",var_export($config)); 假如你的 php 安装了 opcache 扩展的话,那么性能是非常高的 用 redis 是正确的选择 |
31
encro 2018-11-15 08:55:47 +08:00
另外 eacc,apcu,opcache 都有对象缓存了解下。
|
32
encro 2018-11-15 08:57:33 +08:00
假如你存文件,JSON 的性能可能还不如 mysql 的 memcache 表
|
33
xavier007 2018-11-15 09:03:43 +08:00
采用缓存,缓存加上过期时间,过期了重新查询更新缓存;
或者刚数据更新时触发更新缓存,前提数据更新不频繁 |
34
markgor 2018-11-15 10:46:34 +08:00
数据量不大的情况下,直接利用 serialize\unserialize 存进个文件就可以啦
数据量大就考虑下 redis |
35
freewind 2018-11-15 11:08:43 +08:00
将数组生成一个 php 文件 file_put_contents ("config.php", "<?php $config =数组字符串; ?>");
修改的重新生成一下 其他文件 include |
36
ferock 2018-11-15 11:26:52 +08:00
提了那么多建议,看到的还是楼主想用文件。
|
37
est 2018-11-15 11:28:42 +08:00
一个 redis 可能不够。用 rrrrreeeeeddddddiiiiiiissssssss 就够了。
|
38
gouchaoer2 2018-11-15 13:29:31 +08:00
用 apcu 方案最好
|
39
NEETLEE 2018-11-15 15:06:37 +08:00
写文件!
|
40
duzhenlin 2018-11-15 15:44:01 +08:00
写入文件,当量上来的是你会发现文件读取的 io 就跟不上了。可以考虑内存型缓存方式
|
42
ysw 2018-11-16 01:39:13 +08:00
单例模式
|
43
qsbaq 2018-11-16 09:07:33 +08:00
你需要 redis 或者 memcache
|
44
flyingghost 2018-11-16 11:09:52 +08:00 1
方案各位大佬提了很多了。我只提醒一个事情:
自己暂时不会 -> 学习成本高->时间久 千万不要推导出 ->复杂方案不用。 自己熟悉的技术 -> 无学习成本 -> 千万不要推导出 -> 这就是简单方案。 这两件事,不等同。 哪怕是再简单的系统,用 PHP 实现文件缓存、共享内存等思路为啥大家都不用? 那是因为千万人都认为 redis/memcache 才是真·简单啊。 |
45
webgrin OP @flyingghost 逻辑明确。谢谢。目前不想采用需要进一步学习的方案主要是希望尽快做出一个“最小可用品”上线,后续会在技术方案上做进一步优化。
|