Przeglądaj źródła

update redis incr & decr

liqian 3 lat temu
rodzic
commit
15bc4d7df1
5 zmienionych plików z 51 dodań i 33 usunięć
  1. 4 2
      config.py
  2. 31 6
      db_helper.py
  3. 4 15
      recommend.py
  4. 9 7
      utils.py
  5. 3 3
      video_recall.py

+ 4 - 2
config.py

@@ -34,6 +34,8 @@ class BaseConfig(object):
     LAST_VIDEO_FROM_ROV_POOL_PREFIX = 'com.weiqu.video.rov.pool.last.'
 
     # 本地记录视频的可分发数,控制分发,完整key格式:com.weiqu.video.flowpool.local.distribute.count.{h}
+    # LOCAL_DISTRIBUTE_COUNT_PREFIX = 'com.weiqu.video.flowpool.local.distribute.count.'
+    # 本地记录视频的可分发数,控制分发,完整key格式:com.weiqu.video.flowpool.local.distribute.count.{videoId}.{flowPool}
     LOCAL_DISTRIBUTE_COUNT_PREFIX = 'com.weiqu.video.flowpool.local.distribute.count.'
 
     # 从ROV召回池获取视频的最大频次,限制每次请求的获取次数
@@ -157,7 +159,7 @@ class ProductionConfig(BaseConfig):
 
 
 def set_config():
-    # return DevelopmentConfig()
+    return DevelopmentConfig()
     # return TestConfig()
     # return PreProductionConfig()
-    return ProductionConfig()
+    # return ProductionConfig()

+ 31 - 6
db_helper.py

@@ -77,7 +77,7 @@ class RedisHelper(object):
         新增数据,有序set
         :param key_name: key
         :param data: 元素的值及对应分数 type-dict  {value: score}
-        :param expire_time: 过期时间,单位:s,默认7天
+        :param expire_time: 过期时间,单位:s,默认7天,type-int
         :return: None
         """
         conn = self.connect()
@@ -122,7 +122,7 @@ class RedisHelper(object):
         :param key_name: key
         :param value: 元素的值
         :param score: value对应的score更新值
-        :param expire_time: 过期时间,单位:s,默认7天
+        :param expire_time: 过期时间,单位:s,默认7天,type-int
         """
         conn = self.connect()
         if conn.exists(key_name):
@@ -170,7 +170,7 @@ class RedisHelper(object):
         新增数据,set
         :param key_name: key
         :param values: 要添加的元素  类型-tuple
-        :param expire_time: 过期时间,单位:s,默认0.5小时
+        :param expire_time: 过期时间,单位:s,默认0.5小时 type-int
         :return: None
         """
         conn = self.connect()
@@ -198,6 +198,30 @@ class RedisHelper(object):
         conn = self.connect()
         conn.srem(key_name, *values)
 
+    def decr_key(self, key_name, amount=1, expire_time=30*60):
+        """
+        redis自减
+        :param key_name: key
+        :param amount: 自减数,默认为1,type-int
+        :param expire_time: 过期时间,单位:s,默认0.5小时 type-int
+        :return: None
+        """
+        conn = self.connect()
+        conn.decr(name=key_name, amount=amount)
+        conn.expire(key_name, int(expire_time))
+
+    def incr_key(self, key_name, amount=1, expire_time=30*60):
+        """
+        redis自增
+        :param key_name: key
+        :param amount: 自减数,默认为1,type-int
+        :param expire_time: 过期时间,单位:s,默认0.5小时 type-int
+        :return: None
+        """
+        conn = self.connect()
+        conn.incr(name=key_name, amount=amount)
+        conn.expire(key_name, int(expire_time))
+
 
 class HologresHelper(object):
     def __init__(self):
@@ -222,6 +246,7 @@ class HologresHelper(object):
 
 if __name__ == '__main__':
     redis_helper = RedisHelper()
-    key = 'com.weiqu.video.flowpool.local.distribute.count.11.5'
-    redis_helper.add_data_with_zset(key, {'12345-133#442#2': 8.0})
-
+    key = 'flow.video.12345.123#112'
+    # redis_helper.decr_key(key_name=key)
+    res = redis_helper.get_data_from_redis(key_name=key)
+    print(int(res), type(int(res)))

+ 4 - 15
recommend.py

@@ -100,26 +100,15 @@ def update_local_distribute_count(videos):
     :return:
     """
     try:
-        redis_h = datetime.now().hour
-        if datetime.now().minute >= 30:
-            redis_h += 0.5
-        key_name = config_.LOCAL_DISTRIBUTE_COUNT_PREFIX + str(redis_h)
-        print(key_name)
         redis_helper = RedisHelper()
-        update_data = {}
         for item in videos:
-            video = '{}-{}'.format(item['videoId'], item['flowPool'])
-            current_count = redis_helper.get_score_with_value(key_name=key_name, value=video)
-            if current_count is not None:
+            key_name = '{}{}.{}'.format(config_.LOCAL_DISTRIBUTE_COUNT_PREFIX, item['videoId'], item['flowPool'])
+            if redis_helper.key_exists(key_name=key_name):
                 # 该视频本地有记录,本地记录的分发数 - 1
-                new_count = current_count - 1
+                redis_helper.decr_key(key_name=key_name, amount=1, expire_time=10 * 60)
             else:
                 # 该视频本地无记录,接口获取的分发数 - 1
-                new_count = int(item['distributeCount']) - 1
-            update_data[video] = new_count
-        log_.info('now update video local distribute count: {}, key: {}'.format(update_data, key_name))
-        # 更新redis中的数据
-        redis_helper.add_data_with_zset(key_name=key_name, data=update_data, expire_time=0.5*3600)
+                redis_helper.incr_key(key_name=key_name, amount=int(item['distributeCount']) - 1, expire_time=10 * 60)
 
     except Exception as e:
         log_.error(traceback.format_exc())

+ 9 - 7
utils.py

@@ -62,15 +62,17 @@ def get_videos_local_distribute_count(video_id, flow_pool):
     :param flow_pool: 流量池标记
     :return: current_count 本地记录的分发数
     """
-    redis_h = datetime.now().hour
-    if datetime.now().minute >= 30:
-        redis_h += 0.5
-    key_name = config_.LOCAL_DISTRIBUTE_COUNT_PREFIX + str(redis_h)
+    # redis_h = datetime.now().hour
+    # if datetime.now().minute >= 30:
+    #     redis_h += 0.5
+    # key_name = config_.LOCAL_DISTRIBUTE_COUNT_PREFIX + str(redis_h)
+    key_name = '{}{}.{}'.format(config_.LOCAL_DISTRIBUTE_COUNT_PREFIX, video_id, flow_pool)
     redis_helper = RedisHelper()
-    video = '{}-{}'.format(video_id, flow_pool)
-    current_count = redis_helper.get_score_with_value(key_name=key_name, value=video)
+    # video = '{}-{}'.format(video_id, flow_pool)
+    # current_count = redis_helper.get_score_with_value(key_name=key_name, value=video)
+    current_count = redis_helper.get_data_from_redis(key_name=key_name)
     if current_count is not None:
-        return current_count
+        return int(current_count)
     else:
         return None
 

+ 3 - 3
video_recall.py

@@ -161,9 +161,9 @@ class PoolRecall(object):
                 if cur_count is None or cur_count > 0:
                     check_result.append(item)
                 # cur_count <= 0,从流量召回池移除
-                else:
-                    value = '{}-{}'.format(item[0], item[1])
-                    self.redis_helper.remove_value_from_zset(key_name=flow_pool_key, value=value)
+                # else:
+                #     value = '{}-{}'.format(item[0], item[1])
+                #     self.redis_helper.remove_value_from_zset(key_name=flow_pool_key, value=value)
             else:
                 # viewCount <= 0
                 # 从流量召回池移除