6

我想删除一个 Riak 存储桶,以便从我的系统中清除旧数据。我知道没有单一的 Riak API 可以执行此操作,而是删除了 bucket 中的所有密钥,这有效地删除了它。Riak 确实提供了一个 API 来获取所有密钥,所以这相当简单。

我在网上找到了一些代码来做到这一点,但它是用 JavaScript 编写的,并且在 Node.js 下运行。我想要一些 Python 的东西。这可能是一件简单的事情。有没有人有任何例子?

4

2 回答 2

11

就像我在问题中所说的那样,我认为这很简单,尤其是请求库,所以我开发了一个脚本来执行此操作。我从 Riak keys=true(即非分块)模式开始,但在我较大的存储桶上失败了。我切换到分块模式keys=stream{...}{...}...{...}并按顺序处理。还不错。这是代码:

#!/usr/bin/python
# script to delete all keys in a Riak bucket

import json
import re
import requests
import sys

def processChunk(chunk):
    global key_count
    obj = json.loads(chunk.group(2))
    if 'keys' in obj:
        for key in obj['keys']:
            r = requests.delete(sys.argv[1] + '/' + key)
            print 'delete key', key, 'response', r.status_code
            key_count += 1


if len(sys.argv) != 2:
    print 'Usage: {0} <http://riak_host:8098/riak/bucket_name>'.format(sys.argv[0])
    print 'Set riak_host and bucket_name appropriately for your Riak cluster.'
    exit(0)

r = requests.get(sys.argv[1] + '?keys=stream')
content = ''
key_count = 0

for chunk in r.iter_content():
    if chunk:
        content += chunk

re.sub(r'(?=(^|})({.*?})(?={|$))', processChunk, content)

print 'Deleted', key_count, 'keys'

虽然此时我的问题已基本解决,但我怀疑还有更好的解决方案。我欢迎人们在此页面上添加它们。除非几周后没有提供替代方案,否则我不会接受我自己的答案。

于 2013-01-25T23:15:13.897 回答
2

如果您可以选择使用 python riak-client,则可以使用更少的代码来实现:

#!/usr/bin/python
import riak

riak_handle = riak.RiakClient(pb_port=8087, protocol='pbc')
riak_bucket = riak_handle.bucket('default')

for keys in riak_bucket.stream_keys():
    for key in keys:
        print('Deleting %s' % key)
        riak_bucket.delete(key)

如果这是您的主要用例,您可以调整它以使用参数。

于 2014-08-13T11:52:41.137 回答