在redis中存储ndarray的示例代码

 更新时间:2024年02月02日 09:09:50   作者:mr_songw  
在Redis中存储NumPy数组(ndarray)通常需要将数组转换为二进制格式,然后将其存储为字符串,这篇文章给大家介绍了在redis中存储ndarray的示例代码,感兴趣的朋友一起看看吧

如何在redis中存储ndarray

在Redis中存储NumPy数组(ndarray)通常需要将数组转换为二进制格式,然后将其存储为字符串。以下是使用Python和Redis-py库的一个简单示例:

首先,确保你已经安装了Redis-py库:

pip install redis

然后,你可以使用以下代码将NumPy数组存储到Redis中:

import redis
import numpy as np
import pickle
# 连接到本地Redis服务器,端口默认是6379
redis_client = redis.StrictRedis(host='localhost', port=6379, db=0)
# 创建一个示例的NumPy数组
arr = np.array([[1, 2, 3], [4, 5, 6]])
# 将NumPy数组转换为二进制字符串
arr_binary = pickle.dumps(arr)
# 存储二进制字符串到Redis
redis_client.set('numpy_array_key', arr_binary)
# 从Redis中检索数据并转换回NumPy数组
stored_data = redis_client.get('numpy_array_key')
if stored_data:
    retrieved_arr = pickle.loads(stored_data)
    print("Retrieved NumPy Array:")
    print(retrieved_arr)
else:
    print("Key not found in Redis.")

在这个例子中,pickle模块被用来将NumPy数组转换为二进制字符串,然后使用Redis-py库的set方法将其存储在Redis中。在检索时,使用get方法获取二进制字符串,并使用pickle.loads将其转换回NumPy数组。

补充:

如何把Numpy数组存进Redis

import (base64, struct, numpy, redis)
HOST = 'localhost'
PORT = 6379
connection_pool = redis.ConnectionPool(host=HOST, port=PORT, decode_responses=True)  # 连接池
def redis_save(key: str, numpy_ndarray: numpy.ndarray) -> None:
    """将Numpy数组存入Redis数据库。
    Parameters
    ----------
    key : str
        键字符串。
    numpy_ndarray : numpy.ndarray
        待存储数组。
    """    
    shape = numpy_ndarray.shape
    dim = len(shape)
    value = struct.pack(''.join(['>I']+['I'*dim]), *((dim,)+shape))
    value = base64.a85encode(value+numpy_ndarray.tobytes()) # 得转换成字符串,不然取出时候会报一个错
    conn = redis.Redis(connection_pool=connection_pool)
    conn.set(key, value)
    conn.close()
def redis_read(key: str, dtype) -> numpy.ndarray:
    """从Redis中读取一个Numpy数组。
    Parameters
    ----------
    key : str
        键字符串。
    dtype : Any
        指定数组元素数据类型。
    Returns
    -------
    numpy.ndarray
        从Redis键值对取出的数组。
    """
    SIZE = 4
    conn = redis.Redis(connection_pool=connection_pool)
    bytes = base64.a85decode(conn.get(key))
    conn.close()
    dim = struct.unpack('>I', bytes[:1*SIZE])[0]
    shape = struct.unpack('>%s' % ('I'*dim), bytes[1*SIZE:(dim+1)*SIZE])
    ret = numpy.frombuffer(
        bytes,
        offset=(dim+1)*SIZE,
        dtype=dtype
    ).reshape(shape)
    return ret

经检验的,存入后可以正常取出,放心食用。

到此这篇关于如何在redis中存储ndarray的文章就介绍到这了,更多相关redis存储ndarray内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • odoo中使用redis实现缓存的步骤

    odoo中使用redis实现缓存的步骤

    这篇文章主要介绍了odoo中使用redis实现缓存的步骤,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-04-04
  • redis Template.opsForValue()中方法实例详解

    redis Template.opsForValue()中方法实例详解

    这篇文章主要介绍了redis Template.opsForValue()中方法讲解,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-05-05
  • Redis分布式锁Redlock的实现

    Redis分布式锁Redlock的实现

    本文主要介绍了Redis分布式锁Redlock的实现,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-08-08
  • 利用redis lua脚本实现时间窗分布式限流

    利用redis lua脚本实现时间窗分布式限流

    Lua是一种轻量小巧的脚本语言,Redis是高性能的key-value内存数据库,在部分场景下,是对关系数据库的良好补充,本文给大家介绍了如何利用redis lua脚本实现时间窗分布式限流,需要的朋友可以参考下
    2024-03-03
  • 关于Redis库存超卖问题的分析

    关于Redis库存超卖问题的分析

    在高并发场景下进行优惠券秒杀测试时,发现由于并发操作导致了超卖问题,即理论上只能卖出100个优惠券,实际卖出了102个,分析原因,是因为在高并发环境下,多个线程同时操作库存,导致数据不一致,提出了两种解决方案:悲观锁和乐观锁
    2024-11-11
  • Redis中的慢日志

    Redis中的慢日志

    这篇文章主要介绍了Redis中的慢日志,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-12-12
  • Redis过期数据是否会被立马删除

    Redis过期数据是否会被立马删除

    这篇文章主要为大家介绍了Redis过期数据会被立马删除么的问题解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-07-07
  • Redis接口访问优化的方法步骤

    Redis接口访问优化的方法步骤

    本文基于之前的Redis接口访问进行优化,引入了接口防抖功能,通过时间段参数限制接口调用频率,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-10-10
  • 手把手教你使用redis实现排行榜功能

    手把手教你使用redis实现排行榜功能

    使用Redis中有序集合的特性来实现排行榜是又好又快的选择,一般排行榜都是有实效性的,比如“用户积分榜”,下面这篇文章主要给大家介绍了关于使用redis实现排行榜功能的相关资料,需要的朋友可以参考下
    2023-04-04
  • Redis分布式缓存:微信抢红包解决方案

    Redis分布式缓存:微信抢红包解决方案

    微信抢红包已经在我们生活中很常见的场景了,特别是年底公司开年会和春节2个时间段。本文主要介绍了通过Redis实现微信抢红包功能,感兴趣的小伙伴可以了解一下
    2021-12-12

最新评论