我想使用管道来减少我的程序和redis-server之间的交互次数.
我可能在管道中设置了许多命令,但我找不到任何描述可以在管道中设置的最大命令数的文档.
有什么建议吗?提前致谢.
我有大约20亿个键值对,我想将它们有效地加载到Redis中。我目前正在使用Python,并使用redis-py记录的Pipe 。如何加快以下方法的速度?
import redis
def load(pdt_dict):
"""
Load data into redis.
Parameters
----------
pdt_dict : Dict[str, str]
To be stored in Redis
"""
redIs = redis.Redis()
pipe = redIs.pipeline()
for key in pdt_dict.keys():
pipe.hmset(self.seller + ":" + str(key), pdt_dict[key])
pipe.execute()
Run Code Online (Sandbox Code Playgroud) 我有一个 redis 服务器,我想实现一个原子(或伪原子)方法,它将执行以下操作(注意:我有一个与 redis 服务器有多个会话的系统):
我不想预先生成(在检查值是否存在之前)带有函数F的值,如果键不存在则使用它的原因是:
我创建的 python 伪代码是:
import redis
r = redis.StrictRedis(host='localhost', port=6379, db=0)
''' gets …Run Code Online (Sandbox Code Playgroud) 我使用Dynamic Redis为redis添加了其他功能.我可以使用redis-cli中的命令.是否可以使用redis-py在python脚本中使用这些新命令?
我们正在尝试通过 redis-py 包将大小为 2.3GB 的腌制对象 SET 到 redis 中。遇到以下错误。
BrokenPipeError: [Errno 32] 管道损坏
redis.exceptions.ConnectionError:写入套接字时出现错误 104。对等方重置连接。
我想了解根本原因。是由于服务器端还是客户端的输入/输出缓冲区限制?是否由于 RESP 协议的任何限制?是否允许将 2.3 Gb 的单个值(字节)存储到 Redis 中?
导入redis
r = redis.StrictRedis(host='10.XXX', port=7000, db=0)
pickled_object = pickle.dumps(obj_to_be_pickled)
r.set('some_key',pickled_object)
客户端错误
BrokenPipeError: [Errno 32] 管道损坏
/usr/local/lib/python3.4/site-packages/redis/connection.py(544)send_packed_command()
self._sock.sendall(item)
服务器端错误
31164:M 04 Apr 06:02:42.334 - 来自客户端的协议错误:id=95 addr=10.2.130.144:36120 fd=11 name= age=0 idle=0 flags=N db=0 sub=0 psub=0 multi =-1 qbuf=16384 qbuf-free=16384 obl=42 oll=0 omem=0 events=r cmd=NULL
31164:M 04 Apr 06:07:09.591 - 来自客户端的协议错误:id=96 addr=10.2.130.144:36139 fd=11 name=age=9 idle=0 flags=N db=0 sub=0 psub=0 multi …
所以redis 5.0新鲜推出了一个新功能,叫做Streams。它们似乎非常适合分发进程间通信的消息:
然而,由于这个功能相当新,几乎没有任何 Python(甚至通用的 redis)手册,而且我真的不知道如何使流系统适应我的用例。
我想要一个发布程序,将消息推送到流并包含收件人信息(如recipient: "user1")。然后我将有几个接收进程,所有进程都应该检查新的流消息并比较它们是否是目标接收者。如果是,他们应该处理该消息并将其标记为已处理(已确认)。
但是,我不太了解消费者群体、待处理状态等概念。有人能给我一个关于我的小伪代码的真实例子吗?
发件人.py
db = Redis(...)
db.the_stream.add({"recipient": "user1", "task": "be a python"})
Run Code Online (Sandbox Code Playgroud)
recipient.py(将有许多实例运行,每个实例都有一个唯一的收件人 ID)
recipient_id = "user1" # you get the idea...
db = Redis(...)
while True:
message = db.the_stream.blocking_read("$") # "$" somehow means: just receive new messages
if message.recipient == recipient_id:
perform_task(message.task)
message.acknowledge() # let the stream know it was processed
else:
pass # well, do nothing here since it's not our …Run Code Online (Sandbox Code Playgroud) 我正在使用redis进行python项目,经过一些研究后我没有找到任何解释如何在包含通配符'*'的字符串上生成get()的内容.
所以我有几把钥匙:
example.first
example.second
Run Code Online (Sandbox Code Playgroud)
我想获得example.first和example.second的键/值:
mymap = r_server.hgetall('example.*')
Run Code Online (Sandbox Code Playgroud)
有办法吗?
当我将Lua脚本注册到redis客户端时:
script = redis_client.register_script(lua_string)
Run Code Online (Sandbox Code Playgroud)
然后使用默认客户端运行脚本:
script(keys, args)
Run Code Online (Sandbox Code Playgroud)
这会自动在内部使用evalsha还是每次都将整个脚本发送到服务器?
我正在尝试使用 asyncio 和 Unix 域套接字在 Python 中构建一个玩具内存 Redis 服务器。
我的最小示例只返回baz每个请求的值:
import asyncio
class RedisServer:
def __init__(self):
self.server_address = "/tmp/redis.sock"
async def handle_req(self, reader, writer):
await reader.readline()
writer.write(b"$3\r\nbaz\r\n")
await writer.drain()
writer.close()
await writer.wait_closed()
async def main(self):
server = await asyncio.start_unix_server(self.handle_req, self.server_address)
async with server:
await server.serve_forever()
def run(self):
asyncio.run(self.main())
RedisServer().run()
Run Code Online (Sandbox Code Playgroud)
当我测试有两个连续的客户端请求的redis客户端库与下面的脚本,它的工作原理:
import time
import redis
r = redis.Redis(unix_socket_path="/tmp/redis.sock")
r.get("foo")
time.sleep(1)
r.get("bar")
Run Code Online (Sandbox Code Playgroud)
但是,如果我删除time.sleep(1),有时它会起作用,有时第二个请求会失败,并且会出现以下任一情况:
Traceback (most recent call last):
File "/tmp/env/lib/python3.8/site-packages/redis/connection.py", line 706, in send_packed_command …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用 HSET 将嵌套字典存储为哈希,但这似乎不可能。
一个不起作用的例子:
from redis import StrictRedis
foo = {
"host_data": {
"hostname": "some_host",
"mac_address": "82:fa:8e:63:40:05",
"root_password": {
"is_crypted": True,
"password": "sha512_password"
},
"network": {
"ip_address": "192.168.0.10/24",
"default_gateway": "192.168.0.1",
"vmnic": "vmnic3",
"vlan": 20
},
"dns_servers": [
"dns01.local",
"dns02.local"
]
},
"installation_type": "esxi",
"image_data": {
"type": "vCenter_contentlib",
"host": "vcenter01",
"credential": {
"username": "some_user",
"password": "some_password"
},
"content_library": "the_content_lib_name",
"image_name": "some_image"
},
"host_short_name": "esxi021"
}
redis_connection = StrictRedis(host='localhost', port=6379, charset="utf-8", decode_responses=True)
redis_connection.hset("test", mapping=foo)
Run Code Online (Sandbox Code Playgroud)
抛出以下错误:
Traceback (most recent call last):
File …Run Code Online (Sandbox Code Playgroud)