多用户以一个Map方式缓存带来的性能问题


环境
Intel(R) Xeon(R) CPU E7-4850 v3 @ 2.20GHz
CentOS release 6.4 (Final)
2.6.32-358.el6.x86_64
16335964 kB
单机下多redis服务集群

问题描述
保存用户信息相应时间过长(11861ms)。
其中调用service的save方法的方法体逻辑(保存业务表、更新ldap、同步投资理财等业务系统)共耗时1802ms,但这个save方法执行完到返回controller的时间却用了9762ms

原因
对用户等信息的CRUD操作进行了AOP拦截以更新redis缓存。而用户信息的缓存是将所有用户存储到一个HashMap中,这样 用户量比较大时对redis存储和获取的序列化和反序列化比较耗时。此次测试共 92,393个用户。所以上面save方法执行完后的aop方法比较耗时。

每个用户单独存redis缓存
     
     
     
     
User user = (User) RedisUtils.getObject(id);
而不是整体存储
     
     
     
     
Map<String,User> userMap = (Map<String,User>) RedisUtils.getMap(key);

修改后整体时间缩短为2627ms,AOP缓存处理时间缩短为241ms

测试方法
     
     
     
     
long a0 = System.currentTimeMillis();
......
long ddd = System.currentTimeMillis();
spendTimeLog.warn("****************service.save前总时间:"+(ddd-a0));

linux系统硬件配置查看方法  
http://blog.163.com/yang_jianli/blog/static/1619900062010391127338/


你可能感兴趣的:(redis,缓存,架构设置)