首页 > 数据库 >【Redis入门到精通二】Redis核心数据类型(String,Hash)详解

【Redis入门到精通二】Redis核心数据类型(String,Hash)详解

时间:2024-09-20 22:24:47浏览次数:3  
标签:Hash Redis 复杂度 数据类型 value field key 字符串

目录

Redis数据类型

1.String类型

 (1)常见命令

(2)内部编码

2.Hash类型

(1)常见命令

(2)内部编码


Redis数据类型

        查阅Redis官方文档可知,Redis提供给用户的核心数据类型有以下九个,从上到下依次是字符串,哈希,列表,集合,有序集合,流,位图,位域,地址空间。因为Redis本身就是通过键值对的方式存储数据,这些数据类型都存在于Redis的value中 ,不同的数据类型,所需要的插入命令也不相同。下面我将依据官方文档对这九种数据类型依次进行介绍,本篇文章将着重对String,Hash两种数据类型进行介绍。

1.String类型

       字符串类型是 Redis 最基础的数据类型,关于字符串需要特别注意:
  • ⾸先 Redis 中所有的键的类型都是字符串类型,⽽且其他⼏种数据结构也都是在字符串类似基础上构建的,例如列表和集合的元素类型是字符串类型。
  • 其次,字符串类型的值实际可以是字符串,包含⼀般格式的字符串或者类似 JSON、XML 格式的字符串;数字,可以是整型或者浮点型;甚⾄是⼆进制流数据,例如图⽚、⾳频、视频等。不过⼀个字符串的最⼤值不能超过 512 MB。

tips:

由于 Redis 内部存储字符串完全是按照⼆进制流的形式保存的,所以 Redis 是不处理字符集 编码问题的,客⼾端传⼊的命令中使⽤的是什么字符集编码,就存储什么字符集编码。处理中文乱码问题可以在启动Redis客户端时加上一个 --raw命令就可以使redis客户端自动把二进制的数据尝试翻译。

 (1)常见命令

Redis操作字符串类型常见的有以下命令set,get,mget,mset,setnx,setxx,incr,incrby,decr,decrby,incrbyfloat,append,getrange,setrange,strlen。下面将按顺序依次介绍用法。

SET key value [expiration EX seconds|PX milliseconds] [NX|XX]

 时间复杂度O(1),set命令可添加的选项:

  • EX seconds⸺使⽤秒作为单位设置 key 的过期时间。
  • PX milliseconds⸺使⽤毫秒作为单位设置 key 的过期时间。
  • NX ⸺只在 key 不存在时才进⾏设置,即如果 key 之前已经存在,设置不执⾏。
  • XX ⸺只在 key 存在时才进⾏设置,即如果 key 之前不存在,设置不执⾏。
get key

时间复杂度O(1),get命令返回key对应的value(value只能是字符串类型),key不存在时返回nil 。

MGET key [key ...]

时间复杂度O(N), mget命令用于一次查询多个key值,因为Redis是客户端-服务器结构,每条命令都需要经过网络传递到服务器执行,把多条命令结合在一次执行能很大程度减少因为网络传递消耗的时间。

MSET key value [key value ...]

时间复杂度O(N),mset的设计初衷与mget相似。

INCR key

时间复杂度O(1),incr返回 key的值加一。

INCRBY key decrement

 时间复杂度O(1),incrby返回key的值加decrement。

DECR key

时间复杂度O(1),decr返回 key的值减一。 

DECRBY key decrement

  时间复杂度O(1),decrby返回key的值减decrement。

INCRBYFLOAT key increment

 时间复杂度O(1),incrbyfloat返回key的值加decrement。(可以是浮点数类型)

APPEND KEY VALUE

 时间复杂度O(1),append把value 追加到原有 string 的后边。

GETRANGE key start end

 时间复杂度O(N),getrange类似于切片,返回key对应string的子串,左右区间均为闭区间,可以用负数表示从后往前数。

SETRANGE key offset value

 时间复杂度O(N),setrange命令从offset位置开始用value覆盖原字符串后面的内容。

STRLEN key

 时间复杂度O(1),strlen用于返回字符串的长度。

(2)内部编码

Redis的字符串类型在内存中存储时有三种编码方式,分别是int,embstr和raw三种类型,Redis会根据当前值的类型和长度动态决定使用哪种内部编码实现,可以通过object encoding key 命令来查看编码方式。

  • int:8 个字节的⻓整型。
  • embstr:⼩于等于 39 个字节的字符串。
  • raw:⼤于 39 个字节的字符串。

2.Hash类型

Redis本身就是依据键值对进行数据存储的,所谓哈希类型指的是在Redis的值当中又存在多个键值对结构。形如 key = "key",value = { { field1, value1 }, ..., {fieldN, valueN } }。

(1)常见命令

hash类型的常见命令有hset,hget,hexists,hdel,hkeys,hvals,hgetall,hmget,hlen,hsetnx,hincrby,hincrbyfloat,hstrlen。下面将按顺序依次介绍用法。

HSET key field value [field value ...]

 时间复杂度为O(N), hset命令负责插入N组键值对,返回添加字段个数。

HGET key field

 时间复杂度为O(1),  hget命令返回字段对应的值或者nil。

HEXISTS key field

 时间复杂度为O(1), hexists负责判断字段是否存在。

HDEL key field [field ...]

 时间复杂度为O(N), hdel命令用来删除指定字段。

HKEYS key

 时间复杂度为O(N), hkeys用来获取hash中的所有字段。

HVALS key

 时间复杂度为O(N), hvals用来获取hash中所有的值。

HGETALL key

 时间复杂度为O(N), hgetall用来获取hash中所有字段以及对应的值。

HMGET key field [field ...]

 时间复杂度为O(N), hmget用于一次性获取多个字段的值。

HLEN key

 时间复杂度为O(1), hlen用于获取hash中的所有字段的个数。

HSETNX key field value

  时间复杂度为O(1),hsetnx在字段不存在的情况下,设置hash中的字段和值。

HINCRBY key field increment

 时间复杂度为O(1), hincrby将hash中字段对应的数值添加指定的值。

HINCRBYFLOAT key field increment

 时间复杂度为O(1), hincrbyfloat与hincrby相似不过添加的值为浮点数。

HSTRLEN key field

 时间复杂度为O(1),hstrlen命令用于计算value的字符串的长度。

(2)内部编码

hash类型在内存中的编码方式有两种,分别是ziplist和hashtable类型。Redis会根据当前值的类型和长度动态决定使用哪种内部编码实现,可以通过object encoding key 命令来查看编码方式。

  •      ziplist(压缩列表):当哈希类型元素个数⼩于 hash-max-ziplist-entries 配置(默认 512 个)、 同时所有值都⼩于 hash-max-ziplist-value 配置(默认 64 字节)时,Redis 会使⽤ ziplist 作为哈希的内部实现,ziplist 使⽤更加紧凑的结构实现多个元素的连续存储,所以在节省内存⽅⾯⽐hashtable 更加优秀。
  • hashtable(哈希表):当哈希类型⽆法满⾜ ziplist 的条件时,Redis 会使⽤ hashtable 作为哈希 的内部实现,因为此时 ziplist 的读写效率会下降,⽽ hashtable 的读写时间复杂度为 O(1)。

❤️

标签:Hash,Redis,复杂度,数据类型,value,field,key,字符串
From: https://blog.csdn.net/2203_75565612/article/details/142220420

相关文章

  • 【数据类型】映射map
    小明正在备考英语四级考试,但他的词典太厚了,他记不住哪个单词在哪里。于是他准备开发一个可以直接找某单词在某页的应用。但是,他不会做,整天十分烦恼。好啦,进入正题,大家好,我是@学霸小羊,今天来讲讲map——映射map翻译为映射,是STL中的常用容器。其实,数组就是一种映射,比如:int......
  • SQL Server 数据类型转换详解
    在SQLServer中,数据类型转换是数据库开发中非常常见的任务。数据类型转换是指将一种数据类型的数据转换为另一种数据类型。SQLServer支持两种类型的转换方式:隐式转换和显式转换。本文将详细介绍SQLServer中数据类型转换的原理、使用方法、常见场景,并通过具体的例子进行解释和演示......
  • Redis哨兵机制sentinel集群配置
    一、安装redis1主2从集群略二、复制sentinel.conf文件到指定目录修改sentinel.conf配置port26379dir"/tmp"logfile"/usr/local/redis/logs/sentinel-26379.log"daemonizeyessentinelmonitormymaster10.211.55.763792sentinelauth-passmymasterlinlinsen......
  • redis主从配置启动(1主2从)
    一、安装redis略二、主节点配置文件daemonizeyespidfile/usr/local/redis/logs/redis_6379.pidport6379tcp-backlog1024bind0.0.0.0timeout0tcp-keepalive60loglevelnoticelogfile"/usr/local/redis/logs/redis_6379.log"databases16save""sav......
  • Docker Compose 搭建 Redis 主从复制
    服务器状态IP PORTROLE192.168.142.1576379master192.168.142.1566390slave192.168.142.1556391slave02masterdocker-compose.ymlservices:redis-master:image:hub.atomgit.com/amd64/redis:7.0.13restart:alwayscontainer_name:redis-masterpr......
  • 数据类型自动转换的解决方案
    数据类型自动转换的解决方案java8、jdk8背景为方便测试框架数据处理以及方便查看一些数据,弄了一个工具类,部分要点简要说明。主要涉及到字符串与其他类型的相互转换,无其他类型之间的相互转换。轻量测试框架实现与使用的总篇可见此文。问题分析字符串转换为对象的方法......
  • Redis实现站内信
    文章目录前言一、pandas是什么?二、使用步骤1.引入库2.读入数据总结前言 站内信使用场景广泛:社交媒体:用户间私信、关注通知、好友请求等。在线学习:教师与学生沟通、课程提醒、成绩反馈等。电商平台:订单状态更新、促销信息、客户咨询回复等。企业管理:内部通知、员工......
  • 兼收并蓄 TypeScript - 基础: 数据类型
    源码https://github.com/webabcd/TypeScriptDemo作者webabcd兼收并蓄TypeScript-基础:数据类型示例如下:basic\dataType.ts{//基本数据类型boolean,number,string,symbolleta:boolean=true;letb:number=10;letc:string="abc";......
  • 深入理解ConcurrentHashMap
    HashMap为什么线程不安全put的不安全由于多线程对HashMap进行put操作,调用了HashMap的putVal(),具体原因:假设两个线程A、B都在进行put操作,并且hash函数计算出的插入下标是相同的;当线程A执行完第六行由于时间片耗尽导致被挂起,而线程B得到时间片后在该下标处插入了元素,完成了正......
  • 从单机到分布式:Redis 如何重塑数据存储格局
    一、引言随着大数据时代的到来,传统数据存储系统难以满足日益增长的性能和扩展性需求。Redis,作为新一代高性能内存数据结构存储系统,应运而生并迅速崛起。它不仅提供了卓越的读写速度和丰富的数据结构支持,还具备出色的可扩展性和灵活性,广泛应用于缓存、消息队列、实时数据分析等领域......