今天在优化Feed流时发现服务重启后,初始化数据保存数据到Redis时异常慢,原来之前用的是单个set命令去做的,早就听闻Pipeline是redis批量操作的利器,正好这次用Pipeline进行优化;


二、测试代码
@Overrider private RedisTemplate strRedisTemplate; //单个新增操作 @RequestMapping(value = "/set/single", method = RequestMethod.GET) public void setSingle() { for (int i = 0; i < 100; i++) { strRedisTemplate.opsForValue().set("single:" + i, "123"); } } //批量新增操作 @RequestMapping(value = "/set/pipeline", method = RequestMethod.GET) public void setPipeline() { strRedisTemplate.executePipelined(new RedisCallback<String>() { @Override public String doInRedis(RedisConnection connection) throws DataAccessException { for (int i = 0; i < 100; i++) { connection.set(("pipel:" + i).getBytes(), "123".getBytes()); } return null; } }); } //单个读取操作 @RequestMapping(value = "/get/single", method = RequestMethod.GET) public void addSingle() { for (int i = 0; i < 100; i++) { strRedisTemplate.opsForValue().get("single:" + i); } } //批量读取操作 @RequestMapping(value = "/get/pipeline", method = RequestMethod.GET) public void getPipeline() { List<String> list = strRedisTemplate.executePipelined(new RedisCallback<String>() { @Override public String doInRedis(RedisConnection connection) throws DataAccessException { for (int i = 0; i < 100; i++) { connection.get(("pipel:" + i).getBytes()); } return null; } }); }以上代码不管set还是get 都需要return null。 另外批量读取时,返回的List,如果 connection.get 在Redis不存在,则List中会有null值存在。 需要自己去过滤null值。
SessionCallback & RedisCallback 的作用都是:让RedisTemplate进行回调,通过它们可以在同一条连接下执行多个Redis命令。SessionCalback提供了良好的封装,优先使用它,RedisCallback稍微复杂一些。
区别:
SessionCallback 可以支持事务