统计每个用户访问次数
1.统计每个用户访问首页的次数;
2.网站用户量比较大(10w)
有些博主建议使用hash table 占用资源更少:
使用 Hash 数据类型维护大量计数器
有时候需要维护大量计数器,比如每一个论坛主题的查看数,比如每一个用户访问页面次数,因为论坛主题和用户基数可能很大,直接基于论坛主题或用户 ID 生成计数器的话,占用 Redis 资源还是相当可观的,这时可以用 Hash 数据类型压缩所需资源。
我们分别以这两种情况来看下redis资源消耗情况;
-
首先看redis 查看redis 内存情况:
127.0.0.1:6379> info memory # Memory used_memory:2452648 used_memory_human:2.34M used_memory_rss:16113664 used_memory_rss_human:15.37M used_memory_peak:22097048 used_memory_peak_human:21.07M total_system_memory:2097569792 total_system_memory_human:1.95G used_memory_lua:41984 used_memory_lua_human:41.00K maxmemory:0 maxmemory_human:0B maxmemory_policy:noeviction mem_fragmentation_ratio:6.57
2. 插入string的类型的数据10w
~~~ php
for($i=0;$i<100000;$i++) {
Redis::set('home:view'.$i,rand(1,100055));
}
- 查看redis memory
127.0.0.1:6379> info memory
# Memory
used_memory:11180680
used_memory_human:10.66M
used_memory_rss:21225472
used_memory_rss_human:20.24M
used_memory_peak:22097048
used_memory_peak_human:21.07M
total_system_memory:2097569792
total_system_memory_human:1.95G
used_memory_lua:41984
used_memory_lua_human:41.00K
maxmemory:0
maxmemory_human:0B
maxmemory_policy:noeviction
mem_fragmentation_ratio:1.90
mem_allocator:jemalloc-4.0.3
- 添加10w hash table
$data = [];
for($i=0;$i<100000;$i++) {
$data[$i] = rand(1,100055);
}
Redis::hmSet('home:view') ;
- 查看memory
127.0.0.1:6379> info memory
# Memory
used_memory:20913488
used_memory_human:19.94M
used_memory_rss:32522240
used_memory_rss_human:31.02M
used_memory_peak:22769304
used_memory_peak_human:21.71M
total_system_memory:2097569792
total_system_memory_human:1.95G
used_memory_lua:41984
used_memory_lua_human:41.00K
maxmemory:0
maxmemory_human:0B
maxmemory_policy:noeviction
mem_fragmentation_ratio:1.56
mem_allocator:jemalloc-4.0.3
通过上述测试发现,hash table 所占用的资源更加多,而且通过string添加统计可以直接用inc()方法,巴适;
所以综上所述的话,在简单的数据统计的话可能还是string更合适点;
hash 及string 缓存
需求
1.需要获取所有分类(品牌)及单个分类信息;
2.添加缓存;
-
用string :找到所有的缓存序列变化,存入redis缓存;
缺点:
1.更新某个分类需要整个分类缓存;
2.缓存更新设计不合理或不及时更容易导致双写不一致问题;
3.获取单个分类需要获取整个缓存信息;
-
用hash table:
1.通过hmset hset();轻松实现缓存的批量及单个更新;
2.获取单个分类hget(),所有分类hgetall();获取缓存更自由
以上就写了方法名不上具体代码,以上都是引用predis redis拓展包