re-common 10.0.39__py3-none-any.whl → 10.0.40__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (218) hide show
  1. re_common/baselibrary/__init__.py +4 -4
  2. re_common/baselibrary/baseabs/__init__.py +6 -6
  3. re_common/baselibrary/baseabs/baseabs.py +26 -26
  4. re_common/baselibrary/database/mbuilder.py +132 -132
  5. re_common/baselibrary/database/moudle.py +93 -93
  6. re_common/baselibrary/database/msqlite3.py +194 -194
  7. re_common/baselibrary/database/mysql.py +169 -169
  8. re_common/baselibrary/database/sql_factory.py +26 -26
  9. re_common/baselibrary/mthread/MThreadingRun.py +486 -486
  10. re_common/baselibrary/mthread/MThreadingRunEvent.py +349 -349
  11. re_common/baselibrary/mthread/__init__.py +2 -2
  12. re_common/baselibrary/mthread/mythreading.py +695 -695
  13. re_common/baselibrary/pakge_other/socks.py +404 -404
  14. re_common/baselibrary/readconfig/config_factory.py +18 -18
  15. re_common/baselibrary/readconfig/ini_config.py +317 -317
  16. re_common/baselibrary/readconfig/toml_config.py +49 -49
  17. re_common/baselibrary/temporary/envdata.py +36 -36
  18. re_common/baselibrary/tools/all_requests/aiohttp_request.py +118 -118
  19. re_common/baselibrary/tools/all_requests/httpx_requet.py +102 -102
  20. re_common/baselibrary/tools/all_requests/mrequest.py +412 -412
  21. re_common/baselibrary/tools/all_requests/requests_request.py +81 -81
  22. re_common/baselibrary/tools/batch_compre/bijiao_batch.py +31 -31
  23. re_common/baselibrary/tools/contrast_db3.py +123 -123
  24. re_common/baselibrary/tools/copy_file.py +39 -39
  25. re_common/baselibrary/tools/db3_2_sizedb3.py +102 -102
  26. re_common/baselibrary/tools/foreachgz.py +39 -39
  27. re_common/baselibrary/tools/get_attr.py +10 -10
  28. re_common/baselibrary/tools/image_to_pdf.py +61 -61
  29. re_common/baselibrary/tools/java_code_deal.py +139 -139
  30. re_common/baselibrary/tools/javacode.py +79 -79
  31. re_common/baselibrary/tools/mdb_db3.py +48 -48
  32. re_common/baselibrary/tools/merge_file.py +171 -171
  33. re_common/baselibrary/tools/merge_gz_file.py +165 -165
  34. re_common/baselibrary/tools/mhdfstools/down_hdfs_files.py +42 -42
  35. re_common/baselibrary/tools/mhdfstools/hdfst.py +42 -42
  36. re_common/baselibrary/tools/mhdfstools/up_hdfs_files.py +38 -38
  37. re_common/baselibrary/tools/mongo_tools.py +50 -50
  38. re_common/baselibrary/tools/move_file.py +170 -170
  39. re_common/baselibrary/tools/move_mongo/mongo_table_to_file.py +63 -63
  40. re_common/baselibrary/tools/move_mongo/move_mongo_table.py +354 -354
  41. re_common/baselibrary/tools/move_mongo/use_mttf.py +18 -18
  42. re_common/baselibrary/tools/move_mongo/use_mv.py +93 -93
  43. re_common/baselibrary/tools/mpandas/mpandasreadexcel.py +125 -125
  44. re_common/baselibrary/tools/mpandas/pandas_visualization.py +7 -7
  45. re_common/baselibrary/tools/myparsel.py +104 -104
  46. re_common/baselibrary/tools/rename_dir_file.py +37 -37
  47. re_common/baselibrary/tools/sequoiadb_utils.py +398 -398
  48. re_common/baselibrary/tools/split_line_to_many.py +25 -25
  49. re_common/baselibrary/tools/stringtodicts.py +33 -33
  50. re_common/baselibrary/tools/workwechant_bot.py +84 -84
  51. re_common/baselibrary/utils/baseaiohttp.py +296 -296
  52. re_common/baselibrary/utils/baseaiomysql.py +87 -87
  53. re_common/baselibrary/utils/baseallstep.py +191 -191
  54. re_common/baselibrary/utils/baseavro.py +19 -19
  55. re_common/baselibrary/utils/baseboto3.py +291 -291
  56. re_common/baselibrary/utils/basecsv.py +32 -32
  57. re_common/baselibrary/utils/basedict.py +133 -133
  58. re_common/baselibrary/utils/basedir.py +241 -241
  59. re_common/baselibrary/utils/baseencode.py +351 -351
  60. re_common/baselibrary/utils/baseencoding.py +28 -28
  61. re_common/baselibrary/utils/baseesdsl.py +86 -86
  62. re_common/baselibrary/utils/baseexcel.py +264 -264
  63. re_common/baselibrary/utils/baseexcept.py +109 -109
  64. re_common/baselibrary/utils/basefile.py +654 -654
  65. re_common/baselibrary/utils/baseftp.py +214 -214
  66. re_common/baselibrary/utils/basegzip.py +60 -60
  67. re_common/baselibrary/utils/basehdfs.py +135 -135
  68. re_common/baselibrary/utils/basehttpx.py +268 -268
  69. re_common/baselibrary/utils/baseip.py +87 -87
  70. re_common/baselibrary/utils/basejson.py +2 -2
  71. re_common/baselibrary/utils/baselist.py +32 -32
  72. re_common/baselibrary/utils/basemotor.py +190 -190
  73. re_common/baselibrary/utils/basemssql.py +98 -98
  74. re_common/baselibrary/utils/baseodbc.py +113 -113
  75. re_common/baselibrary/utils/basepandas.py +302 -302
  76. re_common/baselibrary/utils/basepeewee.py +11 -11
  77. re_common/baselibrary/utils/basepika.py +180 -180
  78. re_common/baselibrary/utils/basepydash.py +143 -143
  79. re_common/baselibrary/utils/basepymongo.py +230 -230
  80. re_common/baselibrary/utils/basequeue.py +22 -22
  81. re_common/baselibrary/utils/baserar.py +57 -57
  82. re_common/baselibrary/utils/baserequest.py +279 -279
  83. re_common/baselibrary/utils/baseset.py +8 -8
  84. re_common/baselibrary/utils/basesmb.py +403 -403
  85. re_common/baselibrary/utils/basestring.py +382 -382
  86. re_common/baselibrary/utils/basetime.py +320 -320
  87. re_common/baselibrary/utils/baseurl.py +121 -121
  88. re_common/baselibrary/utils/basezip.py +57 -57
  89. re_common/baselibrary/utils/core/__init__.py +7 -7
  90. re_common/baselibrary/utils/core/bottomutils.py +18 -18
  91. re_common/baselibrary/utils/core/mdeprecated.py +327 -327
  92. re_common/baselibrary/utils/core/mlamada.py +16 -16
  93. re_common/baselibrary/utils/core/msginfo.py +25 -25
  94. re_common/baselibrary/utils/core/requests_core.py +103 -103
  95. re_common/baselibrary/utils/fateadm.py +429 -429
  96. re_common/baselibrary/utils/importfun.py +123 -123
  97. re_common/baselibrary/utils/mfaker.py +57 -57
  98. re_common/baselibrary/utils/my_abc/__init__.py +3 -3
  99. re_common/baselibrary/utils/my_abc/better_abc.py +32 -32
  100. re_common/baselibrary/utils/mylogger.py +414 -414
  101. re_common/baselibrary/utils/myredisclient.py +861 -861
  102. re_common/baselibrary/utils/pipupgrade.py +21 -21
  103. re_common/baselibrary/utils/ringlist.py +85 -85
  104. re_common/baselibrary/utils/version_compare.py +36 -36
  105. re_common/baselibrary/utils/ydmhttp.py +126 -126
  106. re_common/facade/lazy_import.py +11 -11
  107. re_common/facade/loggerfacade.py +25 -25
  108. re_common/facade/mysqlfacade.py +467 -467
  109. re_common/facade/now.py +31 -31
  110. re_common/facade/sqlite3facade.py +257 -257
  111. re_common/facade/use/mq_use_facade.py +83 -83
  112. re_common/facade/use/proxy_use_facade.py +19 -19
  113. re_common/libtest/base_dict_test.py +19 -19
  114. re_common/libtest/baseavro_test.py +13 -13
  115. re_common/libtest/basefile_test.py +14 -14
  116. re_common/libtest/basemssql_test.py +77 -77
  117. re_common/libtest/baseodbc_test.py +7 -7
  118. re_common/libtest/basepandas_test.py +38 -38
  119. re_common/libtest/get_attr_test/get_attr_test_settings.py +14 -14
  120. re_common/libtest/get_attr_test/settings.py +54 -54
  121. re_common/libtest/idencode_test.py +53 -53
  122. re_common/libtest/iniconfig_test.py +35 -35
  123. re_common/libtest/ip_test.py +34 -34
  124. re_common/libtest/merge_file_test.py +20 -20
  125. re_common/libtest/mfaker_test.py +8 -8
  126. re_common/libtest/mm3_test.py +31 -31
  127. re_common/libtest/mylogger_test.py +88 -88
  128. re_common/libtest/myparsel_test.py +27 -27
  129. re_common/libtest/mysql_test.py +151 -151
  130. re_common/libtest/pymongo_test.py +21 -21
  131. re_common/libtest/split_test.py +11 -11
  132. re_common/libtest/sqlite3_merge_test.py +5 -5
  133. re_common/libtest/sqlite3_test.py +34 -34
  134. re_common/libtest/tomlconfig_test.py +30 -30
  135. re_common/libtest/use_tools_test/__init__.py +2 -2
  136. re_common/libtest/user/__init__.py +4 -4
  137. re_common/studio/__init__.py +4 -4
  138. re_common/studio/assignment_expressions.py +36 -36
  139. re_common/studio/mydash/test1.py +18 -18
  140. re_common/studio/pydashstudio/first.py +9 -9
  141. re_common/studio/streamlitstudio/first_app.py +65 -65
  142. re_common/studio/streamlitstudio/uber_pickups.py +23 -23
  143. re_common/studio/test.py +18 -18
  144. re_common/v2/baselibrary/business_utils/BusinessStringUtil.py +219 -219
  145. re_common/v2/baselibrary/business_utils/baseencodeid.py +100 -100
  146. re_common/v2/baselibrary/business_utils/full_doi_path.py +116 -116
  147. re_common/v2/baselibrary/business_utils/rel_tools.py +6 -6
  148. re_common/v2/baselibrary/decorators/utils.py +59 -59
  149. re_common/v2/baselibrary/helpers/search_packge/NearestNeighbors_test.py +105 -105
  150. re_common/v2/baselibrary/helpers/search_packge/fit_text_match.py +253 -253
  151. re_common/v2/baselibrary/helpers/search_packge/scikit_learn_text_matcher.py +260 -260
  152. re_common/v2/baselibrary/helpers/search_packge/test.py +1 -1
  153. re_common/v2/baselibrary/s3object/baseboto3.py +230 -230
  154. re_common/v2/baselibrary/tools/WeChatRobot.py +95 -95
  155. re_common/v2/baselibrary/tools/ac_ahocorasick.py +75 -75
  156. re_common/v2/baselibrary/tools/concurrency.py +35 -35
  157. re_common/v2/baselibrary/tools/data_processer/base.py +53 -53
  158. re_common/v2/baselibrary/tools/data_processer/data_processer.py +508 -508
  159. re_common/v2/baselibrary/tools/data_processer/data_reader.py +187 -187
  160. re_common/v2/baselibrary/tools/data_processer/data_writer.py +38 -38
  161. re_common/v2/baselibrary/tools/dict_tools.py +44 -44
  162. re_common/v2/baselibrary/tools/dolphinscheduler.py +187 -187
  163. re_common/v2/baselibrary/tools/hdfs_base_processor.py +204 -204
  164. re_common/v2/baselibrary/tools/hdfs_bulk_processor.py +67 -67
  165. re_common/v2/baselibrary/tools/hdfs_data_processer.py +338 -338
  166. re_common/v2/baselibrary/tools/hdfs_line_processor.py +74 -74
  167. re_common/v2/baselibrary/tools/list_tools.py +69 -69
  168. re_common/v2/baselibrary/tools/resume_tracker.py +94 -94
  169. re_common/v2/baselibrary/tools/search_hash_tools.py +54 -54
  170. re_common/v2/baselibrary/tools/text_matcher.py +326 -326
  171. re_common/v2/baselibrary/tools/unionfind_tools.py +60 -60
  172. re_common/v2/baselibrary/utils/BusinessStringUtil.py +196 -196
  173. re_common/v2/baselibrary/utils/api_net_utils.py +270 -270
  174. re_common/v2/baselibrary/utils/author_smi.py +361 -361
  175. re_common/v2/baselibrary/utils/base_string_similarity.py +158 -158
  176. re_common/v2/baselibrary/utils/basedict.py +37 -37
  177. re_common/v2/baselibrary/utils/basehdfs.py +163 -163
  178. re_common/v2/baselibrary/utils/basepika.py +180 -180
  179. re_common/v2/baselibrary/utils/basetime.py +77 -77
  180. re_common/v2/baselibrary/utils/db.py +156 -156
  181. re_common/v2/baselibrary/utils/elasticsearch.py +46 -0
  182. re_common/v2/baselibrary/utils/json_cls.py +16 -16
  183. re_common/v2/baselibrary/utils/mq.py +83 -83
  184. re_common/v2/baselibrary/utils/n_ary_expression_tree.py +243 -243
  185. re_common/v2/baselibrary/utils/string_bool.py +186 -186
  186. re_common/v2/baselibrary/utils/string_clear.py +246 -246
  187. re_common/v2/baselibrary/utils/string_smi.py +18 -18
  188. re_common/v2/baselibrary/utils/stringutils.py +271 -271
  189. re_common/vip/base_step_process.py +11 -11
  190. re_common/vip/baseencodeid.py +90 -90
  191. re_common/vip/changetaskname.py +28 -28
  192. re_common/vip/core_var.py +24 -24
  193. re_common/vip/mmh3Hash.py +89 -89
  194. re_common/vip/proxy/allproxys.py +127 -127
  195. re_common/vip/proxy/allproxys_thread.py +159 -159
  196. re_common/vip/proxy/cnki_proxy.py +153 -153
  197. re_common/vip/proxy/kuaidaili.py +87 -87
  198. re_common/vip/proxy/proxy_all.py +113 -113
  199. re_common/vip/proxy/update_kuaidaili_0.py +42 -42
  200. re_common/vip/proxy/wanfang_proxy.py +152 -152
  201. re_common/vip/proxy/wp_proxy_all.py +181 -181
  202. re_common/vip/read_rawid_to_txt.py +91 -91
  203. re_common/vip/title/__init__.py +5 -5
  204. re_common/vip/title/transform/TransformBookTitleToZt.py +125 -125
  205. re_common/vip/title/transform/TransformConferenceTitleToZt.py +139 -139
  206. re_common/vip/title/transform/TransformCstadTitleToZt.py +195 -195
  207. re_common/vip/title/transform/TransformJournalTitleToZt.py +203 -203
  208. re_common/vip/title/transform/TransformPatentTitleToZt.py +132 -132
  209. re_common/vip/title/transform/TransformRegulationTitleToZt.py +114 -114
  210. re_common/vip/title/transform/TransformStandardTitleToZt.py +135 -135
  211. re_common/vip/title/transform/TransformThesisTitleToZt.py +135 -135
  212. re_common/vip/title/transform/__init__.py +10 -10
  213. {re_common-10.0.39.dist-info → re_common-10.0.40.dist-info}/LICENSE +201 -201
  214. {re_common-10.0.39.dist-info → re_common-10.0.40.dist-info}/METADATA +24 -16
  215. re_common-10.0.40.dist-info/RECORD +249 -0
  216. {re_common-10.0.39.dist-info → re_common-10.0.40.dist-info}/WHEEL +1 -1
  217. re_common-10.0.39.dist-info/RECORD +0 -248
  218. {re_common-10.0.39.dist-info → re_common-10.0.40.dist-info}/top_level.txt +0 -0
@@ -1,861 +1,861 @@
1
- import sys
2
- import time
3
-
4
- import redis
5
- from redis.client import Redis
6
-
7
- from re_common.baselibrary import IniConfig
8
-
9
-
10
- class MyRedis(object):
11
- def __init__(self, configpath="", sesc="", encoding="utf-8", is_conn_or_pipe=True):
12
- self.configpath = configpath
13
- self.sesc = sesc
14
- self.encoding = encoding
15
- self.is_conn_or_pipe = is_conn_or_pipe
16
-
17
- def set_configpath(self, configpath):
18
- self.configpath = configpath
19
- return self
20
-
21
- def set_sesc(self, sesc):
22
- self.sesc = sesc
23
- return self
24
-
25
- def set_encoding(self, encoding):
26
- self.encoding = encoding
27
- return self
28
-
29
- def set_is_conn_or_pipe(self, is_conn_or_pipe):
30
- self.is_conn_or_pipe = is_conn_or_pipe
31
- return self
32
-
33
- def set_redis_from_config(self):
34
- """
35
- 设置 redis的配置信息
36
- :param sesc: 选择配置文件里的字典信息
37
- :param encoding: 编码
38
- :return:
39
- """
40
- assert self.configpath != "", 'configpath 为空,请调用set_configpath'
41
- dictsall = IniConfig(self.configpath).builder().get_config_dict()
42
- dicts = dictsall[self.sesc]
43
- self.RedisHost = dicts['RedisHost']
44
- self.RedisPort = dicts['RedisPort']
45
- self.RedisDB = dicts['RedisDB']
46
- self.RedisKey = dicts['RedisKey']
47
- if "RedisPassword" in dicts.keys():
48
- self.RedisPassword = dicts['RedisPassword']
49
- if self.RedisPassword == "":
50
- self.RedisPassword = None
51
- else:
52
- self.RedisPassword = None
53
- return self
54
-
55
- def conn_redis(self):
56
- """
57
- redis 提供两个类 Redis 和 StrictRedis, StrictRedis 用于实现大部分官方的命令,
58
- Redis 是 StrictRedis 的子类,用于向后兼用旧版本。
59
- redis 取出的结果默认是字节,我们可以设定 decode_responses=True 改成字符串。
60
- 链接 设置好的配置文件的redis
61
- :return: 返回一个 connect
62
- """
63
- assert self.RedisHost, 'RedisHost 不存在,请先调用set_redis_from_config'
64
- assert self.RedisPort, 'RedisPort 不存在,请先调用set_redis_from_config'
65
- assert self.RedisDB, 'RedisDB 不存在,请先调用set_redis_from_config'
66
- assert self.RedisKey, 'RedisKey 不存在,请先调用set_redis_from_config'
67
- self.rconn = redis.StrictRedis(host=self.RedisHost, port=self.RedisPort, db=self.RedisDB,
68
- password=self.RedisPassword, decode_responses=True)
69
- return self.rconn
70
-
71
- def get_pipeline(self):
72
- """
73
- 获取一个通道,便于批量删除和增加(节约时耗)
74
- redis默认在执行每次请求都会创建(连接池申请连接)和断开(归还连接池)一次连接操作,
75
- 如果想要在一次请求中指定多个命令,则可以使用pipline实现一次请求指定多个命令,
76
- 并且默认情况下一次pipline 是原子性操作。
77
- 管道(pipeline)是redis在提供单个请求中缓冲多条服务器命令的基类的子类。
78
- 它通过减少服务器-客户端之间反复的TCP数据库包,从而大大提高了执行批量命令的功能。
79
- :return: pipeline()
80
- """
81
- assert isinstance(self.rconn, Redis), Exception("请调用conn_redis获取")
82
- self.pipe = self.rconn.pipeline()
83
- return self.pipe
84
-
85
- def set_conn_or_pipe(self):
86
- if self.is_conn_or_pipe:
87
- assert self.rconn, 'rconn 不存在,请先调用 conn_redis'
88
- self.r = self.rconn
89
- else:
90
- assert self.pipe, 'pipe 不存在,请先调用 get_pipeline'
91
- self.r = self.pipe
92
- return self
93
-
94
- def builder(self):
95
- """
96
- 构建连接
97
- :param sesc:
98
- :param encoding:
99
- :param is_conn_or_pipe:
100
- :return:
101
- """
102
- self.set_redis_from_config()
103
- self.conn_redis()
104
- self.get_pipeline()
105
- self.set_conn_or_pipe()
106
- return self
107
-
108
- def get_conn_pool(self):
109
- """
110
- 获取redis连接池
111
- :return:
112
- """
113
- self.pool = redis.ConnectionPool(host=self.RedisHost, port=self.RedisPort,
114
- db=self.RedisDB, decode_responses=True)
115
- return self.pool
116
-
117
- def conn_redis_from_pool(self, pool):
118
- self.rconn = redis.StrictRedis(connection_pool=pool)
119
- return self.rconn
120
-
121
- def getDataFromRedis(self):
122
- """
123
- 获取 信息 获取全部数据
124
- :return: 一个可迭代的数据
125
- """
126
- assert self.RedisKey, 'RedisKey 不存在,请先调用set_redis_from_config'
127
- assert self.r, 'r 不存在,请先调用 set_conn_or_pipe'
128
- if self.r:
129
- rows = self.r.smembers(self.RedisKey)
130
- return rows
131
- else:
132
- print("redis出现连接错误")
133
- sys.exit(-1)
134
-
135
- def delete(self, RedisKey):
136
- """
137
- 删除一个RedisKey
138
- :param RedisKey: 需要删除的RedisKey
139
- :return:
140
- """
141
- assert self.r, 'r 不存在,请先调用 set_conn_or_pipe'
142
- self.r.delete(RedisKey)
143
-
144
- def set(self, name, value, ex=None, px=None, nx=False, xx=False, keepttl=False):
145
- """
146
- 写入 在 Redis 中设置值,默认,不存在则创建,存在则修改。
147
- :param name:
148
- :param value:
149
- :param ex: 过期时间(秒)
150
- :param px: 过期时间(毫秒)
151
- :param nx: 如果设置为True,则只有name不存在时,当前set操作才执行
152
- :param xx: 如果设置为True,则只有name存在时,当前set操作才执行
153
- :param keepttl:
154
- :return:
155
- """
156
- assert self.r, 'r 不存在,请先调用 set_conn_or_pipe'
157
- return self.r.set(name, value, ex=ex, px=px, nx=nx, xx=xx, keepttl=keepttl)
158
-
159
- def get(self, name):
160
- """
161
- 取出
162
- :param name:
163
- :return:
164
- """
165
- assert self.r, 'r 不存在,请先调用 set_conn_or_pipe'
166
- return self.r.get(name)
167
-
168
- def setnx(self, name, value):
169
- """
170
- 设置值,只有name不存在时,执行设置操作(添加)
171
- :param name:
172
- :param value:
173
- :return:
174
- """
175
- assert self.r, 'r 不存在,请先调用 set_conn_or_pipe'
176
- return self.r.setnx(name, value)
177
-
178
- def setex(self, name, time, value):
179
- """
180
- # time秒后,取值就从value变成None
181
- :param name:
182
- :param time: 过期时间(数字秒 或 timedelta对象)
183
- :param value:
184
- :return:
185
- """
186
- assert self.r, 'r 不存在,请先调用 set_conn_or_pipe'
187
- return self.r.setex(name, time, value)
188
-
189
- def psetex(self, name, time_ms, value):
190
- """
191
- # time_ms毫秒后,取值就从value变成None
192
- :param name:
193
- :param time_ms: 过期时间(数字毫秒 或 timedelta对象)
194
- :param value:
195
- :return:
196
- """
197
- assert self.r, 'r 不存在,请先调用 set_conn_or_pipe'
198
- return self.r.psetex(name, time_ms, value)
199
-
200
- def mset(self, mapping):
201
- """
202
- 批量设置值
203
- :param args:
204
- :param kwargs:
205
- :return:
206
- """
207
- assert self.r, 'r 不存在,请先调用 set_conn_or_pipe'
208
- return self.r.mset(mapping=mapping)
209
-
210
- def mget(self, keys, *args):
211
- """
212
- 批量获取
213
-
214
- :param keys: ['k1', 'k2'] or "fruit", "fruit1", "fruit2", "k1", "k2"
215
- :param args:
216
- :return:
217
- """
218
- assert self.r, 'r 不存在,请先调用 set_conn_or_pipe'
219
- return self.r.mget(keys, *args)
220
-
221
- def getset(self, name, value):
222
- """
223
- 设置新值并获取原来的值
224
- 设置的新值是value 设置前的值是原来的value
225
- :param name:
226
- :param value:
227
- :return:
228
- """
229
- assert self.r, 'r 不存在,请先调用 set_conn_or_pipe'
230
- return self.r.getset(name, value)
231
-
232
- def getrange(self, key, start, end):
233
- """
234
- 获取子序列(根据字节获取,非字符)
235
- r.set("cn_name", "君惜大大") # 汉字
236
- getrange("cn_name", 0, 2) # 取索引号是0-2 前3位的字节 君 切片操作 (一个汉字3个字节 1个字母一个字节 每个字节8bit)
237
- getrange("cn_name", 0, -1) # 取所有的字节 君惜大大 切片操作
238
- r.set("en_name","junxi") # 字母
239
- getrange("en_name", 0, 2) # 取索引号是0-2 前3位的字节 jun 切片操作 (一个汉字3个字节 1个字母一个字节 每个字节8bit)
240
- getrange("en_name", 0, -1) # 取所有的字节 junxi 切片操作
241
- :param key: Redis 的 name
242
- :param start: 起始位置(字节)
243
- :param end: 结束位置(字节)
244
- :return:
245
- """
246
- assert self.r, 'r 不存在,请先调用 set_conn_or_pipe'
247
- return self.r.getrange(key, start, end)
248
-
249
- def setrange(self, name, offset, value):
250
- """
251
- 修改字符串内容,从指定字符串索引开始向后替换(新值太长时,则向后添加)
252
- r.setrange("en_name", 1, "ccc")
253
- # jccci 原始值是junxi 从索引号是1开始替换成ccc 变成 jccci
254
- :param name:
255
- :param offset: 字符串的索引,字节(一个汉字三个字节)
256
- :param value: 要设置的值
257
- :return:
258
- """
259
- assert self.r, 'r 不存在,请先调用 set_conn_or_pipe'
260
- return self.r.setrange(name, offset, value)
261
-
262
- def setbit(self, name, offset, value):
263
- """
264
- 注:如果在Redis中有一个对应: n1 = "foo",
265
-
266
- 那么字符串foo的二进制表示为:01100110 01101111 01101111
267
-
268
- 所以,如果执行 setbit('n1', 7, 1),则就会将第7位设置为1,
269
-
270
- 那么最终二进制则变成 01100111 01101111 01101111,即:"goo"
271
-
272
- source = "foo"
273
- for i in source:
274
- num = ord(i)
275
-
276
- 特别的,如果source是汉字 "陈思维"怎么办?
277
- 对于utf-8,每一个汉字占 3 个字节,那么 "陈思维" 则有 9个字节 对于汉字,for循环时候会按照 字节 迭代,那么在迭代时,将每一个字节转换 十进制数,然后再将十进制数转换成二进制
278
- :param name: redis的name
279
- :param offset: 位的索引(将值变换成二进制后再进行索引)
280
- :param value: 值只能是 1 或 0
281
- :return:
282
- """
283
- assert self.r, 'r 不存在,请先调用 set_conn_or_pipe'
284
- return self.r.setbit(name, offset, value)
285
-
286
- def getbit(self, name, offset):
287
- """
288
- 获取bit
289
- :param name:
290
- :param offset:
291
- :return:
292
- """
293
- assert self.r, 'r 不存在,请先调用 set_conn_or_pipe'
294
- return self.r.getbit(name, offset)
295
-
296
- def bitcount(self, key, start=None, end=None):
297
- """
298
- 获取name对应的值的二进制表示中 1 的个数
299
- :param key: Redis的name
300
- :param start: 字节起始位置
301
- :param end: 字节结束位置
302
- :return:
303
- """
304
- assert self.r, 'r 不存在,请先调用 set_conn_or_pipe'
305
- return self.r.bitcount(key, start, end)
306
-
307
- def bitop(self, operation, dest, *keys):
308
- """
309
- 获取多个值,并将值做位运算,将最后的结果保存至新的name对应的值
310
- 获取Redis中n1,n2,n3对应的值,然后讲所有的值做位运算(求并集),然后将结果保存 new_name 对应的值中
311
- :param operation: AND(并) 、 OR(或) 、 NOT(非) 、 XOR(异或)
312
- :param dest: 新的Redis的name
313
- :param keys: 要查找的Redis的name
314
- :return:
315
- """
316
- assert self.r, 'r 不存在,请先调用 set_conn_or_pipe'
317
- return self.r.bitop(operation, dest, *keys)
318
-
319
- def strlen(self, name):
320
- """
321
- 返回name对应值的字节长度(一个汉字3个字节)
322
- :param name:
323
- :return:
324
- """
325
- assert self.r, 'r 不存在,请先调用 set_conn_or_pipe'
326
- return self.r.strlen(name)
327
-
328
- def incr(self, name, amount=1):
329
- """
330
- 自增 name 对应的值,当 name 不存在时,则创建 name=amount,否则,则自增。
331
- :param name: Redis的name
332
- :param amount: 自增数(必须是整数)
333
- :return:
334
- """
335
- assert self.r, 'r 不存在,请先调用 set_conn_or_pipe'
336
- return self.r.incr(name, amount)
337
-
338
- def incrbyfloat(self, name, amount=1.0):
339
- """
340
- 自增 name对应的值,当name不存在时,则创建name=amount,否则,则自增。
341
- :param name: Redis的name
342
- :param amount: 自增数(浮点型)
343
- :return:
344
- """
345
- assert self.r, 'r 不存在,请先调用 set_conn_or_pipe'
346
- return self.r.incrbyfloat(name, amount)
347
-
348
- def decr(self, name, amount=1):
349
- """
350
- 自减 name 对应的值,当 name 不存在时,则创建 name=amount,否则,则自减。
351
- :param name: Redis的name
352
- :param amount: 自减数(整数)
353
- :return:
354
- """
355
- assert self.r, 'r 不存在,请先调用 set_conn_or_pipe'
356
- return self.r.decr(name, amount)
357
-
358
- def append(self, key, value):
359
- """
360
- 在redis name对应的值后面追加内容
361
- :param key: redis的name
362
- :param value: 要追加的字符串
363
- :return:
364
- """
365
- assert self.r, 'r 不存在,请先调用 set_conn_or_pipe'
366
- return self.r.append(key, value)
367
-
368
- ################redis 基本命令 hash#########
369
-
370
- def hset(self, name, key, value):
371
- """
372
- name对应的hash中设置一个键值对(不存在,则创建;否则,修改)
373
-
374
- :param name: redis的name
375
- :param key: name对应的hash中的key
376
- :param value: name对应的hash中的value
377
- :return:
378
- """
379
- assert self.r, 'r 不存在,请先调用 set_conn_or_pipe'
380
- return self.r.hset(name, key, value)
381
-
382
- def hsetnx(self, name, key, value):
383
- """
384
- hsetnx(name, key, value) 当name对应的hash中不存在当前key时则创建(相当于添加)
385
- hsetnx # 只能新建
386
- :param name:
387
- :param key:
388
- :param value:
389
- :return:
390
- """
391
- assert self.r, 'r 不存在,请先调用 set_conn_or_pipe'
392
- return self.r.hsetnx(name, key, value)
393
-
394
- def hget(self, name, key):
395
- """
396
- 单个取hash的key对应的值
397
- :param name:
398
- :param key:
399
- :return:
400
- """
401
- assert self.r, 'r 不存在,请先调用 set_conn_or_pipe'
402
- return self.r.hget(name, key)
403
-
404
- def hmset(self, name, mapping):
405
- """
406
- 在name对应的hash中批量设置键值对
407
- :param name: redis的name
408
- :param mapping: 字典,如:{'k1':'v1', 'k2': 'v2'}
409
- :return:
410
- """
411
- assert self.r, 'r 不存在,请先调用 set_conn_or_pipe'
412
- return self.r.hmset(name, mapping)
413
-
414
- def hmget(self, name, keys, *args):
415
- """
416
- 在name对应的hash中获取多个key的值
417
- :param name: reids对应的name
418
- :param keys: 要获取key集合,如:['k1', 'k2', 'k3']
419
- :param args: 要获取的key,如:k1,k2,k3
420
- :return:
421
- """
422
- assert self.r, 'r 不存在,请先调用 set_conn_or_pipe'
423
- return self.r.hmget(name, keys, *args)
424
-
425
- def hgetall(self, name):
426
- """
427
- 获取name对应hash的所有键值
428
- :param name:
429
- :return:
430
- """
431
- assert self.r, 'r 不存在,请先调用 set_conn_or_pipe'
432
- return self.r.hgetall(name)
433
-
434
- def hlen(self, name):
435
- """
436
- 获取name对应的hash中键值对的个数
437
- :param name:
438
- :return:
439
- """
440
- assert self.r, 'r 不存在,请先调用 set_conn_or_pipe'
441
- return self.r.hlen(name)
442
-
443
- def hkeys(self, name):
444
- """
445
- 得到所有的keys(类似字典的取所有keys)
446
- :param name:
447
- :return:
448
- """
449
- assert self.r, 'r 不存在,请先调用 set_conn_or_pipe'
450
- return self.r.hkeys(name)
451
-
452
- def hvals(self, name):
453
- """
454
- 得到所有的value(类似字典的取所有value)
455
- :param name:
456
- :return:
457
- """
458
- assert self.r, 'r 不存在,请先调用 set_conn_or_pipe'
459
- return self.r.hvals(name)
460
-
461
- def hexists(self, name, key):
462
- """
463
- 判断成员是否存在(类似字典的in)
464
- 检查 name 对应的 hash 是否存在当前传入的 key
465
- :param name:
466
- :param key:
467
- :return:
468
- """
469
- assert self.r, 'r 不存在,请先调用 set_conn_or_pipe'
470
- return self.r.hexists(name, key)
471
-
472
- def hdel(self, name, *keys):
473
- """
474
- 删除键值对
475
- :return:
476
- """
477
- assert self.r, 'r 不存在,请先调用 set_conn_or_pipe'
478
- return self.r.hdel(name, *keys)
479
-
480
- def hincrby(self, name, key, amount=1):
481
- """
482
- 自增name对应的hash中的指定key的值,
483
- 不存在则创建key=amount
484
- 自增自减整数(将key对应的value--整数
485
- 自增1或者2,或者别的整数 负数就是自减)
486
- :param name: redis中的name
487
- :param key: hash对应的key
488
- :param amount: 自增数(整数)
489
- :return:
490
- """
491
- assert self.r, 'r 不存在,请先调用 set_conn_or_pipe'
492
- return self.r.hincrby(name, key, amount)
493
-
494
- def hincrbyfloat(self, name, key, amount=1.0):
495
- """
496
- 自增name对应的hash中的指定key的值,不存在则创建key=amount
497
- 自增自减浮点数(将key对应的value--浮点数 自增1.0或者2.0,
498
- 或者别的浮点数 负数就是自减)
499
- :param name: redis中的name
500
- :param key: hash对应的key
501
- :param amount: amount,自增数(浮点数)
502
- :return:
503
- """
504
- assert self.r, 'r 不存在,请先调用 set_conn_or_pipe'
505
- return self.r.hincrbyfloat(name, key, amount)
506
-
507
- def hscan(self, name, cursor=0, match=None, count=None):
508
- """
509
- 增量式迭代获取,对于数据大的数据非常有用,hscan可以实现分片的获取数据,并非一次性将数据全部获取完,从而放置内存被撑爆
510
- 如:
511
- 第一次:cursor1, data1 = r.hscan('xx', cursor=0, match=None, count=None)
512
- 第二次:cursor2, data1 = r.hscan('xx', cursor=cursor1, match=None, count=None)
513
- 直到返回值cursor的值为0时,表示数据已经通过分片获取完毕
514
- :param name: redis的name
515
- :param cursor: 游标(基于游标分批取获取数据)
516
- :param match: 匹配指定key,默认None 表示所有的key
517
- :param count: 每次分片最少获取个数,默认None表示采用Redis的默认分片个数
518
- :return:
519
- """
520
- assert self.r, 'r 不存在,请先调用 set_conn_or_pipe'
521
- return self.r.hscan(name, cursor, match, count)
522
-
523
- def hscan_iter(self, name, match=None, count=None):
524
- """
525
- 利用yield封装hscan创建生成器,实现分批去redis中获取数据
526
-
527
- :param name:
528
- :param match: 匹配指定key,默认None 表示所有的key
529
- :param count: 每次分片最少获取个数,默认None表示采用Redis的默认分片个数
530
- :return: # 生成器内存地址 for循环进行迭代
531
- """
532
- assert self.r, 'r 不存在,请先调用 set_conn_or_pipe'
533
- return self.r.hscan_iter(name, match, count)
534
-
535
- ####################redis基本命令 list #######
536
-
537
- def push(self, name, *args):
538
- """
539
- 增加(类似于list的append,只是这里是从左边新增加)--没有就新建
540
- r.lpush("list1", 11, 22, 33)
541
- 保存顺序为: 33,22,11
542
- :param name:
543
- :param values:
544
- :return:
545
- """
546
- assert self.r, 'r 不存在,请先调用 set_conn_or_pipe'
547
- return self.r.lpush(name, *args)
548
-
549
- def rpush(self, name, *args):
550
- """
551
- 增加(从右边增加)--没有就新建
552
- r.rpush("list2", 44, 55, 66)
553
- # 在列表的右边,依次添加44,55,66
554
- :param name:
555
- :param args:
556
- :return:
557
- """
558
- assert self.r, 'r 不存在,请先调用 set_conn_or_pipe'
559
- return self.r.rpush(name, *args)
560
-
561
- def lpushx(self, name, value):
562
- """
563
- 往已经有的name的列表的左边添加元素,没有的话无法创建
564
- :param name:
565
- :param value:
566
- :return:
567
- """
568
- assert self.r, 'r 不存在,请先调用 set_conn_or_pipe'
569
- return self.r.lpushx(name, value)
570
-
571
- def rpushx(self, name, value):
572
- """
573
- 往已经有的name的列表的右边添加元素,没有的话无法创建
574
- :param name:
575
- :param value:
576
- :return:
577
- """
578
- assert self.r, 'r 不存在,请先调用 set_conn_or_pipe'
579
- return self.r.rpushx(name, value)
580
-
581
- def linsert(self, name, where, refvalue, value):
582
- """
583
- r.linsert("list2", "before", "11", "00")
584
- # 往列表中左边第一个出现的元素"11"前插入元素"00"
585
- :param name:
586
- :param where: BEFORE或AFTER
587
- :param refvalue: 标杆值,即:在它前后插入数据
588
- :param value: 要插入的数据
589
- :return:
590
- """
591
- assert self.r, 'r 不存在,请先调用 set_conn_or_pipe'
592
- return self.r.linsert(name, where, refvalue, value)
593
-
594
- def lset(self, name, index, value):
595
- """
596
- 对name对应的list中的某一个索引位置重新赋值
597
- r.lset("list2", 0, -11) # 把索引号是0的元素修改成-11
598
- :param name:
599
- :param index: list的索引位置
600
- :param value: 要设置的值
601
- :return:
602
- """
603
- assert self.r, 'r 不存在,请先调用 set_conn_or_pipe'
604
- return self.r.lset(name, index, value)
605
-
606
- def lrem(self, name, count, value):
607
- """
608
- 在name对应的list中删除指定的值
609
- :param name:
610
- :param value: 要删除的值
611
- :param count: num=0,删除列表中所有的指定值
612
- count=2 - 从前到后,删除2个, num=1,从前到后,删除左边第1个
613
- count=-2 - 从后向前,删除2个
614
- :return:
615
- """
616
- assert self.r, 'r 不存在,请先调用 set_conn_or_pipe'
617
- return self.r.lrem(name, count, value)
618
-
619
- def lpop(self, name):
620
- """
621
- 在name对应的列表的左侧获取第一个元素并在列表中移除,返回值则是第一个元素
622
- :param name:
623
- :return:
624
- """
625
- assert self.r, 'r 不存在,请先调用 set_conn_or_pipe'
626
- return self.r.lpop(name)
627
-
628
- def rpop(self, name):
629
- """
630
- 在name对应的列表的右侧获取第一个元素并在列表中移除,返回值则是第一个元素
631
- rpop(name) 表示从右向左操作
632
- 非阻塞版,如果没有数据,name将不存在
633
- :param name:
634
- :return: 存在返回值,不存在返回None,不会阻塞
635
- """
636
- assert self.r, 'r 不存在,请先调用 set_conn_or_pipe'
637
- return self.r.rpop(name)
638
-
639
- def ltrim(self, name, start, end):
640
- """
641
- 删除索引之外的值
642
- r.ltrim("list2", 0, 2) # 删除索引号是0-2之外的元素,
643
- 值保留索引号是0-2的元素
644
- :param name:
645
- :param start: 索引的起始位置
646
- :param end: 索引的起始位置
647
- :return:
648
- """
649
- assert self.r, 'r 不存在,请先调用 set_conn_or_pipe'
650
- return self.r.ltrim(name, start, end)
651
-
652
- def srem(self, name, *values):
653
- """
654
- 删除指定的值, 可用元组传入
655
- r.srem("list1", "aaaa", "bbbb") # 对key为list1的删除aaaa, bbbb
656
- r.srem("list1", *tuple(["aaaa", "bbbb"]))
657
- :param name:
658
- :return:
659
- """
660
- assert self.r, 'r 不存在,请先调用 set_conn_or_pipe'
661
- return self.r.srem(name, *values)
662
-
663
- def lindex(self, name, index):
664
- """
665
- 取值(根据索引号取值)
666
- r.lindex("list2", 0) # 取出索引号是0的值
667
- :param name:
668
- :param index:
669
- :return:
670
- """
671
- assert self.r, 'r 不存在,请先调用 set_conn_or_pipe'
672
- return self.r.lindex(name, index)
673
-
674
- def rpoplpush(self, src, dst):
675
- """
676
- 移动 元素从一个列表移动到另外一个列表
677
- 从一个列表取出最右边的元素,同时将其添加至另一个列表的最左边
678
- :param src: 要取数据的列表的 name
679
- :param dst: 要添加数据的列表的 name
680
- :return:
681
- """
682
- assert self.r, 'r 不存在,请先调用 set_conn_or_pipe'
683
- return self.r.rpoplpush(src, dst)
684
-
685
- def brpop(self, keys, timeout=0):
686
- """
687
- 移出并获取列表的最后一个元素, 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。
688
-
689
- Redis Rpop 命令用于移除列表的最后一个元素,返回值为移除的元素。brpop是rpop的阻塞版本。Redis Brpop
690
- 命令移出并获取列表的最后一个元素,如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。
691
-
692
- 如果timeout为0,则无限期阻塞。
693
- 如果超时返回None
694
- :return:
695
- """
696
- assert self.r, 'r 不存在,请先调用 set_conn_or_pipe'
697
- return self.r.brpop(keys, timeout=timeout)
698
-
699
- def brpoplpush(self, src, dst, timeout=0):
700
- """
701
- 移动 元素从一个列表移动到另外一个列表 可以设置超时
702
- :param src: 取出并要移除元素的列表对应的name
703
- :param dst: 要插入元素的列表对应的name
704
- :param timeout: 当src对应的列表中没有数据时,阻塞等待其有数据的超时时间(秒),0 表示永远阻塞
705
- :return:
706
- """
707
- assert self.r, 'r 不存在,请先调用 set_conn_or_pipe'
708
- return self.r.brpoplpush(src, dst, timeout)
709
-
710
- def blpop(self, keys, timeout=0):
711
- """
712
- 将多个列表排列,按照从左到右去pop对应列表的元素
713
- r.blpop(["list10", "list11"], timeout=2)
714
- :param keys: redis的name的集合
715
- :param timeout: 超时时间,当元素所有列表的元素获取完之后,阻塞等待列表内有数据的时间(秒), 0 表示永远阻塞
716
- :return:
717
- """
718
- assert self.r, 'r 不存在,请先调用 set_conn_or_pipe'
719
- return self.r.blpop(keys, timeout)
720
-
721
- def list_iter(self, name):
722
- """
723
- 由于redis类库中没有提供对列表元素的增量迭代,如果想要循环name对应的列表的所有元素,那么就需要获取name对应的所有列表。
724
-
725
- 循环列表
726
-
727
- 但是,如果列表非常大,那么就有可能在第一步时就将程序的内容撑爆,所有有必要自定义一个增量迭代的功能:
728
- 自定义redis列表增量迭代
729
- # 使用
730
- for item in list_iter('list2'): # 遍历这个列表
731
- print(item)
732
- :param name: redis中的name,即:迭代name对应的列表
733
- :return: yield 返回 列表元素
734
- """
735
- assert self.r, 'r 不存在,请先调用 set_conn_or_pipe'
736
- list_count = self.r.llen(name)
737
- for index in range(list_count):
738
- yield self.r.lindex(name, index)
739
-
740
- ################redis基本命令 set#############
741
-
742
- def sadd(self, name, *values):
743
- """
744
- 增加 一个 set集合
745
- :param name: 需要增加的rediskey
746
- :param ProxyPoolValid: 传入集合
747
- :return:
748
- """
749
- assert self.r, 'r 不存在,请先调用 set_conn_or_pipe'
750
- return self.r.sadd(name, *values)
751
-
752
- def scard(self, name):
753
- """
754
- 获取name对应的集合中元素个数
755
- :param name:
756
- :return:
757
- """
758
- assert self.r, 'r 不存在,请先调用 set_conn_or_pipe'
759
- return self.r.scard(name)
760
-
761
- def smembers(self, name):
762
- """
763
- 获取集合中所有的成员
764
- :param name:
765
- :return:
766
- """
767
- assert self.r, 'r 不存在,请先调用 set_conn_or_pipe'
768
- return self.r.smembers(name)
769
-
770
- def srandmember(self, name, number=None):
771
- """
772
- 获取集合中随机成员
773
- :param name:
774
- :return:
775
- """
776
- assert self.r, 'r 不存在,请先调用 set_conn_or_pipe'
777
- return self.r.srandmember(name, number=number)
778
-
779
- def sscan(self, name, cursor=0, match=None, count=None):
780
- """
781
- 获取集合中所有的成员--元组形式
782
- :param name:
783
- :return:
784
- """
785
- assert self.r, 'r 不存在,请先调用 set_conn_or_pipe'
786
- return self.r.sscan(name, cursor, match, count)
787
-
788
- def sscan_iter(self, name, match=None, count=None):
789
- """
790
- 获取集合中所有的成员--迭代器的方式
791
- 同字符串的操作,用于增量迭代分批获取元素,避免内存消耗太大
792
- :param name:
793
- :param match:
794
- :param count:
795
- :return:
796
- """
797
- assert self.r, 'r 不存在,请先调用 set_conn_or_pipe'
798
- return self.r.sscan_iter(name, match, count)
799
-
800
- def sdiff(self, keys, *args):
801
- """
802
- 差集
803
- r.sdiff("set1", "set2") # 在集合set1但是不在集合set2中
804
- r.sdiff("set2", "set1") # 在集合set2但是不在集合set1中
805
- :param keys:
806
- :param args:
807
- :return:
808
- """
809
- assert self.r, 'r 不存在,请先调用 set_conn_or_pipe'
810
- return self.r.sdiff(keys, *args)
811
-
812
- def sdiffstore(self, dest, keys, *args):
813
- """
814
- 差集--差集存在一个新的集合中
815
- 获取第一个name对应的集合中且不在其他name对应的集合,再将其新加入到dest对应的集合中
816
- r.sdiffstore("set3", "set1", "set2") # 在集合set1但是不在集合set2中
817
- :param dest:
818
- :param keys:
819
- :param args:
820
- :return:
821
- """
822
- assert self.r, 'r 不存在,请先调用 set_conn_or_pipe'
823
- return self.r.sdiffstore(dest, keys, *args)
824
-
825
-
826
- def RedisConnect(configpath, sesc="proxy"):
827
- """
828
- 连接数据库 通过读取配置文件连接,如果读取配置文件 失败 返回None
829
- :return:
830
- """
831
- dictsall = IniConfig(configpath).builder().get_config_dict()
832
- dicts = dictsall[sesc]
833
- RedisHost = dicts['RedisHost']
834
- RedisPort = dicts['RedisPort']
835
- RedisDB = dicts['RedisDB']
836
- RedisKey = dicts['RedisKey']
837
- try:
838
- rconn = redis.StrictRedis(host=RedisHost, port=RedisPort, db=RedisDB, decode_responses=True)
839
- except:
840
- # 有可能因为网络波动无法连接 这里休眠10秒重连一次 如果还是失败就放弃
841
- time.sleep(10)
842
- rconn = redis.StrictRedis(host=RedisHost, port=RedisPort, db=RedisDB, decode_responses=True)
843
- if rconn:
844
- return rconn, RedisKey
845
- return None
846
-
847
-
848
- def getDataFromRedis(configpath, sesc="proxy"):
849
- """
850
- 取出数据
851
- :param configpath:
852
- :param sesc:
853
- :return:
854
- """
855
- rconn, RedisKey = RedisConnect(configpath, sesc=sesc)
856
- if rconn:
857
- rows = rconn.smembers(RedisKey)
858
- return rows
859
- else:
860
- print("redis出现连接错误")
861
- sys.exit(-1)
1
+ import sys
2
+ import time
3
+
4
+ import redis
5
+ from redis.client import Redis
6
+
7
+ from re_common.baselibrary import IniConfig
8
+
9
+
10
+ class MyRedis(object):
11
+ def __init__(self, configpath="", sesc="", encoding="utf-8", is_conn_or_pipe=True):
12
+ self.configpath = configpath
13
+ self.sesc = sesc
14
+ self.encoding = encoding
15
+ self.is_conn_or_pipe = is_conn_or_pipe
16
+
17
+ def set_configpath(self, configpath):
18
+ self.configpath = configpath
19
+ return self
20
+
21
+ def set_sesc(self, sesc):
22
+ self.sesc = sesc
23
+ return self
24
+
25
+ def set_encoding(self, encoding):
26
+ self.encoding = encoding
27
+ return self
28
+
29
+ def set_is_conn_or_pipe(self, is_conn_or_pipe):
30
+ self.is_conn_or_pipe = is_conn_or_pipe
31
+ return self
32
+
33
+ def set_redis_from_config(self):
34
+ """
35
+ 设置 redis的配置信息
36
+ :param sesc: 选择配置文件里的字典信息
37
+ :param encoding: 编码
38
+ :return:
39
+ """
40
+ assert self.configpath != "", 'configpath 为空,请调用set_configpath'
41
+ dictsall = IniConfig(self.configpath).builder().get_config_dict()
42
+ dicts = dictsall[self.sesc]
43
+ self.RedisHost = dicts['RedisHost']
44
+ self.RedisPort = dicts['RedisPort']
45
+ self.RedisDB = dicts['RedisDB']
46
+ self.RedisKey = dicts['RedisKey']
47
+ if "RedisPassword" in dicts.keys():
48
+ self.RedisPassword = dicts['RedisPassword']
49
+ if self.RedisPassword == "":
50
+ self.RedisPassword = None
51
+ else:
52
+ self.RedisPassword = None
53
+ return self
54
+
55
+ def conn_redis(self):
56
+ """
57
+ redis 提供两个类 Redis 和 StrictRedis, StrictRedis 用于实现大部分官方的命令,
58
+ Redis 是 StrictRedis 的子类,用于向后兼用旧版本。
59
+ redis 取出的结果默认是字节,我们可以设定 decode_responses=True 改成字符串。
60
+ 链接 设置好的配置文件的redis
61
+ :return: 返回一个 connect
62
+ """
63
+ assert self.RedisHost, 'RedisHost 不存在,请先调用set_redis_from_config'
64
+ assert self.RedisPort, 'RedisPort 不存在,请先调用set_redis_from_config'
65
+ assert self.RedisDB, 'RedisDB 不存在,请先调用set_redis_from_config'
66
+ assert self.RedisKey, 'RedisKey 不存在,请先调用set_redis_from_config'
67
+ self.rconn = redis.StrictRedis(host=self.RedisHost, port=self.RedisPort, db=self.RedisDB,
68
+ password=self.RedisPassword, decode_responses=True)
69
+ return self.rconn
70
+
71
+ def get_pipeline(self):
72
+ """
73
+ 获取一个通道,便于批量删除和增加(节约时耗)
74
+ redis默认在执行每次请求都会创建(连接池申请连接)和断开(归还连接池)一次连接操作,
75
+ 如果想要在一次请求中指定多个命令,则可以使用pipline实现一次请求指定多个命令,
76
+ 并且默认情况下一次pipline 是原子性操作。
77
+ 管道(pipeline)是redis在提供单个请求中缓冲多条服务器命令的基类的子类。
78
+ 它通过减少服务器-客户端之间反复的TCP数据库包,从而大大提高了执行批量命令的功能。
79
+ :return: pipeline()
80
+ """
81
+ assert isinstance(self.rconn, Redis), Exception("请调用conn_redis获取")
82
+ self.pipe = self.rconn.pipeline()
83
+ return self.pipe
84
+
85
+ def set_conn_or_pipe(self):
86
+ if self.is_conn_or_pipe:
87
+ assert self.rconn, 'rconn 不存在,请先调用 conn_redis'
88
+ self.r = self.rconn
89
+ else:
90
+ assert self.pipe, 'pipe 不存在,请先调用 get_pipeline'
91
+ self.r = self.pipe
92
+ return self
93
+
94
+ def builder(self):
95
+ """
96
+ 构建连接
97
+ :param sesc:
98
+ :param encoding:
99
+ :param is_conn_or_pipe:
100
+ :return:
101
+ """
102
+ self.set_redis_from_config()
103
+ self.conn_redis()
104
+ self.get_pipeline()
105
+ self.set_conn_or_pipe()
106
+ return self
107
+
108
+ def get_conn_pool(self):
109
+ """
110
+ 获取redis连接池
111
+ :return:
112
+ """
113
+ self.pool = redis.ConnectionPool(host=self.RedisHost, port=self.RedisPort,
114
+ db=self.RedisDB, decode_responses=True)
115
+ return self.pool
116
+
117
+ def conn_redis_from_pool(self, pool):
118
+ self.rconn = redis.StrictRedis(connection_pool=pool)
119
+ return self.rconn
120
+
121
+ def getDataFromRedis(self):
122
+ """
123
+ 获取 信息 获取全部数据
124
+ :return: 一个可迭代的数据
125
+ """
126
+ assert self.RedisKey, 'RedisKey 不存在,请先调用set_redis_from_config'
127
+ assert self.r, 'r 不存在,请先调用 set_conn_or_pipe'
128
+ if self.r:
129
+ rows = self.r.smembers(self.RedisKey)
130
+ return rows
131
+ else:
132
+ print("redis出现连接错误")
133
+ sys.exit(-1)
134
+
135
+ def delete(self, RedisKey):
136
+ """
137
+ 删除一个RedisKey
138
+ :param RedisKey: 需要删除的RedisKey
139
+ :return:
140
+ """
141
+ assert self.r, 'r 不存在,请先调用 set_conn_or_pipe'
142
+ self.r.delete(RedisKey)
143
+
144
+ def set(self, name, value, ex=None, px=None, nx=False, xx=False, keepttl=False):
145
+ """
146
+ 写入 在 Redis 中设置值,默认,不存在则创建,存在则修改。
147
+ :param name:
148
+ :param value:
149
+ :param ex: 过期时间(秒)
150
+ :param px: 过期时间(毫秒)
151
+ :param nx: 如果设置为True,则只有name不存在时,当前set操作才执行
152
+ :param xx: 如果设置为True,则只有name存在时,当前set操作才执行
153
+ :param keepttl:
154
+ :return:
155
+ """
156
+ assert self.r, 'r 不存在,请先调用 set_conn_or_pipe'
157
+ return self.r.set(name, value, ex=ex, px=px, nx=nx, xx=xx, keepttl=keepttl)
158
+
159
+ def get(self, name):
160
+ """
161
+ 取出
162
+ :param name:
163
+ :return:
164
+ """
165
+ assert self.r, 'r 不存在,请先调用 set_conn_or_pipe'
166
+ return self.r.get(name)
167
+
168
+ def setnx(self, name, value):
169
+ """
170
+ 设置值,只有name不存在时,执行设置操作(添加)
171
+ :param name:
172
+ :param value:
173
+ :return:
174
+ """
175
+ assert self.r, 'r 不存在,请先调用 set_conn_or_pipe'
176
+ return self.r.setnx(name, value)
177
+
178
+ def setex(self, name, time, value):
179
+ """
180
+ # time秒后,取值就从value变成None
181
+ :param name:
182
+ :param time: 过期时间(数字秒 或 timedelta对象)
183
+ :param value:
184
+ :return:
185
+ """
186
+ assert self.r, 'r 不存在,请先调用 set_conn_or_pipe'
187
+ return self.r.setex(name, time, value)
188
+
189
+ def psetex(self, name, time_ms, value):
190
+ """
191
+ # time_ms毫秒后,取值就从value变成None
192
+ :param name:
193
+ :param time_ms: 过期时间(数字毫秒 或 timedelta对象)
194
+ :param value:
195
+ :return:
196
+ """
197
+ assert self.r, 'r 不存在,请先调用 set_conn_or_pipe'
198
+ return self.r.psetex(name, time_ms, value)
199
+
200
+ def mset(self, mapping):
201
+ """
202
+ 批量设置值
203
+ :param args:
204
+ :param kwargs:
205
+ :return:
206
+ """
207
+ assert self.r, 'r 不存在,请先调用 set_conn_or_pipe'
208
+ return self.r.mset(mapping=mapping)
209
+
210
+ def mget(self, keys, *args):
211
+ """
212
+ 批量获取
213
+
214
+ :param keys: ['k1', 'k2'] or "fruit", "fruit1", "fruit2", "k1", "k2"
215
+ :param args:
216
+ :return:
217
+ """
218
+ assert self.r, 'r 不存在,请先调用 set_conn_or_pipe'
219
+ return self.r.mget(keys, *args)
220
+
221
+ def getset(self, name, value):
222
+ """
223
+ 设置新值并获取原来的值
224
+ 设置的新值是value 设置前的值是原来的value
225
+ :param name:
226
+ :param value:
227
+ :return:
228
+ """
229
+ assert self.r, 'r 不存在,请先调用 set_conn_or_pipe'
230
+ return self.r.getset(name, value)
231
+
232
+ def getrange(self, key, start, end):
233
+ """
234
+ 获取子序列(根据字节获取,非字符)
235
+ r.set("cn_name", "君惜大大") # 汉字
236
+ getrange("cn_name", 0, 2) # 取索引号是0-2 前3位的字节 君 切片操作 (一个汉字3个字节 1个字母一个字节 每个字节8bit)
237
+ getrange("cn_name", 0, -1) # 取所有的字节 君惜大大 切片操作
238
+ r.set("en_name","junxi") # 字母
239
+ getrange("en_name", 0, 2) # 取索引号是0-2 前3位的字节 jun 切片操作 (一个汉字3个字节 1个字母一个字节 每个字节8bit)
240
+ getrange("en_name", 0, -1) # 取所有的字节 junxi 切片操作
241
+ :param key: Redis 的 name
242
+ :param start: 起始位置(字节)
243
+ :param end: 结束位置(字节)
244
+ :return:
245
+ """
246
+ assert self.r, 'r 不存在,请先调用 set_conn_or_pipe'
247
+ return self.r.getrange(key, start, end)
248
+
249
+ def setrange(self, name, offset, value):
250
+ """
251
+ 修改字符串内容,从指定字符串索引开始向后替换(新值太长时,则向后添加)
252
+ r.setrange("en_name", 1, "ccc")
253
+ # jccci 原始值是junxi 从索引号是1开始替换成ccc 变成 jccci
254
+ :param name:
255
+ :param offset: 字符串的索引,字节(一个汉字三个字节)
256
+ :param value: 要设置的值
257
+ :return:
258
+ """
259
+ assert self.r, 'r 不存在,请先调用 set_conn_or_pipe'
260
+ return self.r.setrange(name, offset, value)
261
+
262
+ def setbit(self, name, offset, value):
263
+ """
264
+ 注:如果在Redis中有一个对应: n1 = "foo",
265
+
266
+ 那么字符串foo的二进制表示为:01100110 01101111 01101111
267
+
268
+ 所以,如果执行 setbit('n1', 7, 1),则就会将第7位设置为1,
269
+
270
+ 那么最终二进制则变成 01100111 01101111 01101111,即:"goo"
271
+
272
+ source = "foo"
273
+ for i in source:
274
+ num = ord(i)
275
+
276
+ 特别的,如果source是汉字 "陈思维"怎么办?
277
+ 对于utf-8,每一个汉字占 3 个字节,那么 "陈思维" 则有 9个字节 对于汉字,for循环时候会按照 字节 迭代,那么在迭代时,将每一个字节转换 十进制数,然后再将十进制数转换成二进制
278
+ :param name: redis的name
279
+ :param offset: 位的索引(将值变换成二进制后再进行索引)
280
+ :param value: 值只能是 1 或 0
281
+ :return:
282
+ """
283
+ assert self.r, 'r 不存在,请先调用 set_conn_or_pipe'
284
+ return self.r.setbit(name, offset, value)
285
+
286
+ def getbit(self, name, offset):
287
+ """
288
+ 获取bit
289
+ :param name:
290
+ :param offset:
291
+ :return:
292
+ """
293
+ assert self.r, 'r 不存在,请先调用 set_conn_or_pipe'
294
+ return self.r.getbit(name, offset)
295
+
296
+ def bitcount(self, key, start=None, end=None):
297
+ """
298
+ 获取name对应的值的二进制表示中 1 的个数
299
+ :param key: Redis的name
300
+ :param start: 字节起始位置
301
+ :param end: 字节结束位置
302
+ :return:
303
+ """
304
+ assert self.r, 'r 不存在,请先调用 set_conn_or_pipe'
305
+ return self.r.bitcount(key, start, end)
306
+
307
+ def bitop(self, operation, dest, *keys):
308
+ """
309
+ 获取多个值,并将值做位运算,将最后的结果保存至新的name对应的值
310
+ 获取Redis中n1,n2,n3对应的值,然后讲所有的值做位运算(求并集),然后将结果保存 new_name 对应的值中
311
+ :param operation: AND(并) 、 OR(或) 、 NOT(非) 、 XOR(异或)
312
+ :param dest: 新的Redis的name
313
+ :param keys: 要查找的Redis的name
314
+ :return:
315
+ """
316
+ assert self.r, 'r 不存在,请先调用 set_conn_or_pipe'
317
+ return self.r.bitop(operation, dest, *keys)
318
+
319
+ def strlen(self, name):
320
+ """
321
+ 返回name对应值的字节长度(一个汉字3个字节)
322
+ :param name:
323
+ :return:
324
+ """
325
+ assert self.r, 'r 不存在,请先调用 set_conn_or_pipe'
326
+ return self.r.strlen(name)
327
+
328
+ def incr(self, name, amount=1):
329
+ """
330
+ 自增 name 对应的值,当 name 不存在时,则创建 name=amount,否则,则自增。
331
+ :param name: Redis的name
332
+ :param amount: 自增数(必须是整数)
333
+ :return:
334
+ """
335
+ assert self.r, 'r 不存在,请先调用 set_conn_or_pipe'
336
+ return self.r.incr(name, amount)
337
+
338
+ def incrbyfloat(self, name, amount=1.0):
339
+ """
340
+ 自增 name对应的值,当name不存在时,则创建name=amount,否则,则自增。
341
+ :param name: Redis的name
342
+ :param amount: 自增数(浮点型)
343
+ :return:
344
+ """
345
+ assert self.r, 'r 不存在,请先调用 set_conn_or_pipe'
346
+ return self.r.incrbyfloat(name, amount)
347
+
348
+ def decr(self, name, amount=1):
349
+ """
350
+ 自减 name 对应的值,当 name 不存在时,则创建 name=amount,否则,则自减。
351
+ :param name: Redis的name
352
+ :param amount: 自减数(整数)
353
+ :return:
354
+ """
355
+ assert self.r, 'r 不存在,请先调用 set_conn_or_pipe'
356
+ return self.r.decr(name, amount)
357
+
358
+ def append(self, key, value):
359
+ """
360
+ 在redis name对应的值后面追加内容
361
+ :param key: redis的name
362
+ :param value: 要追加的字符串
363
+ :return:
364
+ """
365
+ assert self.r, 'r 不存在,请先调用 set_conn_or_pipe'
366
+ return self.r.append(key, value)
367
+
368
+ ################redis 基本命令 hash#########
369
+
370
+ def hset(self, name, key, value):
371
+ """
372
+ name对应的hash中设置一个键值对(不存在,则创建;否则,修改)
373
+
374
+ :param name: redis的name
375
+ :param key: name对应的hash中的key
376
+ :param value: name对应的hash中的value
377
+ :return:
378
+ """
379
+ assert self.r, 'r 不存在,请先调用 set_conn_or_pipe'
380
+ return self.r.hset(name, key, value)
381
+
382
+ def hsetnx(self, name, key, value):
383
+ """
384
+ hsetnx(name, key, value) 当name对应的hash中不存在当前key时则创建(相当于添加)
385
+ hsetnx # 只能新建
386
+ :param name:
387
+ :param key:
388
+ :param value:
389
+ :return:
390
+ """
391
+ assert self.r, 'r 不存在,请先调用 set_conn_or_pipe'
392
+ return self.r.hsetnx(name, key, value)
393
+
394
+ def hget(self, name, key):
395
+ """
396
+ 单个取hash的key对应的值
397
+ :param name:
398
+ :param key:
399
+ :return:
400
+ """
401
+ assert self.r, 'r 不存在,请先调用 set_conn_or_pipe'
402
+ return self.r.hget(name, key)
403
+
404
+ def hmset(self, name, mapping):
405
+ """
406
+ 在name对应的hash中批量设置键值对
407
+ :param name: redis的name
408
+ :param mapping: 字典,如:{'k1':'v1', 'k2': 'v2'}
409
+ :return:
410
+ """
411
+ assert self.r, 'r 不存在,请先调用 set_conn_or_pipe'
412
+ return self.r.hmset(name, mapping)
413
+
414
+ def hmget(self, name, keys, *args):
415
+ """
416
+ 在name对应的hash中获取多个key的值
417
+ :param name: reids对应的name
418
+ :param keys: 要获取key集合,如:['k1', 'k2', 'k3']
419
+ :param args: 要获取的key,如:k1,k2,k3
420
+ :return:
421
+ """
422
+ assert self.r, 'r 不存在,请先调用 set_conn_or_pipe'
423
+ return self.r.hmget(name, keys, *args)
424
+
425
+ def hgetall(self, name):
426
+ """
427
+ 获取name对应hash的所有键值
428
+ :param name:
429
+ :return:
430
+ """
431
+ assert self.r, 'r 不存在,请先调用 set_conn_or_pipe'
432
+ return self.r.hgetall(name)
433
+
434
+ def hlen(self, name):
435
+ """
436
+ 获取name对应的hash中键值对的个数
437
+ :param name:
438
+ :return:
439
+ """
440
+ assert self.r, 'r 不存在,请先调用 set_conn_or_pipe'
441
+ return self.r.hlen(name)
442
+
443
+ def hkeys(self, name):
444
+ """
445
+ 得到所有的keys(类似字典的取所有keys)
446
+ :param name:
447
+ :return:
448
+ """
449
+ assert self.r, 'r 不存在,请先调用 set_conn_or_pipe'
450
+ return self.r.hkeys(name)
451
+
452
+ def hvals(self, name):
453
+ """
454
+ 得到所有的value(类似字典的取所有value)
455
+ :param name:
456
+ :return:
457
+ """
458
+ assert self.r, 'r 不存在,请先调用 set_conn_or_pipe'
459
+ return self.r.hvals(name)
460
+
461
+ def hexists(self, name, key):
462
+ """
463
+ 判断成员是否存在(类似字典的in)
464
+ 检查 name 对应的 hash 是否存在当前传入的 key
465
+ :param name:
466
+ :param key:
467
+ :return:
468
+ """
469
+ assert self.r, 'r 不存在,请先调用 set_conn_or_pipe'
470
+ return self.r.hexists(name, key)
471
+
472
+ def hdel(self, name, *keys):
473
+ """
474
+ 删除键值对
475
+ :return:
476
+ """
477
+ assert self.r, 'r 不存在,请先调用 set_conn_or_pipe'
478
+ return self.r.hdel(name, *keys)
479
+
480
+ def hincrby(self, name, key, amount=1):
481
+ """
482
+ 自增name对应的hash中的指定key的值,
483
+ 不存在则创建key=amount
484
+ 自增自减整数(将key对应的value--整数
485
+ 自增1或者2,或者别的整数 负数就是自减)
486
+ :param name: redis中的name
487
+ :param key: hash对应的key
488
+ :param amount: 自增数(整数)
489
+ :return:
490
+ """
491
+ assert self.r, 'r 不存在,请先调用 set_conn_or_pipe'
492
+ return self.r.hincrby(name, key, amount)
493
+
494
+ def hincrbyfloat(self, name, key, amount=1.0):
495
+ """
496
+ 自增name对应的hash中的指定key的值,不存在则创建key=amount
497
+ 自增自减浮点数(将key对应的value--浮点数 自增1.0或者2.0,
498
+ 或者别的浮点数 负数就是自减)
499
+ :param name: redis中的name
500
+ :param key: hash对应的key
501
+ :param amount: amount,自增数(浮点数)
502
+ :return:
503
+ """
504
+ assert self.r, 'r 不存在,请先调用 set_conn_or_pipe'
505
+ return self.r.hincrbyfloat(name, key, amount)
506
+
507
+ def hscan(self, name, cursor=0, match=None, count=None):
508
+ """
509
+ 增量式迭代获取,对于数据大的数据非常有用,hscan可以实现分片的获取数据,并非一次性将数据全部获取完,从而放置内存被撑爆
510
+ 如:
511
+ 第一次:cursor1, data1 = r.hscan('xx', cursor=0, match=None, count=None)
512
+ 第二次:cursor2, data1 = r.hscan('xx', cursor=cursor1, match=None, count=None)
513
+ 直到返回值cursor的值为0时,表示数据已经通过分片获取完毕
514
+ :param name: redis的name
515
+ :param cursor: 游标(基于游标分批取获取数据)
516
+ :param match: 匹配指定key,默认None 表示所有的key
517
+ :param count: 每次分片最少获取个数,默认None表示采用Redis的默认分片个数
518
+ :return:
519
+ """
520
+ assert self.r, 'r 不存在,请先调用 set_conn_or_pipe'
521
+ return self.r.hscan(name, cursor, match, count)
522
+
523
+ def hscan_iter(self, name, match=None, count=None):
524
+ """
525
+ 利用yield封装hscan创建生成器,实现分批去redis中获取数据
526
+
527
+ :param name:
528
+ :param match: 匹配指定key,默认None 表示所有的key
529
+ :param count: 每次分片最少获取个数,默认None表示采用Redis的默认分片个数
530
+ :return: # 生成器内存地址 for循环进行迭代
531
+ """
532
+ assert self.r, 'r 不存在,请先调用 set_conn_or_pipe'
533
+ return self.r.hscan_iter(name, match, count)
534
+
535
+ ####################redis基本命令 list #######
536
+
537
+ def push(self, name, *args):
538
+ """
539
+ 增加(类似于list的append,只是这里是从左边新增加)--没有就新建
540
+ r.lpush("list1", 11, 22, 33)
541
+ 保存顺序为: 33,22,11
542
+ :param name:
543
+ :param values:
544
+ :return:
545
+ """
546
+ assert self.r, 'r 不存在,请先调用 set_conn_or_pipe'
547
+ return self.r.lpush(name, *args)
548
+
549
+ def rpush(self, name, *args):
550
+ """
551
+ 增加(从右边增加)--没有就新建
552
+ r.rpush("list2", 44, 55, 66)
553
+ # 在列表的右边,依次添加44,55,66
554
+ :param name:
555
+ :param args:
556
+ :return:
557
+ """
558
+ assert self.r, 'r 不存在,请先调用 set_conn_or_pipe'
559
+ return self.r.rpush(name, *args)
560
+
561
+ def lpushx(self, name, value):
562
+ """
563
+ 往已经有的name的列表的左边添加元素,没有的话无法创建
564
+ :param name:
565
+ :param value:
566
+ :return:
567
+ """
568
+ assert self.r, 'r 不存在,请先调用 set_conn_or_pipe'
569
+ return self.r.lpushx(name, value)
570
+
571
+ def rpushx(self, name, value):
572
+ """
573
+ 往已经有的name的列表的右边添加元素,没有的话无法创建
574
+ :param name:
575
+ :param value:
576
+ :return:
577
+ """
578
+ assert self.r, 'r 不存在,请先调用 set_conn_or_pipe'
579
+ return self.r.rpushx(name, value)
580
+
581
+ def linsert(self, name, where, refvalue, value):
582
+ """
583
+ r.linsert("list2", "before", "11", "00")
584
+ # 往列表中左边第一个出现的元素"11"前插入元素"00"
585
+ :param name:
586
+ :param where: BEFORE或AFTER
587
+ :param refvalue: 标杆值,即:在它前后插入数据
588
+ :param value: 要插入的数据
589
+ :return:
590
+ """
591
+ assert self.r, 'r 不存在,请先调用 set_conn_or_pipe'
592
+ return self.r.linsert(name, where, refvalue, value)
593
+
594
+ def lset(self, name, index, value):
595
+ """
596
+ 对name对应的list中的某一个索引位置重新赋值
597
+ r.lset("list2", 0, -11) # 把索引号是0的元素修改成-11
598
+ :param name:
599
+ :param index: list的索引位置
600
+ :param value: 要设置的值
601
+ :return:
602
+ """
603
+ assert self.r, 'r 不存在,请先调用 set_conn_or_pipe'
604
+ return self.r.lset(name, index, value)
605
+
606
+ def lrem(self, name, count, value):
607
+ """
608
+ 在name对应的list中删除指定的值
609
+ :param name:
610
+ :param value: 要删除的值
611
+ :param count: num=0,删除列表中所有的指定值
612
+ count=2 - 从前到后,删除2个, num=1,从前到后,删除左边第1个
613
+ count=-2 - 从后向前,删除2个
614
+ :return:
615
+ """
616
+ assert self.r, 'r 不存在,请先调用 set_conn_or_pipe'
617
+ return self.r.lrem(name, count, value)
618
+
619
+ def lpop(self, name):
620
+ """
621
+ 在name对应的列表的左侧获取第一个元素并在列表中移除,返回值则是第一个元素
622
+ :param name:
623
+ :return:
624
+ """
625
+ assert self.r, 'r 不存在,请先调用 set_conn_or_pipe'
626
+ return self.r.lpop(name)
627
+
628
+ def rpop(self, name):
629
+ """
630
+ 在name对应的列表的右侧获取第一个元素并在列表中移除,返回值则是第一个元素
631
+ rpop(name) 表示从右向左操作
632
+ 非阻塞版,如果没有数据,name将不存在
633
+ :param name:
634
+ :return: 存在返回值,不存在返回None,不会阻塞
635
+ """
636
+ assert self.r, 'r 不存在,请先调用 set_conn_or_pipe'
637
+ return self.r.rpop(name)
638
+
639
+ def ltrim(self, name, start, end):
640
+ """
641
+ 删除索引之外的值
642
+ r.ltrim("list2", 0, 2) # 删除索引号是0-2之外的元素,
643
+ 值保留索引号是0-2的元素
644
+ :param name:
645
+ :param start: 索引的起始位置
646
+ :param end: 索引的起始位置
647
+ :return:
648
+ """
649
+ assert self.r, 'r 不存在,请先调用 set_conn_or_pipe'
650
+ return self.r.ltrim(name, start, end)
651
+
652
+ def srem(self, name, *values):
653
+ """
654
+ 删除指定的值, 可用元组传入
655
+ r.srem("list1", "aaaa", "bbbb") # 对key为list1的删除aaaa, bbbb
656
+ r.srem("list1", *tuple(["aaaa", "bbbb"]))
657
+ :param name:
658
+ :return:
659
+ """
660
+ assert self.r, 'r 不存在,请先调用 set_conn_or_pipe'
661
+ return self.r.srem(name, *values)
662
+
663
+ def lindex(self, name, index):
664
+ """
665
+ 取值(根据索引号取值)
666
+ r.lindex("list2", 0) # 取出索引号是0的值
667
+ :param name:
668
+ :param index:
669
+ :return:
670
+ """
671
+ assert self.r, 'r 不存在,请先调用 set_conn_or_pipe'
672
+ return self.r.lindex(name, index)
673
+
674
+ def rpoplpush(self, src, dst):
675
+ """
676
+ 移动 元素从一个列表移动到另外一个列表
677
+ 从一个列表取出最右边的元素,同时将其添加至另一个列表的最左边
678
+ :param src: 要取数据的列表的 name
679
+ :param dst: 要添加数据的列表的 name
680
+ :return:
681
+ """
682
+ assert self.r, 'r 不存在,请先调用 set_conn_or_pipe'
683
+ return self.r.rpoplpush(src, dst)
684
+
685
+ def brpop(self, keys, timeout=0):
686
+ """
687
+ 移出并获取列表的最后一个元素, 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。
688
+
689
+ Redis Rpop 命令用于移除列表的最后一个元素,返回值为移除的元素。brpop是rpop的阻塞版本。Redis Brpop
690
+ 命令移出并获取列表的最后一个元素,如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。
691
+
692
+ 如果timeout为0,则无限期阻塞。
693
+ 如果超时返回None
694
+ :return:
695
+ """
696
+ assert self.r, 'r 不存在,请先调用 set_conn_or_pipe'
697
+ return self.r.brpop(keys, timeout=timeout)
698
+
699
+ def brpoplpush(self, src, dst, timeout=0):
700
+ """
701
+ 移动 元素从一个列表移动到另外一个列表 可以设置超时
702
+ :param src: 取出并要移除元素的列表对应的name
703
+ :param dst: 要插入元素的列表对应的name
704
+ :param timeout: 当src对应的列表中没有数据时,阻塞等待其有数据的超时时间(秒),0 表示永远阻塞
705
+ :return:
706
+ """
707
+ assert self.r, 'r 不存在,请先调用 set_conn_or_pipe'
708
+ return self.r.brpoplpush(src, dst, timeout)
709
+
710
+ def blpop(self, keys, timeout=0):
711
+ """
712
+ 将多个列表排列,按照从左到右去pop对应列表的元素
713
+ r.blpop(["list10", "list11"], timeout=2)
714
+ :param keys: redis的name的集合
715
+ :param timeout: 超时时间,当元素所有列表的元素获取完之后,阻塞等待列表内有数据的时间(秒), 0 表示永远阻塞
716
+ :return:
717
+ """
718
+ assert self.r, 'r 不存在,请先调用 set_conn_or_pipe'
719
+ return self.r.blpop(keys, timeout)
720
+
721
+ def list_iter(self, name):
722
+ """
723
+ 由于redis类库中没有提供对列表元素的增量迭代,如果想要循环name对应的列表的所有元素,那么就需要获取name对应的所有列表。
724
+
725
+ 循环列表
726
+
727
+ 但是,如果列表非常大,那么就有可能在第一步时就将程序的内容撑爆,所有有必要自定义一个增量迭代的功能:
728
+ 自定义redis列表增量迭代
729
+ # 使用
730
+ for item in list_iter('list2'): # 遍历这个列表
731
+ print(item)
732
+ :param name: redis中的name,即:迭代name对应的列表
733
+ :return: yield 返回 列表元素
734
+ """
735
+ assert self.r, 'r 不存在,请先调用 set_conn_or_pipe'
736
+ list_count = self.r.llen(name)
737
+ for index in range(list_count):
738
+ yield self.r.lindex(name, index)
739
+
740
+ ################redis基本命令 set#############
741
+
742
+ def sadd(self, name, *values):
743
+ """
744
+ 增加 一个 set集合
745
+ :param name: 需要增加的rediskey
746
+ :param ProxyPoolValid: 传入集合
747
+ :return:
748
+ """
749
+ assert self.r, 'r 不存在,请先调用 set_conn_or_pipe'
750
+ return self.r.sadd(name, *values)
751
+
752
+ def scard(self, name):
753
+ """
754
+ 获取name对应的集合中元素个数
755
+ :param name:
756
+ :return:
757
+ """
758
+ assert self.r, 'r 不存在,请先调用 set_conn_or_pipe'
759
+ return self.r.scard(name)
760
+
761
+ def smembers(self, name):
762
+ """
763
+ 获取集合中所有的成员
764
+ :param name:
765
+ :return:
766
+ """
767
+ assert self.r, 'r 不存在,请先调用 set_conn_or_pipe'
768
+ return self.r.smembers(name)
769
+
770
+ def srandmember(self, name, number=None):
771
+ """
772
+ 获取集合中随机成员
773
+ :param name:
774
+ :return:
775
+ """
776
+ assert self.r, 'r 不存在,请先调用 set_conn_or_pipe'
777
+ return self.r.srandmember(name, number=number)
778
+
779
+ def sscan(self, name, cursor=0, match=None, count=None):
780
+ """
781
+ 获取集合中所有的成员--元组形式
782
+ :param name:
783
+ :return:
784
+ """
785
+ assert self.r, 'r 不存在,请先调用 set_conn_or_pipe'
786
+ return self.r.sscan(name, cursor, match, count)
787
+
788
+ def sscan_iter(self, name, match=None, count=None):
789
+ """
790
+ 获取集合中所有的成员--迭代器的方式
791
+ 同字符串的操作,用于增量迭代分批获取元素,避免内存消耗太大
792
+ :param name:
793
+ :param match:
794
+ :param count:
795
+ :return:
796
+ """
797
+ assert self.r, 'r 不存在,请先调用 set_conn_or_pipe'
798
+ return self.r.sscan_iter(name, match, count)
799
+
800
+ def sdiff(self, keys, *args):
801
+ """
802
+ 差集
803
+ r.sdiff("set1", "set2") # 在集合set1但是不在集合set2中
804
+ r.sdiff("set2", "set1") # 在集合set2但是不在集合set1中
805
+ :param keys:
806
+ :param args:
807
+ :return:
808
+ """
809
+ assert self.r, 'r 不存在,请先调用 set_conn_or_pipe'
810
+ return self.r.sdiff(keys, *args)
811
+
812
+ def sdiffstore(self, dest, keys, *args):
813
+ """
814
+ 差集--差集存在一个新的集合中
815
+ 获取第一个name对应的集合中且不在其他name对应的集合,再将其新加入到dest对应的集合中
816
+ r.sdiffstore("set3", "set1", "set2") # 在集合set1但是不在集合set2中
817
+ :param dest:
818
+ :param keys:
819
+ :param args:
820
+ :return:
821
+ """
822
+ assert self.r, 'r 不存在,请先调用 set_conn_or_pipe'
823
+ return self.r.sdiffstore(dest, keys, *args)
824
+
825
+
826
+ def RedisConnect(configpath, sesc="proxy"):
827
+ """
828
+ 连接数据库 通过读取配置文件连接,如果读取配置文件 失败 返回None
829
+ :return:
830
+ """
831
+ dictsall = IniConfig(configpath).builder().get_config_dict()
832
+ dicts = dictsall[sesc]
833
+ RedisHost = dicts['RedisHost']
834
+ RedisPort = dicts['RedisPort']
835
+ RedisDB = dicts['RedisDB']
836
+ RedisKey = dicts['RedisKey']
837
+ try:
838
+ rconn = redis.StrictRedis(host=RedisHost, port=RedisPort, db=RedisDB, decode_responses=True)
839
+ except:
840
+ # 有可能因为网络波动无法连接 这里休眠10秒重连一次 如果还是失败就放弃
841
+ time.sleep(10)
842
+ rconn = redis.StrictRedis(host=RedisHost, port=RedisPort, db=RedisDB, decode_responses=True)
843
+ if rconn:
844
+ return rconn, RedisKey
845
+ return None
846
+
847
+
848
+ def getDataFromRedis(configpath, sesc="proxy"):
849
+ """
850
+ 取出数据
851
+ :param configpath:
852
+ :param sesc:
853
+ :return:
854
+ """
855
+ rconn, RedisKey = RedisConnect(configpath, sesc=sesc)
856
+ if rconn:
857
+ rows = rconn.smembers(RedisKey)
858
+ return rows
859
+ else:
860
+ print("redis出现连接错误")
861
+ sys.exit(-1)