问题需求:
redis内存暴增,后来发现有很多设置永久不过期。
解决:查找出来之后针对前缀批量设置过期时间 (过期时间与开发沟通 保证服务不受影响)
来源于网上杨一的代码 正好解决了我遇到的问题 在这里记录一下。
1 # encoding: utf-8
2
3 import redis
4 import random
5 import string
6 import time
7 pool = redis.ConnectionPool(host='127.0.0.1', port=6379, password="123456", db=0)
8 r = redis.Redis(connection_pool=pool)
9
10 def random_str():
11 return ''.join(random.choice(string.ascii_letters + string.digits) for _ in range(7))
12
13
14 def init_keys():
15 start_time = time.time()
16 for i in xrange(0, 20):
17 key_name = 'dba_'+str(i)
18 value_name = random_str()
19 r.set(key_name, value_name)
20 print 'initial keys successfully,use time:', time.time() - start_time
21
22
23 def del_keys_without_pipe():
24 start_time = time.time()
25 result_length = 0
26 for key in r.scan_iter(match='rawdata_lastStatus_0015000200*', count=1000):
27 r.delete(key)
28 result_length += 1
29 print "normal ways end at:", time.time() - start_time
30 print "normal ways delete numbers:", result_length
31
32
33 def del_keys_with_pipe():
34 start_time = time.time()
35 result_length = 0
36 pipe = r.pipeline()
37 for key in r.scan_iter(match='rawdata_*_otherTrades', count=1000):
38 pipe.expire(key,120)
39 result_length += 1
40 if result_length % 1000 == 0:
41 pipe.execute()
42 time.sleep(1)
43 pip_time = time.time()
44 print "use pipeline scan time ", time.time() - start_time
45 pipe.execute()
46
47 print "use pipeline end at:", time.time() - pip_time
48 print "use pipeline ways delete numbers:", result_length
49
50
51 def main():
52 # init_keys()
53 # del_keys_without_pipe()
54 # init_keys()
55 del_keys_with_pipe()
56
57
58 if __name__ == '__main__':
59 main()