I am building some very large lookup tables in Redis. I have some straightforward code that works as intended when looping through a dict to set a single value in my Redis hash (via a pipeline) for each item using hset()
:
foo = {"1234": "5678", "abcd": "efgh", ... }
with self.db.pipeline() as pipe:
for foo in bar:
pipe.hset("lookup_table", foo["key"], foo["value"])
pipe.execute()
This is slow with a large dict. To speed it up, I want to be able to set multiple items as a mapping into the pipeline without having to loop over it. With hmset()
now deprecated, it seems that hset()
can accept a mapping via a keyword arg. I have attempted to do the following:
with self.db.pipeline() as pipe:
pipe.hset("lookup_table", mapping=foo)
pipe.execute()
but this yields the error TypeError: hset() got an unexpected keyword argument 'mapping'
. Am I using hset()
incorrectly? Or am I mistaken in thinking that hset()
can accept multiple items in this way?
I’m using py-redis 3.4.1 with Python 3.7.5.
3
Answers
This appears to be a known issue as shown here –> https://github.com/andymccurdy/redis-py/issues/1310#issuecomment-603081122.
As you can see in that image linked, the source code in PyPi has
hset
with a function signature that does not include the keywordmapping
. You should verify in your installation ofpy-redis
that the same issue is present and follow that ticket as well. To work around it you can clone straight frommaster
branch in order to use that feature.Updating with
solved the issue for me.
For anyone coming later to find a better answer and example.
Also covered more on handling dict with redis here