Redis数据存储和读写

redis · 浏览次数 : 6

小编点评

**Redis 数据存储和读写疑问** **数据存储格式** 在 Redis 中,所有的数据存储都是基于字符串的。无论你插入的是 String、int 还是 DateTime 类型的数据,最终都会以字符串的形式存储在 Redis 中。 **数据类型转换** 为了减少序列化和反序列化的性能问题,我们可以根据需要选择不同的序列化格式(如 JSON、Protobuf 等)来存储更复杂的数据结构。 **性能影响因素** 序列化和反序列化的性能取决于以下因素: * 数据量大小 * 数据类型 * 数据结构选择 **优化方法** * 选择高效的序列化格式 *减少数据量 * 使用批量操作 *缓存计算结果 * 使用哨兵和集群 **数据结构原理** * 字符串:SDS(带元数据) * 哈希表:键值对集合 * 列表:有序字符串集合 * 集合:无序字符串集合 *有序集合:关联分数 * 位图:高效存储二进制数据 * HyperLogLog:基于有序集合的估算 * 地理空间:基于有序集合的地理位置 * 内存管理:jemalloc、LRU/LFU淘汰

正文

今天工作群里,有小伙伴问了一个问题,从Redis获取的数据,一会是0,一会是OK。

这引起了我们对Redis数据存储和读写的疑问。

以下是整理的一些技术研究内容。

在 Redis 中,所有的数据存储都是基于字符串的。无论你插入的是 String、int 还是 DateTime 类型的数据,最终都会以字符串的形式存储在 Redis 中。具体来说:

  1. String 类型数据:

    • 存储:直接以字符串形式存储,无需额外处理。
    • 取出:直接取出字符串即可。
  2. int 类型数据:

    • 存储:将 int 类型转换为字符串,然后存储。
    • 取出:从 Redis 中取出字符串后,再转换为 int 类型。
  3. DateTime 类型数据:

    • 存储:通常将 DateTime 类型转换为某种标准格式的字符串(如 ISO 8601 格式),然后存储。
    • 取出:从 Redis 中取出字符串后,再解析为 DateTime 类型。

具体的操作示例如下:

插入数据

import redis
from datetime import datetime

# 连接到 Redis
r = redis.StrictRedis(host='localhost', port=6379, db=0)

# 存储 String 数据
r.set('my_string', 'Hello, Redis!')

# 存储 int 数据
r.set('my_int', str(12345))

# 存储 DateTime 数据
now = datetime.now().isoformat()
r.set('my_datetime', now)

取出数据

# 取出 String 数据
my_string = r.get('my_string').decode('utf-8')

# 取出 int 数据
my_int = int(r.get('my_int'))

# 取出 DateTime 数据
my_datetime = datetime.fromisoformat(r.get('my_datetime').decode('utf-8'))

数据类型转换:当你从 Redis 取出数据时,Redis 返回的是字节字符串,你需要根据存储的数据类型进行相应的转换:

  • **String 数据:**直接解码为字符串。
  • **int 数据:**先解码为字符串,然后转换为整数。
  • **DateTime 数据:**先解码为字符串,然后解析为 DateTime 对象。

这种方式虽然简单直接,但需要在应用层处理数据的序列化和反序列化。

我们可以根据需要选择不同的序列化格式(如 JSON、Protobuf 等)来存储更复杂的数据结构。

这种设计会出现数据序列化和反序列化的性能问题吗?
Redis内部数据的存储原理是什么?
 
以上。
 
周国庆
2024/6/2

 

与Redis数据存储和读写相似的内容:

Redis数据存储和读写

今天工作群里,有小伙伴问了一个问题,从Redis获取的数据,一会是0,一会是OK。 这引起了我们对Redis数据存储和读写的疑问。 以下是整理的一些技术研究内容。 在 Redis 中,所有的数据存储都是基于字符串的。无论你插入的是 String、int 还是 DateTime 类型的数据,最终都会以

[转帖]Redis是的缓存特征及类型

文章目录 缓存特征缓存处理请求的两种情况缓存的类型只读缓存读写缓存 缓存特征 一个系统中的不同层之间的访问速度不一样,所以我们才需要缓存,这样就可以把一些需要频繁访问的数据放在缓存中,以加快它们的访问速度。 计算机系统中的三层存储结构,以及它们各自的常用容量和访问性能 计算机系统中,默认有两种缓存:

Redis数据结构(一)-Redis的数据存储及String类型的实现

Redis作为基于内存的非关系型的K-V数据库。因读写响应快速、原子操作、提供了多种数据类型String、List、Hash、Set、Sorted Set、在项目中有着广泛的使用,今天我们来探讨下下Redis的数据结构是如何实现的。

Linux服务器使用Redis作为数据缓存,并用log4j2进行日志记录

前言 个人网站使用Vue作为前端,SpringBoot作为后端,MySQL作为数据库,但前端每次请求都会从MySQL数据库中读取数据,而MySQL数据库的数据是存储于服务器磁盘中,所以响应速度有一定影响。之前了解过一点Redis数据库,该数据库数据存储于内存中(也可以持久化于磁盘中),数据读取速度就

一种KV存储的GC优化实践

从内部需求出发,我们基于TiKV设计了一款兼容Redis的KV存储。基于TiKV的数据存储机制,对于窗口数据的处理以及过期数据的GC问题却成为一个难题。本文希望基于从KV存储的设计开始讲解,到GC设计的逐层优化的过程,从问题的存在到不同层面的分析,可以给读者在类似的优化实践中提供一种参考思路。

[转帖]K8S部署Redis Cluster集群(三主三从模式) - 部署笔记

https://www.cnblogs.com/cheyunhua/p/15619317.html 一、Redis 介绍 Redis代表REmote DIctionary Server是一种开源的内存中数据存储,通常用作数据库,缓存或消息代理。它可以存储和操作高级数据类型,例如列表,地图,集合和排序

【Azure Redis 缓存】关于Azure Cache for Redis 服务在传输和存储键值对(Key/Value)的加密问题

问题描述 Azure Cache for Redis 服务在传输和存储数据时是如何加密呢? 问题回答 一:关于Azure cache for Redis服务在数据传输过程中是如何加密的? 为了确保在Azure cache for Redis和客户端应用程序之间传输的数据安全,需要启用TLS加密。Az

单线程 Redis 如此快的 4 个原因

本文翻译自国外论坛 medium,原文地址:https://levelup.gitconnected.com/4-reasons-why-single-threaded-redis-is-so-fast-414e0106f921 作为内存数据存储,Redis 以其速度和性能而闻名,通常被用作大多数后

[转帖]Redis 持久化原理和实现

https://juejin.cn/post/6877763937513766919 Redis 所有的数据和状态存储在内存中,为了避免进程退出而导致数据丢失,需要将数据和状态保存到硬盘上。 为了达到这一目的,通常有两种实现方式: 将 Redis 当作一个状态机,记录每一次的对 Redis 的操作,

[转帖]Redis持久化-RDB和AOF

持久化的功能: Redis是内存数据库, 数据都是存储在内存中, 为了避免进程退出导致数据的永久丢失, 需要定期将Redis中的数据以某种形式(数据或命令) 从内存保存到硬盘。 当下次Redis重启时, 利用持久化文件实现数据恢复。 除此之外, 为了进行灾难备份, 可以将持久化文件拷贝到一个远程位置