def record_click(conn, target_id, ad_id, action=False):
    pipeline = conn.pipeline(True)
    click_key = 'clicks:%s'%ad_id

    match_key = 'terms:matched:%s'%target_id

    type = conn.hget('type:', ad_id)
    # 如果这是一个按动作计费的广告，
    # 并且被匹配的单词仍然存在，
    # 那么刷新这些单词的过期时间。
    if type == 'cpa':                      
        pipeline.expire(match_key, 900)    
        if action:
            # 记录动作信息，而不是点击信息。
            click_key = 'actions:%s' % ad_id  

    if action and type == 'cpa':
        # 根据广告的类型，维持一个全局的点击/动作计数器。
        pipeline.incr('type:%s:actions:' % type) 
    else:
        pipeline.incr('type:%s:clicks:' % type)  

    # 为广告以及所有被定向至该广告的单词记录下本次点击（或动作）。
    matched = list(conn.smembers(match_key))
    matched.append('')                      
    for word in matched:                    
        pipeline.zincrby(click_key, word)  
    pipeline.execute()

    # 对广告中出现的所有单词的 eCPM 进行更新。
    update_cpms(conn, ad_id)               
# <end id="record_click"/>


# 代码清单 7-16
# <start id="update_cpms"/>
dataset/ETHPy150Open huangz1990/riacn-code/ch07_listing_source.py/record_click/original