标签: redis-py

redis-py管道有多少个命令?

我想使用管道来减少我的程序和redis-server之间的交互次数.
我可能在管道中设置了许多命令,但我找不到任何描述可以在管道中设置的最大命令数的文档.

有什么建议吗?提前致谢.

python redis redis-py

4
推荐指数
1
解决办法
3501
查看次数

如何有效地向Redis插入十亿数据?

我有大约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)

python redis redis-py

4
推荐指数
2
解决办法
6950
查看次数

如何使用python在redis中实现原子get或set&get键?

我有一个 redis 服务器,我想实现一个原子(或伪原子)方法,它将执行以下操作(注意:我有一个与 redis 服务器有多个会话的系统):

  1. 如果某个键K存在,则获取它的值
  2. 否则,使用由某个函数F(生成salts)生成的随机值调用SETNX 函数
  3. 向 redis 询问当前会话刚刚生成的密钥K的值(或由另一个会话“同时”生成 - 当前会话生成它之前的一小段时间)

我不想预先生成(在检查值是否存在之前)带有函数F的值,如果键不存在则使用它的原因是:

  1. 我不想在没有理由的情况下调用F(它可能会导致密集的 CPU 行为(
  2. 我想避免下一个有问题的情况:T1:会话 1 生成一个随机值VAL1 T2:会话 1 询问密钥K 是否存在并得到“假” T3:会话 2 生成一个随机值VAL2 T4:会话 2 询问密钥K 是否存在并得到了“假” T5:第二节电话SETNX与价值VAL2和使用VAL2在T6从现在开始:第一节通话SETNX与价值VAL1并使用VAL1上,其中关键的实际值从现在ķVAL2

我创建的 python 伪代码是:

    import redis
    r = redis.StrictRedis(host='localhost', port=6379, db=0)
    ''' gets …
Run Code Online (Sandbox Code Playgroud)

python redis python-2.7 redis-py

3
推荐指数
1
解决办法
3361
查看次数

从redis-py执行自定义redis命令

我使用Dynamic Redis为redis添加了其他功能.我可以使用redis-cli中的命令.是否可以使用redis-py在python脚本中使用这些新命令?

redis redis-py

3
推荐指数
1
解决办法
2321
查看次数

断管错误Redis

我们正在尝试通过 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 …

python sockets redis redis-py

3
推荐指数
2
解决办法
7084
查看次数

使用 redis 和 python 进行故障安全消息广播,供特定接收者使用

所以redis 5.0新鲜推出了一个新功能,叫做Streams。它们似乎非常适合分发进程间通信的消息:

  • 它们在可靠性方面超越了 PUB/SUB 事件消息传递的能力:PUB/SUB 是即发即忘的,无法保证收件人会收到消息
  • redis 列表有点低级,但仍然可以使用。然而,流针对性能和上述用例进行了优化。

然而,由于这个功能相当新,几乎没有任何 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)

python ipc stream redis redis-py

3
推荐指数
1
解决办法
832
查看次数

获取Redis通配符

我正在使用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)

有办法吗?

python redis redis-py

2
推荐指数
1
解决办法
2406
查看次数

redis-py是否会自动将evalsha用于已注册的脚本?

当我将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还是每次都将整个脚本发送到服务器?

redis redis-py

2
推荐指数
1
解决办法
353
查看次数

asyncio.start_unix_server 和 redis 的套接字错误

我正在尝试使用 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)

python redis python-3.x redis-py python-asyncio

2
推荐指数
1
解决办法
487
查看次数

是否可以将嵌套字典作为哈希结构存储在Redis中?

我正在尝试使用 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)

python redis redis-py

2
推荐指数
1
解决办法
4970
查看次数

标签 统计

redis ×10

redis-py ×10

python ×8

ipc ×1

python-2.7 ×1

python-3.x ×1

python-asyncio ×1

sockets ×1

stream ×1