anchor.diff:  %%% API
   %%%===================================================================
   
  -start() ->
  -    start(no_host, no_port, redis, 100).
  -
  -start(SleepTime) ->
  -    start(no_host, no_port, redis, SleepTime).
  +start(Host, Port) ->
  +    start(Host, Port, 100).
  +
  +start(Host, Port, SleepTime) ->
  +    start(Host, Port, redis, SleepTime).
   
   start(Host, Port, CodisOrRedis, SleepTime) ->
       scan(Host, Port, CodisOrRedis, ?RUN_MODE, [SleepTime], 1000000000).
  
positive.code:     ?INFO_MSG("do_handle keys=~p",[List]),
      try
          UserList = [User||Key<-List, User<-[key_to_user(Key)], User /= skip],
          QueryPipline = [[get,?PRIVACY_REDIS_KEY ++ User]||User<-UserList],
          case easemob_redis:qp(privacy, QueryPipline) of
              PrivacyList when is_list(PrivacyList) ->
                  WritePipline = [[set, ?PRIVACY_PIKA_KEY ++ User, Value]||
                                     {User,{ok, Value}}<-lists:zip(UserList, PrivacyList),
                                     Value /= <<"[]">>],
                  %?INFO_MSG("WritePipline:~p",[WritePipline]),
                  easemob_redis:qp(privacy_pika, WritePipline);
              _ ->
                  ok
          end
       catch
           C:E ->
               ?ERROR_MSG("handle_key_list error:keys=~p, error=~p",[List, {C,E,erlang:get_stacktrace()}])
       end,
      if
          SleepTime > 0 ->
  
negative.code: %%%-------------------------------------------------------------------
  -module(privacy_redis_to_pika).
  
  %% transfer privacy from redis to pika, must run in ejabberdctl debug
  %% privacy_redis_to_pika:start(Host, Port).
  %% privacy_redis_to_pika:stop().
  
  %% API
  -export([
           start/4,
           start/3,
           start/2,
           stop/0,
           scan/6,
           scan_worker/5,
  