redis之十五(游标迭代器(过滤器)——Scan)

文章讲述了Redis中使用keys命令查询大量数据导致的服务假死问题,并介绍了从Redis2.8起提供的Scan命令作为解决方案,Scan通过游标遍历避免了性能瓶颈,支持分页查询且不会阻塞服务器。

一个问题引发的「血案」

曾经发生过这样一件事,我们的 Redis 服务器存储了海量的数据,其中登录用户信息是以 user_token_id 的形式存储的。运营人员想要当前所有的用户登录信息,然后悲剧就发生了:因为我们的工程师使用了 keys user_token_* 来查询对应的用户,结果导致 Redis 假死不可用,以至于影响到线上的其他业务接连发生问题,然后就收到了一堆的系统预警短信。并且这个假死的时间是和存储的数据成正比的,数据量越大假死的时间就越长,导致的故障时间也越长。

那如何避免这个问题呢?

问题的解决方案

在 Redis 2.8 之前,我们只能使用 keys 命令来查询我们想要的数据,但这个命令存在两个缺点:

  1. 此命令没有分页功能,我们只能一次性查询出所有符合条件的 key 值,如果查询结果非常巨大,那么得到的输出信息也会非常多;
  2. keys 命令是遍历查询,因此它的查询时间复杂度是 o(n),所以数据量越大查询时间就越长。

然而,比较幸运的是在 Redis 2.8 时推出了 Scan,解决了我们这些问题,下面来看 Scan 的具体使用。

Scan 命令使用

我们先来模拟海量数据,使用 Pipeline 添加 10w 条数据,Python 代码实现如下:

from redis import StrictRedis

redis_cli = StrictRedis(host="xx", port=xx, password="xx", db=xx, decode_responses=True)


def insert_many_string():
    pipe = redis_cli.pipeline()
    for i in range(100000):
        pipe.set("t_" + str(i), i)
    pipe.execute()
    print("success")

我们来查询用户 id 为 9999* 的数据,Scan 命令使用如下:

127.0.0.1:6380[15]> scan 0 match t_9999* count 20000
1) "15180"
2) 1) "t_99992"
127.0.0.1:6380[15]> scan 15180 match t_9999* count 20000
1) "109670"
2) 1) "t_99995"
   2) "t_99998"
   3) "t_99991"
127.0.0.1:6380[15]> scan 109670 match t_9999* count 20000
1) "34457"
2) 1) "t_99997"
   2) "t_9999"
   3) "t_99990"
127.0.0.1:6380[15]> scan 34457 match t_9999* count 20000
1) "22835"
2) 1) "t_99996"
   2) "t_99999"
127.0.0.1:6380[15]> scan 22835 match t_9999* count 20000
1) "32767"
2) 1) "t_99993"
   2) "t_99994"
127.0.0.1:6380[15]> scan 32767 match t_9999* count 20000
1) "0"
2) (empty list or set)

从以上的执行结果,我们看出两个问题:

  1. 查询的结果为空,但游标值不为 0,表示遍历还没结束;
  2. 设置的是 count 10000,但每次返回的数量都不是 10000,且不固定,这是因为 count 只是限定服务器单次遍历的字典槽位数量(约等于),而不是规定返回结果的 count 值。

相关语法:

scan cursor [MATCH pattern] [COUNT count]

其中:

  • cursor:光标位置,整数值,从 0 开始,到 0 结束,查询结果是空,但游标值不为 0,表示遍历还没结束;
  • match pattern:正则匹配字段;
  • count:限定服务器单次遍历的字典槽位数量(约等于),只是对增量式迭代命令的一种提示(hint),并不是查询结果返回的最大数量,它的默认值是 10。

代码实战

本文我们使用 Pthon 代码来实现 Scan 的查询功能,代码如下:

def use_scan():
    cursor = 0
    match = "t_9999*"
    count = 20000
    res = redis_cli.scan(cursor, match, count)
    print("first result: >>>>", res)
    while True:
        if res[0] != 0:
            cursor = res[0]
            res = redis_cli.scan(cursor, match, count)
            print("next result: >>>", res)
        else:
            break

以上程序执行结果如下: 

 first result: >>>> (15180, ['t_99992'])
next result: >>> (109670, ['t_99995', 't_99998', 't_99991'])
next result: >>> (34457, ['t_99997', 't_9999', 't_99990'])
next result: >>> (22835, ['t_99996', 't_99999'])
next result: >>> (32767, ['t_99993', 't_99994'])
next result: >>> (0, [])

Scan 相关命令

Scan 是一个系列指令,除了 Scan 之外,还有以下 3 个命令:

  1. HScan 遍历字典游标迭代器
  2. SScan 遍历集合的游标迭代器
  3. ZScan 遍历有序集合的游标迭代器

来看这些命令的具体使用。

HScan 使用

def insert_many_hash():
    # 插入多个键值对
    pipe = redis_cli.pipeline()
    for i in range(2000):
        pipe.hset("hscan", "hk" + str(i), i)
    pipe.execute()

def test_hscan():
    # 使用hscan查询
    cursor = 0
    match = "hk*"
    count = 300
    res = redis_cli.hscan("hscan", cursor, match, count)
    print("first res : >>>", res)
    while True:
        if res[0] != 0:
            cursor = res[0]
            res = redis_cli.hscan("hscan", cursor, match, count)
            print("next res : >>>", res)
        else:
            break

以上程序执行结果如下: 

first res : >>> (420, {'hk1446': '1446', 'hk962': '962', 'hk300': '300', 'hk917': '917', 'hk905': '905', 'hk1837': '1837', 'hk576': '576', 'hk80': '80', 'hk838': '838', 'hk1374': '1374', 'hk1335': '1335', 'hk385': '385', 'hk924': '924', 'hk36': '36', 'hk641': '641', 'hk1457': '1457', 'hk1213': '1213', 'hk715': '715', 'hk864': '864', 'hk1957': '1957', 'hk161': '161', 'hk271': '271', 'hk1516': '1516', 'hk1331': '1331', 'hk13': '13', 'hk738': '738', 'hk433': '433', 'hk239': '239', 'hk945': '945', 'hk11': '11', 'hk63': '63', 'hk653': '653', 'hk1392': '1392', 'hk188': '188', 'hk1321': '1321', 'hk1133': '1133', 'hk315': '315', 'hk1514': '1514', 'hk143': '143', 'hk1533': '1533', 'hk1747': '1747', 'hk521': '521', 'hk604': '604', 'hk658': '658', 'hk114': '114', 'hk1005': '1005', 'hk1793': '1793', 'hk621': '621', 'hk1244': '1244', 'hk1724': '1724', 'hk311': '311', 'hk676': '676', 'hk1088': '1088', 'hk923': '923', 'hk118': '118', 'hk1830': '1830', 'hk1959': '1959', 'hk1146': '1146', 'hk1248': '1248', 'hk1487': '1487', 'hk400': '400', 'hk531': '531', 'hk111': '111', 'hk1927': '1927', 'hk49': '49', 'hk1357': '1357', 'hk916': '916', 'hk402': '402', 'hk936': '936', 'hk396': '396', 'hk994': '994', 'hk1137': '1137', 'hk1640': '1640', 'hk1405': '1405', 'hk627': '627', 'hk75': '75', 'hk246': '246', 'hk1013': '1013', 'hk887': '887', 'hk1203': '1203', 'hk1184': '1184', 'hk790': '790', 'hk594': '594', 'hk933': '933', 'hk977': '977', 'hk56': '56', 'hk467': '467', 'hk1081': '1081', 'hk1932': '1932', 'hk1193': '1193', 'hk195': '195', 'hk930': '930', 'hk851': '851', 'hk902': '902', 'hk1269': '1269', 'hk1990': '1990', 'hk906': '906', 'hk1233': '1233', 'hk1871': '1871', 'hk577': '577', 'hk473': '473', 'hk105': '105', 'hk384': '384', 'hk470': '470', 'hk926': '926', 'hk196': '196', 'hk1450': '1450', 'hk1682': '1682', 'hk990': '990', 'hk292': '292', 'hk774': '774', 'hk557': '557', 'hk1101': '1101', 'hk1712': '1712', 'hk605': '605', 'hk1115': '1115', 'hk439': '439', 'hk421': '421', 'hk79': '79', 'hk826': '826', 'hk673': '673', 'hk1348': '1348', 'hk1798': '1798', 'hk946': '946', 'hk50': '50', 'hk1451': '1451', 'hk1340': '1340', 'hk193': '193', 'hk221': '221', 'hk727': '727', 'hk897': '897', 'hk1803': '1803', 'hk252': '252', 'hk128': '128', 'hk908': '908', 'hk1109': '1109', 'hk1791': '1791', 'hk1710': '1710', 'hk634': '634', 'hk1071': '1071', 'hk380': '380', 'hk214': '214', 'hk1079': '1079', 'hk1056': '1056', 'hk1014': '1014', 'hk327': '327', 'hk970': '970', 'hk339': '339', 'hk1346': '1346', 'hk409': '409', 'hk43': '43', 'hk1422': '1422', 'hk969': '969', 'hk961': '961', 'hk1347': '1347', 'hk603': '603', 'hk318': '318', 'hk788': '788', 'hk1317': '1317', 'hk1896': '1896', 'hk3': '3', 'hk466': '466', 'hk638': '638', 'hk568': '568', 'hk581': '581', 'hk804': '804', 'hk15': '15', 'hk748': '748', 'hk1838': '1838', 'hk1279': '1279', 'hk260': '260', 'hk1881': '1881', 'hk1389': '1389', 'hk302': '302', 'hk197': '197', 'hk1181': '1181', 'hk1168': '1168', 'hk1677': '1677', 'hk754': '754', 'hk1930': '1930', 'hk1666': '1666', 'hk1209': '1209', 'hk1560': '1560', 'hk1879': '1879', 'hk68': '68', 'hk1151': '1151', 'hk1136': '1136', 'hk1548': '1548', 'hk1613': '1613', 'hk317': '317', 'hk1318': '1318', 'hk225': '225', 'hk278': '278', 'hk1142': '1142', 'hk1825': '1825', 'hk1786': '1786', 'hk8': '8', 'hk892': '892', 'hk1057': '1057', 'hk1615': '1615', 'hk463': '463', 'hk1217': '1217', 'hk1949': '1949', 'hk670': '670', 'hk1090': '1090', 'hk352': '352', 'hk259': '259', 'hk739': '739', 'hk23': '23', 'hk272': '272', 'hk796': '796', 'hk1021': '1021', 'hk373': '373', 'hk589': '589', 'hk1499': '1499', 'hk1127': '1127', 'hk764': '764', 'hk224': '224', 'hk112': '112', 'hk509': '509', 'hk588': '588', 'hk1433': '1433', 'hk1328': '1328', 'hk590': '590', 'hk1238': '1238', 'hk501': '501', 'hk1053': '1053', 'hk1461': '1461', 'hk1471': '1471', 'hk1631': '1631', 'hk1792': '1792', 'hk1728': '1728', 'hk1390': '1390', 'hk1846': '1846', 'hk1781': '1781', 'hk1581': '1581', 'hk241': '241', 'hk664': '664', 'hk1044': '1044', 'hk18': '18', 'hk1925': '1925', 'hk1831': '1831', 'hk740': '740', 'hk65': '65', 'hk1597': '1597', 'hk1503': '1503', 'hk713': '713', 'hk1258': '1258', 'hk124': '124', 'hk1890': '1890', 'hk205': '205', 'hk963': '963', 'hk686': '686', 'hk1914': '1914', 'hk337': '337', 'hk1769': '1769', 'hk1085': '1085', 'hk1359': '1359', 'hk184': '184', 'hk1694': '1694', 'hk1473': '1473', 'hk1095': '1095', 'hk1164': '1164', 'hk736': '736', 'hk397': '397', 'hk1192': '1192', 'hk1600': '1600', 'hk164': '164', 'hk1200': '1200', 'hk1977': '1977', 'hk513': '513', 'hk721': '721', 'hk1929': '1929', 'hk1910': '1910', 'hk273': '273', 'hk233': '233', 'hk841': '841', 'hk1749': '1749', 'hk752': '752', 'hk1126': '1126', 'hk820': '820', 'hk1984': '1984', 'hk47': '47', 'hk257': '257', 'hk751': '751', 'hk398': '398', 'hk484': '484', 'hk907': '907', 'hk1997': '1997', 'hk108': '108', 'hk1832': '1832', 'hk69': '69', 'hk882': '882', 'hk1371': '1371', 'hk706': '706', 'hk708': '708', 'hk698': '698', 'hk901': '901', 'hk1802': '1802', 'hk1237': '1237'})
next res : >>> (2002, {'hk1970': '1970', 'hk394': '394', 'hk1010': '1010', 'hk564': '564', 'hk412': '412', 'hk1858': '1858', 'hk358': '358', 'hk165': '165', 'hk200': '200', 'hk190': '190', 'hk587': '587', 'hk1552': '1552', 'hk1537': '1537', 'hk651': '651', 'hk381': '381', 'hk1982': '1982', 'hk159': '159', 'hk646': '646', 'hk1199': '1199', 'hk822': '822', 'hk1679': '1679', 'hk453': '453', 'hk335': '335', 'hk1360': '1360', 'hk1314': '1314', 'hk452': '452', 'hk1725': '1725', 'hk1716': '1716', 'hk547': '547', 'hk46': '46', 'hk1787': '1787', 'hk1310': '1310', 'hk1049': '1049', 'hk298': '298', 'hk1438': '1438', 'hk729': '729', 'hk306': '306', 'hk1783': '1783', 'hk1737': '1737', 'hk1732': '1732', 'hk281': '281', 'hk1119': '1119', 'hk735': '735', 'hk427': '427', 'hk1355': '1355', 'hk1040': '1040', 'hk1571': '1571', 'hk1163': '1163', 'hk270': '270', 'hk537': '537', 'hk1839': '1839', 'hk525': '525', 'hk543': '543', 'hk82': '82', 'hk16': '16', 'hk1052': '1052', 'hk853': '853', 'hk898': '898', 'hk491': '491', 'hk106': '106', 'hk575': '575', 'hk1874': '1874', 'hk483': '483', 'hk210': '210', 'hk1667': '1667', 'hk343': '343', 'hk1693': '1693', 'hk1652': '1652', 'hk1543': '1543', 'hk692': '692', 'hk1401': '1401', 'hk702': '702', 'hk679': '679', 'hk1668': '1668', 'hk1215': '1215', 'hk1505': '1505', 'hk1298': '1298', 'hk876': '876', 'hk1502': '1502', 'hk1442': '1442', 'hk1382': '1382', 'hk1128': '1128', 'hk178': '178', 'hk1757': '1757', 'hk1327': '1327', 'hk1068': '1068', 'hk477': '477', 'hk101': '101', 'hk1343': '1343', 'hk763': '763', 'hk1004': '1004', 'hk1958': '1958', 'hk682': '682', 'hk1569': '1569', 'hk78': '78', 'hk914': '914', 'hk308': '308', 'hk296': '296', 'hk103': '103', 'hk1246': '1246', 'hk1226': '1226', 'hk789': '789', 'hk123': '123', 'hk1230': '1230', 'hk1319': '1319', 'hk207': '207', 'hk705': '705', 'hk1272': '1272', 'hk935': '935', 'hk1886': '1886', 'hk1462': '1462', 'hk642': '642', 'hk1444': '1444', 'hk480': '480', 'hk1093': '1093', 'hk544': '544', 'hk87': '87', 'hk1036': '1036', 'hk256': '256', 'hk1174': '1174', 'hk1324': '1324', 'hk1828': '1828', 'hk297': '297', 'hk1460': '1460', 'hk1766': '1766', 'hk697': '697', 'hk70': '70', 'hk1876': '1876', 'hk1262': '1262', 'hk1780': '1780', 'hk7': '7', 'hk1111': '1111', 'hk704': '704', 'hk983': '983', 'hk1522': '1522', 'hk1880': '1880', 'hk1251': '1251', 'hk1121': '1121', 'hk1844': '1844', 'hk778': '778', 'hk1255': '1255', 'hk1817': '1817', 'hk1286': '1286', 'hk596': '596', 'hk1806': '1806', 'hk1299': '1299', 'hk1160': '1160', 'hk1595': '1595', 'hk149': '149', 'hk615': '615', 'hk1190': '1190', 'hk1857': '1857', 'hk813': '813', 'hk893': '893', 'hk737': '737', 'hk1291': '1291', 'hk1204': '1204', 'hk1152': '1152', 'hk171': '171', 'hk295': '295', 'hk481': '481', 'hk1469': '1469', 'hk462': '462', 'hk226': '226', 'hk1848': '1848', 'hk29': '29', 'hk625': '625', 'hk144': '144', 'hk968': '968', 'hk526': '526', 'hk1815': '1815', 'hk1704': '1704', 'hk672': '672', 'hk1464': '1464', 'hk1673': '1673', 'hk1705': '1705', 'hk749': '749', 'hk1480': '1480', 'hk146': '146', 'hk370': '370', 'hk1567': '1567', 'hk899': '899', 'hk493': '493', 'hk1396': '1396', 'hk1377': '1377', 'hk1889': '1889', 'hk107': '107', 'hk145': '145', 'hk437': '437', 'hk407': '407', 'hk1023': '1023', 'hk1414': '1414', 'hk1398': '1398', 'hk885': '885', 'hk345': '345', 'hk9': '9', 'hk699': '699', 'hk1801': '1801', 'hk1353': '1353', 'hk1144': '1144', 'hk971': '971', 'hk1738': '1738', 'hk775': '775', 'hk74': '74', 'hk1681': '1681', 'hk20': '20', 'hk1303': '1303', 'hk1148': '1148', 'hk177': '177', 'hk215': '215', 'hk1531': '1531', 'hk1113': '1113', 'hk1720': '1720', 'hk640': '640', 'hk835': '835', 'hk848': '848', 'hk1129': '1129', 'hk66': '66', 'hk1065': '1065', 'hk631': '631', 'hk55': '55', 'hk136': '136', 'hk1643': '1643', 'hk875': '875', 'hk1393': '1393', 'hk1921': '1921', 'hk1424': '1424', 'hk1026': '1026', 'hk619': '619', 'hk687': '687', 'hk1210': '1210', 'hk1572': '1572', 'hk1917': '1917', 'hk1421': '1421', 'hk643': '643', 'hk1579': '1579', 'hk532': '532', 'hk654': '654', 'hk1556': '1556', 'hk223': '223', 'hk1267': '1267', 'hk560': '560', 'hk1629': '1629', 'hk614': '614', 'hk1991': '1991', 'hk1526': '1526', 'hk67': '67', 'hk166': '166', 'hk1731': '1731', 'hk1653': '1653', 'hk666': '666', 'hk1100': '1100', 'hk1590': '1590', 'hk172': '172', 'hk115': '115', 'hk1776': '1776', 'hk1774': '1774', 'hk657': '657', 'hk1232': '1232', 'hk307': '307', 'hk1764': '1764', 'hk1162': '1162', 'hk1808': '1808', 'hk492': '492', 'hk1441': '1441', 'hk821': '821', 'hk1642': '1642', 'hk569': '569', 'hk304': '304', 'hk1385': '1385', 'hk323': '323', 'hk973': '973', 'hk1463': '1463', 'hk811': '811', 'hk1620': '1620', 'hk565': '565', 'hk694': '694', 'hk1689': '1689', 'hk250': '250', 'hk1483': '1483', 'hk844': '844', 'hk1979': '1979', 'hk785': '785', 'hk406': '406', 'hk369': '369', 'hk194': '194', 'hk1610': '1610', 'hk422': '422', 'hk490': '490', 'hk1341': '1341', 'hk780': '780', 'hk800': '800', 'hk1602': '1602', 'hk1539': '1539', 'hk803': '803', 'hk976': '976', 'hk1500': '1500', 'hk996': '996', 'hk1493': '1493', 'hk1412': '1412'})
next res : >>> (1806, {'hk365': '365', 'hk363': '363', 'hk211': '211', 'hk807': '807', 'hk1475': '1475', 'hk743': '743', 'hk1361': '1361', 'hk1648': '1648', 'hk1410': '1410', 'hk62': '62', 'hk1762': '1762', 'hk726': '726', 'hk1091': '1091', 'hk216': '216', 'hk966': '966', 'hk498': '498', 'hk1141': '1141', 'hk130': '130', 'hk1993': '1993', 'hk133': '133', 'hk1960': '1960', 'hk1099': '1099', 'hk1743': '1743', 'hk1332': '1332', 'hk1906': '1906', 'hk1369': '1369', 'hk1094': '1094', 'hk76': '76', 'hk1325': '1325', 'hk1086': '1086', 'hk1553': '1553', 'hk1015': '1015', 'hk359': '359', 'hk912': '912', 'hk1761': '1761', 'hk620': '620', 'hk799': '799', 'hk1120': '1120', 'hk451': '451', 'hk85': '85', 'hk1270': '1270', 'hk1713': '1713', 'hk1498': '1498', 'hk1364': '1364', 'hk583': '583', 'hk1467': '1467', 'hk1306': '1306', 'hk1907': '1907', 'hk475': '475', 'hk1296': '1296', 'hk264': '264', 'hk1330': '1330', 'hk877': '877', 'hk1758': '1758', 'hk0': '0', 'hk1683': '1683', 'hk1614': '1614', 'hk542': '542', 'hk441': '441', 'hk1885': '1885', 'hk649': '649', 'hk662': '662', 'hk1051': '1051', 'hk529': '529', 'hk847': '847', 'hk154': '154', 'hk816': '816', 'hk1278': '1278', 'hk944': '944', 'hk1045': '1045', 'hk1143': '1143', 'hk1964': '1964', 'hk998': '998', 'hk1981': '1981', 'hk1862': '1862', 'hk1138': '1138', 'hk1912': '1912', 'hk1218': '1218', 'hk1818': '1818', 'hk1840': '1840', 'hk1638': '1638', 'hk41': '41', 'hk1618': '1618', 'hk1139': '1139', 'hk446': '446', 'hk1406': '1406', 'hk325': '325', 'hk1772': '1772', 'hk1540': '1540', 'hk377': '377', 'hk1672': '1672', 'hk849': '849', 'hk158': '158', 'hk601': '601', 'hk1623': '1623', 'hk1131': '1131', 'hk552': '552', 'hk584': '584', 'hk251': '251', 'hk320': '320', 'hk585': '585', 'hk110': '110', 'hk1436': '1436', 'hk1936': '1936', 'hk1408': '1408', 'hk894': '894', 'hk1980': '1980', 'hk253': '253', 'hk379': '379', 'hk967': '967', 'hk561': '561', 'hk1661': '1661', 'hk181': '181', 'hk611': '611', 'hk1260': '1260', 'hk1239': '1239', 'hk497': '497', 'hk1492': '1492', 'hk129': '129', 'hk1486': '1486', 'hk784': '784', 'hk559': '559', 'hk5': '5', 'hk801': '801', 'hk139': '139', 'hk1707': '1707', 'hk511': '511', 'hk1609': '1609', 'hk1900': '1900', 'hk160': '160', 'hk1663': '1663', 'hk622': '622', 'hk1994': '1994', 'hk1568': '1568', 'hk72': '72', 'hk312': '312', 'hk866': '866', 'hk512': '512', 'hk486': '486', 'hk1287': '1287', 'hk277': '277', 'hk1294': '1294', 'hk1841': '1841', 'hk1282': '1282', 'hk231': '231', 'hk1647': '1647', 'hk417': '417', 'hk1608': '1608', 'hk910': '910', 'hk147': '147', 'hk469': '469', 'hk650': '650', 'hk1425': '1425', 'hk747': '747', 'hk1038': '1038', 'hk1800': '1800', 'hk1283': '1283', 'hk1867': '1867', 'hk1607': '1607', 'hk1402': '1402', 'hk1106': '1106', 'hk1821': '1821', 'hk606': '606', 'hk1411': '1411', 'hk1256': '1256', 'hk1565': '1565', 'hk719': '719', 'hk725': '725', 'hk1198': '1198', 'hk951': '951', 'hk1864': '1864', 'hk932': '932', 'hk1523': '1523', 'hk1922': '1922', 'hk1547': '1547', 'hk955': '955', 'hk1316': '1316', 'hk24': '24', 'hk61': '61', 'hk815': '815', 'hk1235': '1235', 'hk675': '675', 'hk972': '972', 'hk1494': '1494', 'hk93': '93', 'hk212': '212', 'hk610': '610', 'hk478': '478', 'hk35': '35', 'hk836': '836', 'hk1767': '1767', 'hk174': '174', 'hk1481': '1481', 'hk263': '263', 'hk765': '765', 'hk1134': '1134', 'hk549': '549', 'hk1016': '1016', 'hk1428': '1428', 'hk632': '632', 'hk693': '693', 'hk1937': '1937', 'hk1915': '1915', 'hk1819': '1819', 'hk401': '401', 'hk878': '878', 'hk1985': '1985', 'hk1454': '1454', 'hk1084': '1084', 'hk1536': '1536', 'hk38': '38', 'hk1542': '1542', 'hk554': '554', 'hk1779': '1779', 'hk652': '652', 'hk1734': '1734', 'hk548': '548', 'hk167': '167', 'hk1047': '1047', 'hk1718': '1718', 'hk734': '734', 'hk269': '269', 'hk1491': '1491', 'hk667': '667', 'hk655': '655', 'hk995': '995', 'hk444': '444', 'hk669': '669', 'hk829': '829', 'hk931': '931', 'hk461': '461', 'hk1242': '1242', 'hk1380': '1380', 'hk1247': '1247', 'hk1546': '1546', 'hk656': '656', 'hk1913': '1913', 'hk1067': '1067', 'hk454': '454', 'hk1104': '1104', 'hk1963': '1963', 'hk1973': '1973', 'hk294': '294', 'hk709': '709', 'hk440': '440', 'hk1974': '1974', 'hk1775': '1775', 'hk570': '570', 'hk779': '779', 'hk915': '915', 'hk1770': '1770', 'hk1221': '1221', 'hk1940': '1940', 'hk416': '416', 'hk1290': '1290', 'hk357': '357', 'hk341': '341', 'hk186': '186', 'hk802': '802', 'hk593': '593', 'hk1872': '1872', 'hk1975': '1975', 'hk1708': '1708', 'hk1702': '1702', 'hk855': '855', 'hk1686': '1686', 'hk629': '629', 'hk1664': '1664', 'hk1551': '1551', 'hk1953': '1953', 'hk1009': '1009', 'hk744': '744', 'hk199': '199', 'hk1455': '1455', 'hk1222': '1222', 'hk30': '30', 'hk1942': '1942', 'hk353': '353', 'hk1669': '1669', 'hk1518': '1518', 'hk746': '746', 'hk137': '137', 'hk1649': '1649', 'hk1466': '1466', 'hk1427': '1427', '

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值