当前位置: 首页 > news >正文

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

目录

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)。

❤️😍😍😍😍😍😍😍😍😍😍😍😍😍😍😍😍😍

🍔我是小皮侠,谢谢大家都能看到这里!!

🦚主页已更新Java基础内容,数据结构基础,数据库,算法

🚕未来会更新Java项目,SpringBoot,Redis以及各种Java路线会用到的技术。

🎃求点赞!求收藏!求评论!求关注!

🤷‍♀️谢谢大家!!!!!!!!

http://www.lryc.cn/news/447591.html

相关文章:

  • 如何快速免费搭建自己的Docker私有镜像源来解决Docker无法拉取镜像的问题(搭建私有镜像源解决群晖Docker获取注册表失败的问题)
  • QT 获取视频帧Opencv获取清晰度
  • 生成式AI如何辅助医药行业智能营销
  • 演示:基于WPF的DrawingVisual开发的Chart图表和表格绘制
  • 汽车保养BBBBBBBBBBB
  • H3C R4900 G3服务器上配置本地磁盘RAID
  • HBase DDL操作代码汇总(namespace+table CRUD操作)
  • 关于TCP的基础知识
  • MyBatis 中的类型别名配置详解
  • 如何提高UI自动化的稳定性
  • ubuntu如何开启和关闭图形界面
  • 从博客到ICT社区:深化学习与交流的桥梁
  • 基于python+django+vue的旅游景点数据分析系统
  • C++简单缓冲区类设计
  • MySQL 数据库
  • 基于单片机的智能校园照明系统
  • 高性能分布式搜索引擎Elasticsearch详解
  • 连锁收银系统的五大功能 选择开源收银系统三要素
  • 虚幻引擎解决构建问题
  • C++基础知识:C++中读文件的四种简单方式
  • 【人工智能】多模态AI:如何通过融合文本、图像与音频重塑智能系统未来
  • 通过重写QStyle控制QT控件样式
  • WPF入门教学十八 动画入门
  • 电信光猫破解记录
  • 鸿蒙界面开发(九):列表布局 (List)
  • 微服务远程调用(nacos及OpenFeign简单使用)
  • Protobuf vs Thrift: 高性能序列化框架的对比与分析
  • LeetCode Hot100 C++ 哈希 1.两数之和
  • Windows下安装Neo4j流程
  • Spring IDEA 2024 自动生成get和set以及toString方法