redis中String,Hash类型用法与场景使用

news2024/11/17 19:35:13

String

用法

1.  设置键值对

(1)设置键值对使用 set 命令设置 key 的值。

返回值:ok,如果 key 已经存在,set 命令会覆盖旧值。

(2)使用 setex 命令设置 key 的值并为其设置过期时间(以秒为单位)。

返回值:ok

(3)使用 setnx 命令只在 key 不存在时设置其值。

返回值:1 - 成功,0 - 失败

(4)设置多个键值对使用 mset 命令同时设置一个或多个key-value对。

[] 表示可以多写,也可以不写,意思就是可以同时设置多个key-value对

2. 获取键值

使用 get 命令获取key的值。 

返回值:存在返回值,不存在返回nil

3. 数值操作

使用 incr、decr、incrby、decrby 等命令对key对应的整数值进行加、减操作。

返回值:返回加后的值

内部编码

1.  int:当存储的值为整数,且值的大小可以用long类型表示时,Redis使用int编码。 Redis启动时会预先建立10000个分别存储0到9999的redisObject变量作为共享对象。这意味着如果设置的字符串键值在0到10000之间,Redis可以直接指向这些共享对象,从而节省内存空间。

2. embstr:当存储的值为字符串,且长度大于某个阈值(不同资料中给出的具体数字可能有所不同,但常见的是39字节或44字节)时,Redis使用embstr编码。 embstr编码中,String对象的实际值会被存储在一个特殊的字符串对象中,该对象包含了字符串的长度和字符数组的指针,但是不包含额外的空间。 

3. raw:当存储的值为字符串,且长度超过embstr编码的阈值时,Redis使用raw编码。 raw编码是最基本的字符串表示方式,底层类似于Java中的byte数组。 raw编码在处理大字符串时具有较好的灵活性。

redis会根据当前值的类型和长度动态决定使用哪种内部编码实现。上述的阈值(如39字节或44字节)一般是可以根据实际的应用场景在redis的配置文件redis.conf中进行修改的。

使用场景

1. 作为缓存对象

将经常访问的数据(如用户信息、商品详情等)存储在Redis中,作为缓存使用,以减少对数据库的访问次数,提高系统性能。

2. 计数操作

利用Redis的原子性操作(如incr命令)来实现计数器功能,如网站的访问量、点赞数、评论数等。

3. 共享Session信息

在多应用或多服务器架构中,使用Redis存储用户Session信息,实现Session的共享和持久化。

4. 限制访问

限制一个用户只能在一个设备上登录,或者在发送短信时设置key的过期时长等。

5. 分布式锁

使用Redis的String类型结合 setnx 命令实现分布式锁,以确保在分布式系统中多个进程或线程对共享资源的互斥访问。


Hash

用法

redis 自身用的就是键值对(key-value),而使用 hash 类型用来存储的时候防止搞混,映射关系就为 field-value

1. 设置字段和值

(1)设置 hash 指定字段(field)的值(valueh)

[] 表示可以多写,也可以不写,意思就是可以同时设置多组键值对

返回值:设置成功的键值对的个数

 (2)在 key 不存在时设置其值。

2. 获取 flild / value

(1)获取 key 的 field 

返回值:存在返回值,不存在返回nil

(2)获取 key 的所有 fleid

先根据 key 找到对应的 hash,然后再遍历 hash

(3) 获取对应 key 中所有 field 的个数

返回值:个数

 (4)查询多个 value

(5)获取 key 所有 value

返回值:找到的 value

(6)获取 key 所有的 field 和 value

假设有两组 hash:key1 f1 111,key2 f2 222

返回值:(1)"f1" (2)"111"(3)"f2"(4)"222"

3. 判断 / 删除

(1)判断指定的 field 是否存在

返回值:1 - 存在,0 - 不存在

(2)删除 hash 中指定的 field

如果直接写 del key 会直接把所有的 key 删除

返回值:删除的个数

返回值:找到的 field

4. 数值操作

对值进行加/减

 

返回值:计算后的值

内部编码

1. iplist(压缩列表):当哈希类型元素个数小于hash-max-ziplist-entries配置(默认512个)且同时所有值都小于hash-max-ziplist-value配置(默认64字节)时,Redis会使用ziplist作为哈希的内部实现。 ziplist使用更加紧凑的结构实现多个元素的连续存储,所以在节省内存方面比hashtable更加好,但是读的比较慢(数据越多越慢)。

2. hashtable(哈希表):当哈希类型无法满足ziplist的条件时,Redis会使用hashtable作为哈希的内部实现。 hashtable的读写时间复杂度为O(1),提供了高效的键值对存储和访问能力。 Redis在内部会根据存储的数据类型和实际使用情况动态选择使用哪种编码方式,以达到性能和存储空间的最佳平衡。

hash-max-ziplist-entries和hash-max-ziplist-value可以在Redis的配置文件redis.conf中进行自己配置。

使用场景

1.用户信息存储

  • 存储用户的基本信息,如用户名、密码(通常是哈希后的密码)、邮箱、手机号等。
  • 可以用用户的唯一 ID 作为 key,将用户的其他信息存储在 Hash 中。

2. 购物车:

  • 对于电商网站,可以使用 Hash 来存储用户的购物车信息。
  • key 可以是用户的 ID,field 可以是商品的 ID,value 则是商品的数量或其他相关信息。

3. 缓存热点数据

  • 将频繁访问的、结构化的数据(如文章详情、商品详情等)存储在 Hash 中,以提高访问速度。
  • 当需要从数据库或其他慢速数据源中获取这些数据时,可以先检查 Redis 中是否存在缓存。

List,set,bitfield 等后面我会再总结出来。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1692772.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MCS-51伪指令

上篇我们讲了汇编指令格式,寻址方式和指令系统分类,这篇我们讲一下单片机伪指令。 伪指令是汇编程序中用于指示汇编程序如何对源程序进行汇编的指令。伪指令不同于指令,在汇编时并不翻译成机器代码,只是会汇编过程进行相应的控制…

『Stable Diffusion 』AI绘画,不会写提示词怎么办?

提示词 有没有想过,为什么你用 SD 生成的猫是长这样的。 而其他人可以生成这样的猫。 虽然生成的都是猫,但猫与猫之间还是有差距的。 如果你的提示词只是“cat”,那大概率就会出现本文第一张图的那个效果。而如果你加上一些形容词&#xff…

【ArcGIS微课1000例】0111:谷歌地球Google Earth下载安装与使用教程

一、谷歌地球安装 双击安装包,默认点击完成即可。 二、谷歌地球使用 打开快捷方式,开始使用谷歌地球。欢迎界面: 软件主界面: 三、谷歌地球下载 软件安装包位于《ArcGIS微课实验1000例(附数据)专栏配套完数据包中的0111.rar中…

小红书云原生 Kafka 技术剖析:分层存储与弹性伸缩

面对 Kafka 规模快速增长带来的成本、效率和稳定性挑战时,小红书大数据存储团队采取云原生架构实践:通过引入冷热数据分层存储、容器化技术以及自研的负载均衡服务「Balance Control」,成功实现了集群存储成本的显著降低、分钟级的集群弹性迁…

STM32硬件接口I2C应用(基于BH1750)

目录 概述 1 STM32Cube控制配置I2C 1.1 I2C参数配置 1.2 使用STM32Cube产生工程 2 HAL库函数介绍 2.1 初始化函数 2.2 写数据函数 2.3 读数据函数 3 光照传感器BH1750 3.1 认识BH1750 3.2 BH1750寄存器 3.3 采集数据流程 4 BH1750驱动实现 4.1 接口函数实现 4.2…

又有人叫嚣:AI取代前端,来给你几张图,看能不能憋死AI。

总有自媒体人,为了些许流量,在大放厥词,说截个图给AI,AI就能输出前端代码,这是啥都敢说,吹牛不上税。 我来给你几张贝格前端工场日常接的大数据项目相关的图,你让AI生成代码,取代前…

WordPress安装插件失败No working transports found

1. 背景(Situation) WordPress 社区有非常多的主题和插件,大部分人用 WordPress 都是为了这些免费好用的主题和插件。但是今天安装完 WordPress 后安装插件时出现了错误提示:“ 安装失败:下载失败。 No working trans…

WPF之打印与预览

目录 1,打印设置与管理。 1.1,引入程序集: 1.2,主要管理类介绍: 1.3,应用: 1.4,效果。 1.5,Demo链接。 2,打印。 2.1,主要参与打印的类与…

【C++】<知识点> 标准和文件的输入输出

目录 一、输入输出操作 1. 相关的类 2. 标准流对象 3. istream类的成员函数 二、流操纵算子 1. 整数流的基数 2. 浮点数精度的流操纵算子 3. 域宽的流操纵算子 4. 其他的流操纵算子 5. 用户自定义流操纵算子 三、文件读写 1. 文本文件的读写 2. 二进制文件的读写 3. 文件读写…

港湾周评|京东图书遭抵制不赢不输

《港湾商业观察》李镭 临近618前夕,数十家出版社抵制京东的消息引发全民关注。一定程上,本就生意冷门或不太赚钱的图书市场,随着这次群起抵制行动,更像是一场行业的反击。 不过,平台有平台的销售策略,毕竟…

给uniapp的扩展组件uni-file-picker设置默认显示的图片

官方给出的代码如下所示&#xff0c;但是按照官网给出的代码图片并没有显示出来。 <template><uni-file-picker readonly :value"fileLists" :imageStyles"imageStyles" file-mediatype"image"></uni-file-picker> </temp…

C#基础一

使用Visual Studio 2022&#xff08;VS2022&#xff09;编写C#控制台程序 1. 安装Visual Studio 2022 确保已安装Visual Studio 2022。如果未安装&#xff0c;请从Visual Studio官网下载并安装。 另一篇文章中已经有详细描述&#xff0c;这里就不在细说了。 VisualStudio2022…

文件自动同步备份-FreeFileSync工具解决硬盘损坏、误操作覆盖导致数据丢失

文件自动同步备份-FreeFileSync工具解决硬盘损坏、误操作覆盖导致数据丢失 文章目录 文件自动同步备份-FreeFileSync工具解决硬盘损坏、误操作覆盖导致数据丢失前言一、FreeFileSync二、使用方法1.用外部存储卡或盘作为异地备份目标盘2.设置同步策略3.设置为windows的自动计划 …

CentOS上升级glibc2.17至glibc2.31

glibc是Linux系统中的重要组件之一。在CentOS中&#xff0c;glibc通常是作为系统的默认C标准库使用的&#xff0c;因为它是许多软件的基础库。在CentOS中&#xff0c;glibc的版本通常与CentOS版本一起发布。因为CentOS通常会优先选择稳定性而不是最新性&#xff0c;所以CentOS使…

前端 CSS 经典:图片边框

前言&#xff1a;有这么一个业务&#xff0c;需要边框随着图片宽度的变化而变化&#xff0c;比如一些聊天的气泡框等。 实现原理&#xff1a;使用 border-image 属性 效果图&#xff1a; 实现代码&#xff1a; <!DOCTYPE html> <html lang"en"><he…

java抽象类,接口,枚举练习题

第一题&#xff1a; 答案&#xff1a; class Animal{//成员变量protected String name;protected int weight;//构造方法public Animal(){this.name"refer";this.weight50;}public Animal(String name,int weight){this.namename;this.weightweight;}//成员方法publ…

基于Android Studio记事本系统

目录 项目介绍 图片展示 运行环境 获取方式 项目介绍 具有登录&#xff0c;注册&#xff0c;记住密码&#xff0c;自动登录的功能&#xff1b; 可以新增记事本&#xff0c;编辑&#xff0c;删除记事本信息&#xff0c;同时可以设置主标题&#xff0c;内容&#xff0c;以及…

【网络】为什么udp协议报头有长度字段,而tcp没有

引言&#xff1a; 在网络通信中&#xff0c;UDP&#xff08;用户数据报协议&#xff09;和TCP&#xff08;传输控制协议&#xff09;是两种常用的传输层协议。它们在设计和功能上有一些不同之处&#xff0c;其中之一就是报头中的长度字段。本文将深入探讨UDP和TCP协议中长度字…

LLM——探索大语言模型在心理学方面的应用研究

1. 概述 心理学经历了多次理论变革&#xff0c;目前人工智能&#xff08;AI&#xff09;和机器学习&#xff0c;特别是大型语言模型&#xff08;LLMs&#xff09;的使用&#xff0c;预示着新研究方向的开启。本文详细探讨了像ChatGPT这样的LLMs如何转变心理学研究。它讨论了LL…

LangChain笔记

很好的LLM知识博客&#xff1a; https://lilianweng.github.io/posts/2023-06-23-agent/ LangChain的prompt hub: https://smith.langchain.com/hub 一. Q&A 1. Q&A os.environ["OPENAI_API_KEY"] “OpenAI的KEY” # 把openai-key放到环境变量里&…