0

I have a list in redis key :test

[{'a': 2, 'b': 3}, {'a': 1, 'b': 2}, 
{'a': 2, 'b': 4}, {'a': 1, 'b': 5}]

I can get all the element of key:test with r_list

r_server.set_response_callback('RPOP', ast.literal_eval)
r_list = []
len = r_server.llen("test")
for item in range( r_server.llen("test") ):
    r_list.append(r_server.rpop("test"))

I want to know does Redis support pop all values
I mean that I don't have to iliterate it to get all data and delete it

user2492364
  • 6,543
  • 22
  • 77
  • 147

2 Answers2

1

You could get all elements of the list using LRANGE and delete the key from Redis:

def lrange_literal_eval(lst):
    return [ast.literal_eval(x) for x in lst]

r_server.set_response_callback('LRANGE', lrange_literal_eval)

r_list = r_server.lrange('test', 0, -1)
r_list.reverse()
r_server.delete('test')

If you need this operation to be atomic, use pipelines or Lua scripts.

Example for Redis pipeline:

def lrange_literal_eval(lst):
    return [ast.literal_eval(x) for x in lst]

r_server.set_response_callback('LRANGE', lrange_literal_eval)

with r_server.pipeline() as pipe:
    pipe.lrange('test', 0, -1).delete('test')
    r_list = pipe.execute()[0]
    r_list.reverse()
vaultah
  • 44,105
  • 12
  • 114
  • 143
  • Thank you. What will atomic do ? – user2492364 Jan 06 '16 at 09:52
  • 1
    @user2492364: from [this](https://github.com/andymccurdy/redis-py) page: *Pipelines provide support for buffering multiple commands to the server in a single request. ... Pipelines can also ensure the buffered commands are executed atomically as a group.* For more information see http://redis.io/topics/transactions. – vaultah Jan 06 '16 at 09:55
0

You just have to use the LRANGE command to retrieve all the items in one shot.

Check Link

Community
  • 1
  • 1
Prashant Puri
  • 2,324
  • 1
  • 15
  • 21