代码编织梦想

Redis数据类型

Redis 为了存储不同类型的数据,提供了五种常用数据类型

  • string(字符串)
  • hash(哈希散列)
  • list(列表)
  • set(集合)
  • zset(sorted set:有序集合)

注意此处的数据类型指的是Value(值) 的数据类型,而非 key。

String类型

  • 字符串是Redis里最基本的数据类型,Redis 使用标准 C 语言编写,在存储字符时,Redis 并未使用 C 语言的字符类型,而是自定义了一个属于特殊结构 SDS(Simple Dynamic String)即简单动态字符串)
  • SDS是一个可以修改的内部结构,非常类似于 Java 的 ArrayList。
  • SDS 的结构定义如下:
    在这里插入图片描述
    string 采用了预先分配冗余空间的方式来减少内存的频繁分配,如下图所示:
    在这里插入图片描述
  • Redis 每次给 string 分配的空间都要大于字符串实际占用的空间,这样就在一定程度上提升了 Redis string 存储的效率,比如当字符串长度变大时,无需再重新申请内存空间。
  • 当字符串所占空间小于 1MB 时,Redis 对字符串存储空间的扩容是以成倍的方式增加的;而当所占空间超过 1MB 时,每次扩容只增加 1MB。Redis 字符串允许的最大值字节数是 512 MB。
  • 字符串是Redis里最基本的数据类型。
  • 可以使用set命令设置字符串类型数据,具体语法如下:
    在这里插入图片描述
  • key和value分别表示待设置字符串的键和值,如果对应的key里已经有值,那么再次执行set命令时会进行覆盖
  • 通过EX和PX参数可以指定该变量的生存时间,在大多数场景里,应该合理设置对应的生存时间,否则可能会导致内存溢出的问题。
  • NX参数表示当key不存在时才进行设置值的操作,如果key存在,那么该命令不执行;XX参数表示当key存在时才进行操作。
  • KEEPTTL是Redis 6.0的新特性,是指“保留生存时间”,既重复set时,保留旧值的过期时间。

示例:
在这里插入图片描述
在这里插入图片描述

设置获取单个字符串

示例:
在这里插入图片描述
在这里插入图片描述

设置获取多个字符串

  • mset和mget命令分别能同时设置和获取多个字符串。其中,mset命令的语法如下:
    在这里插入图片描述

  • mget命令的语法如下:
    在这里插入图片描述

  • mset和mget命令不包含NX、XX、PX和EX等参数

示例:
在这里插入图片描述

对值进行增量和减量操作

  • 通过incr key命令能对key所对应的数字类型值进行加1操作,如果k不存在,默认在0的基础上+1
  • 通过decr key命令能对key所对应的值进行减1操作,如果k不存在,默认在0的基础上-1
  • 通过incrby key increment命令能对key对应的值进行加increment的操作
  • 通过decrby by decrement命令能对key对应的值进行减decrement的操作。
  • 运行上述命令时,需要确保key对应的值是数字类型,否则会报错。
  • 在实际项目里,上述命令一般会用在统计流量和控制并发的场景中

示例:
在这里插入图片描述
在这里插入图片描述

Hash类型

  • Redis hash(哈希散列)是由字符类型的 field(字段)和 value 组成的哈希映射表结构(也称散列表)
  • hash 类型中,field 与 value 一一对应,且不允许重复。
  • Redis hash 特别适合于存储对象。一个 filed/value 可以看做是表格中一条数据记录;而一个 key 可以对应多条数据。
  • 当 hash 类型移除最后一个元素后,该存储结构就会被自动删除,其占用内存也会被系统回收
    在这里插入图片描述

实现方式

Hash类型底层存储结构有两种实现方式
第一种,当存储的数据量较少的时,hash 采用 ziplist 作为底层存储结构,此时要求符合以下两个条件:

  • 哈希对象保存的所有键值对(键和值)的字符串长度总和小于 64 个字节。
  • 哈希对象保存的键值对数量要小于 512 个。

当无法满足上述条件时,hash 就会采用第二种方式来存储数据

  • 也就是 **dict(字典结构)**该结构类似于 Java 的 HashMap,是一个无序的字典,并采用了数组和链表相结合的方式存储数据。
    在 Redis 中,dict 是基于哈希表算法实现的,因此其查找性能非常高效,其时间复杂度为 O(1)。

哈希表

  • 哈希表又称散列表,其初衷是将数据映射到数组中的某个位置上,这样就能够通过数组下标来访问该数据,从而提高数据的查找效率。

  • 现在有 1/5/8/ 三个数字,你需要把这三个数字映射到数组中,由于哈希表规定必须使用下标来访问数据,因此你需要构建一个 0 到 8 的数组
    在这里插入图片描述

  • 我们把待查找的数字,在相应的下标数组上标记出来,它们之间一一对应。虽然这样做能实现元素的查找,但却很浪费存储空间,并且查找效率也不高。

  • 如果采用哈希表的话,我们只需要申请一个长度为 3 的数组(与待查找的元素个数相同),如下图所示:
    在这里插入图片描述

  • 将 1/5/8 分别对数组长度 3 做取模运算,然后把它们指向运算结果对应的数组槽位,这样就把一组离散的数据映射到了连续的空间中,从而在最大限度上提高了空间的利用率,并且也提高了元素的查找效率。

  • 但可能会出现一个问题,数字 5、8 映射到同一个槽位上,这样就导致其中一个数字无法查找到。上述这种情况在实际中也会遇到,我们把它称为“哈希冲突”或者“哈希碰撞”。

  • 有许多方法可以解决“哈希冲突”,比如开放地址法、链表地址法,再次散列法等,而 Redis 采用是链表地址法。

  • 将有冲突的数据使用链表把它们串联起来,这样即使发生了冲突,也可以将数据存储在一起,最后,通过遍历链表的方式就找到上述发生“冲突”的数据。如下所示:
    在这里插入图片描述

  • 如果值是字符串的话,就需要通过哈希函数将字符串转换成具体的数值,然后再对其进行映射。

设置与获取

示例:
在这里插入图片描述在这里插入图片描述

hsetnx命令

在这里插入图片描述
在这里插入图片描述

针对key相关的操作

在这里插入图片描述

hexists命令

在这里插入图片描述

删除命令

在这里插入图片描述

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_43752912/article/details/126917886

Redis基本数据类型之List-爱代码爱编程

List List是Redis的另一种基本数据类型,Redis中的List是以双向链表形式存在的,key持有对链表头元素和尾元素的索引。向双向链表的头部或尾部添加数据的时间复杂度是常数级别的。 基本命令 1.向列表中添加元素 既然list是双向链表,那就必然支持从两端向list中添加元素。对应的命令分别为: lpush key value [val

Redis基本数据类型及适用场景-爱代码爱编程

String(字符串) 简单的key/value方式,任何类型都可以转换成string进行存储。 常用命令 命令含义set key vaue设置属性值get key获取属性值exists key判断某个key是否存在expire key second设置key的失效时间ttl key查看key还有多久失效del key删除指定key适用场景 可以用

redis五种基本数据类型-爱代码爱编程

文章目录 1.String 字符串类型2.Hash (哈希)3.链表4.Set 集合5.zset 有序集合 对redis来说,所有的key(键)都是字符串。 1.String 字符串类型 是redis中最基本的数据类型,一个key对应一个value。 String类型是二进制安全的,意思是 redis 的 string 可以包含任何数据。

Redis常用数据类型及其对应的底层数据结构-爱代码爱编程

Redis数据库 Redis是一种键值(Key-Value)数据库。相较于MySQL之类的关系型数据库,Redis是一种非关系型数据库。Redis存储的数据只包含键和值两部分,只能通过键来查询值。这样简单的存储结构,能让Redis的读写效率非常高(HashMap读写效率都是O(1))。 除此之外,Redis主要作为内存型数据库来使用。也即是说,Redi

redis 基本数据类型适用场景及数据结构-爱代码爱编程

  redisObject         redis对象由redisObject统一管理,可以理解为redisObject是redis对象的父类,目前版本redisObject代码如下 #define LRU_BITS 24 typedef struct redisObject { unsigned type:4; /* redis数据类型

Redis五大基本数据类型-爱代码爱编程

目录 1.字符串 2.列表List 3.集合Set 4.哈希Hash 5.Zset 1.字符串 String是Redis最基本的类型,是二进制安全的,意味着Redis的string可以包含任何数据,比如jpg图片。 一个redis中字符串value最大是512M 常用命令 set <key><value>

Redis 的五种基本数据类型-爱代码爱编程

一、String 类型 1.1 介绍 String 类型,也就是字符串类型,是 Redis 中最简单的存储类型。其 value 是字符串,不过根据字符串的格式不同,又可以分为 3 类: string:普通字符串int:整数类型,可以做自增、自减操作float:浮点类型,可以做自增、自减操作不管是哪种格式,底层都是字节数组形式存储,只不过是编码方式不同

Redis基本数据类型与使用场景-爱代码爱编程

redis主要有五种数据类型,分别是String、Hash、List、Set、ZSet. 1:String: 单值存储:set [key] [value] 取值:get [key] 多值存储:mset [key1] [value] [key2] [value] 取值:mget [key1] [key2] 2:Hash: 存储数据:hset [tabl

Redis基本数据类型以及缓存击穿、缓存穿透、缓存雪崩-爱代码爱编程

1. 什么是Redis?它主要用来什么的? Redis,英文全称是Remote Dictionary Server(远程字典服务),是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。 与MySQL数据库不同的是,Redis的数据是存在内存中的。它的读写速度非常快,每秒可以处理

Redis五种基本数据类型-爱代码爱编程

五种基本数据类型 redis无论什么数据类型,在数据库中都是以key-value形式保存,并且所有的key(键)都是字符串,所以讨论基础数据结构都是讨论的value值的数据类型 主要包括常见的5种数据类型,分别是:String、List、Set、Zset、Hash。 结构类型结构存储的值结构的读写能力String字符串可以是字符串、整数或浮

Redis五种基本数据类型底层详解(原理篇)-爱代码爱编程

Redis五种基本数据类型底层详解 详细介绍Redis用到的数据结构简单动态字符串SDS和C字符串的区别总结链表字典哈希表字典哈希算法解决键冲突rehash(重点)渐进式rehash跳跃表 详细介绍Redis用到的数据结构 各位,稍安勿躁,讲解五种基本数据类型前,我们先来这些数据类型用到的数据结构,防止后面懵逼,本文所用源码来源:Red

redis五种基本数据类型(超级详细)_前进的superman的博客-爱代码爱编程

目录 前言 一、String类型常见命令 二、Hash类型的常见命令 三、List类型的常见命令 四、Set类型常见命令 五、SortedSet类型常见命令 前言 提示:Redis五种基本数据类型(超级详细) 提示:以下是本篇文章正文内容,下面案例可供参考 一、String类型常见命令 set 添加或者修改已经存在的一个Strin