php - Redis + phpredis 丢失 key ——内存溢出?

标签 php memory redis phpredis

Redis 的新手,在只有 512Mb RAM 的小盒子上用 php 测试它,使用 phpredis客户。

将 3m 个整数值插入到一个集合中。但是该集合的 sCard() 方法仅返回大约 270k 计数。

这是我遇到的内存限制吗?如何在插入时检查错误?

应用程序:有两个二进制文件存储四字节无符号整数序列,我想将其加载到 Redis 中以进行快速内存差异。这是我的插入方法(跳过错误检查行):

function loadToRedis( $id, $filename){
    $length = filesize( $filename) / 4; // how many ids are there? Each is 4 bytes.
    $divisor = 100; // how many ids to insert in a single batch

    printf( "Length of %s: %d 4-byte numbers\n", $filename, $length);
    $FP = fopen($filename, 'r');
    for( $b=0; $b<=floor( $length/ $divisor); $b++){
        $set = array( $id);
        for( $i=$b*$divisor; $i < min(( $b+1)*$divisor, $length); $i++) {
            $bytes = unpack( "L", fread( $FP, 4));
            array_push( $set, array_shift( $bytes));
        }

        call_user_func_array( array( $this->redis, 'sAdd'), $set);
    }
    fclose($FP);
    printf( "%d items in the list named %s\n", $this->redis->sCard( $id), $id);
}

因此,在读取了两个 3m 值文件中的第一个之后,第一个文件的大小只有大约 270k,而第二个文件似乎完全没有 Redis:

Length of /var/www/.../dat/OLD_26750264: 3123758 4-byte numbers
270457 items in the list named OLD_26750264
Length of /var/www/.../dat/NEW_26750264: 3125000 4-byte numbers
0 items in the list named NEW_26750264

Redis INFO 输出:

redis_version:2.4.10
redis_git_sha1:00000000
redis_git_dirty:0
arch_bits:64
multiplexing_api:epoll
gcc_version:4.4.6
process_id:8416
uptime_in_seconds:1471232
uptime_in_days:17
lru_clock:1618016
used_cpu_sys:387.21
used_cpu_user:414.13
used_cpu_sys_children:0.03
used_cpu_user_children:0.32
connected_clients:1
connected_slaves:0
client_longest_output_list:0
client_biggest_input_buf:0
blocked_clients:0
used_memory:19997864
used_memory_human:19.07M
used_memory_rss:22544384
used_memory_peak:27022288
used_memory_peak_human:25.77M
mem_fragmentation_ratio:1.13
mem_allocator:jemalloc-2.2.5
loading:0
aof_enabled:0
changes_since_last_save:0
bgsave_in_progress:0
last_save_time:1379328354
bgrewriteaof_in_progress:0
total_connections_received:153
total_commands_processed:16073
expired_keys:0
evicted_keys:0
keyspace_hits:99
keyspace_misses:83
pubsub_channels:0
pubsub_patterns:0
latest_fork_usec:835
vm_enabled:0
role:master
db0:keys=2,expires=0

最佳答案

我发现:maxmemory 的实现速度比我预期的要快得多。在进一步的测试中,maxmemory = 40mb 只有 1048600 个整数值可以放入一个集合中。平均每个整数 44,62 字节。效率不高。

关于php - Redis + phpredis 丢失 key ——内存溢出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18826344/

相关文章:

php - SELECT、SELECT COUNT 和交叉引用表是否可以仅由一个查询处理?

php - 如何在 Bootstrap Modal 中传递 GET 变量?

DMA 上下文中的缓存一致性问题

c - 我怎样才能释放我在这段代码中分配的所有内容?为什么会出现段错误?

c# - 通过安全连接使用 Redis

database - 在 Redis 中对一组的所有项目进行排名

php - 正则表达式替换为函数修改的反向引用

php - api客户端中的nonce是什么

python - 如何存储多次使用的字典数据?

ruby - 使用 Redis/Ohm 按日期时间排序