Skip to content

Commit 6eb09ef

Browse files
committed
redis setbit 支持使用lua批量写入
1 parent fe67185 commit 6eb09ef

1 file changed

Lines changed: 23 additions & 11 deletions

File tree

feapder/db/redisdb.py

Lines changed: 23 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
"""
99
import os
1010
import time
11+
from typing import Union, List
1112

1213
import redis
1314
from redis.connection import Encoder as _Encoder
@@ -743,27 +744,38 @@ def hget_count(self, table):
743744
def hkeys(self, table):
744745
return self._redis.hkeys(table)
745746

746-
def setbit(self, table, offsets, values):
747+
def setbit(
748+
self, table, offsets: Union[int, List[int]], values: Union[int, List[int]]
749+
):
747750
"""
748-
设置字符串数组某一位的值, 返回之前的值
749-
@param table:
751+
设置字符串数组某一位的值,返回之前的值
752+
@param table: Redis key
750753
@param offsets: 支持列表或单个值
751754
@param values: 支持列表或单个值
752755
@return: list / 单个值
753756
"""
754757
if isinstance(offsets, list):
755-
if not isinstance(values, list):
756-
values = [values] * len(offsets)
758+
if isinstance(values, int):
759+
# 使用lua脚本,数据是一起传给redis的,降低了网络开销,但redis会阻塞
760+
script = """
761+
local value = table.remove(ARGV, 1)
762+
local offsets = ARGV
763+
local results = {}
764+
for i, offset in ipairs(offsets) do
765+
results[i] = redis.call('SETBIT', KEYS[1], offset, value)
766+
end
767+
return results
768+
"""
769+
return self._redis.eval(script, 1, table, values, *offsets)
757770
else:
758771
assert len(offsets) == len(values), "offsets值要与values值一一对应"
772+
pipe = self._redis.pipeline()
773+
pipe.multi()
759774

760-
pipe = self._redis.pipeline()
761-
pipe.multi()
762-
763-
for offset, value in zip(offsets, values):
764-
pipe.setbit(table, offset, value)
775+
for offset, value in zip(offsets, values):
776+
pipe.setbit(table, offset, value)
765777

766-
return pipe.execute()
778+
return pipe.execute()
767779

768780
else:
769781
return self._redis.setbit(table, offsets, values)

0 commit comments

Comments
 (0)