Redis数据结构及命令详解

news2024/11/24 16:06:11

个人博客地址:
http://xiaohe-blog.top/

文章目录

  • 0. 简述
  • 1. 通用命令
    • 1.1 keys
    • 1.2 del
    • 1.3 type
    • 1.4 exists
    • 1.5 expire
    • 1.6 ttl
  • 2. string 类型
    • 2.1 set
    • 2.2 get
    • 2.3 mset
    • 2.4 mget
    • 2.5 setnx
    • 2.6 setex
    • 2.4 incr
    • 2.5 incrby
    • 2.6 incrbyfloat
  • 3. hash 类型
    • 3.1 hset
    • 3.2 hget
    • 3.3 hmset
    • 3.4 hmget
    • 3.5 hgetall
    • 3.6 hkeys
    • 3.7 hvals
    • 3.8 hincrby
  • 4. list 类型
    • 4.1 lpush
    • 4.2 lpop
    • 4.3 rpush
    • 4.4 rpop
    • 4.5 lrange
  • 5. set 类型
    • 5.1 sadd
    • 5.2 smembers
    • 5.3 srem
    • 5.4 scard
    • 5.5 sismember
  • 6. sortedset 类型
    • 6.1 zadd
    • 6.2 zrem
    • 6.3 zscrore
    • 6.4 zrank
    • 6.5 zcard
    • 6.6 zcount
    • 6.7 zrange

0. 简述

Redis有五种简单的数据类型,他们各自有各自的编码方式。

简单数据结构名字
string字符串
hash哈希
list列表
set无序集合
zset有序集合

1. 通用命令

1.1 keys

keys [pattern]

查看当前数据库的所有匹配模板[pattern]的键。

# 查看所有键,数据量高时不建议使用
keys *

# 查看以 name 结尾的键
keys *name

# 查看有 name 的键
keys *name*

1.2 del

del key

删除指定名字的键,可以指定多个名字。

如果没有这个值就不删,返回值为影响行数

# 删除名字是 name 的键
del name
# 删除名字是 name age password 的键
del name age password

1.3 type

获取一个key 的类型

type [key]

# 获取name的类型
type name
--> string

1.4 exists

exists key

判断一个键是否存在,可以一次性判断多个

返回值为存在的个数

# 判断 name 是否存在
exists name
# 判断 name age password 是否存在
exists name age password

1.5 expire

expire key seconds

给键设置有效期。

如果不存在,返回0

不能一次性设置多个

# 将 name 的有效期设置为60秒(name已存在)
expire name 60

1.6 ttl

ttl key

查看键的有效期。

正值:该键的有效期。

-1 :该键的有效期为永久。

-2 :该键不存在。

# 查看name的有效期
ttl name

2. string 类型

string 是最基本的key-value结构,key是唯一标识,value是内容。

虽说是字符串,但redis又将它细分为字符串、数字。

  • string:普通字符串。
  • int :整数,可以做自增、自减操作。
  • float :浮点数,可以做自增、自减操作。
key类型value
messagestring“hello redis~~”
ageint“18”
moneyfloat“12.1”

不管是哪种类型,底层都是字节数组形式存储,只不过编码方式不同,字符串类型的最大空间不能超过512M。

Redis构建了一种结构体来完成存储字符串的功能:简单动态字符串Simple Dynamic String),简称SDS。

struct __attribute__ ((__packed__)) sdshdr8{
    //字节数组,用于存储string/int/float
    char buf[];
     
    //记录buf数组申请的总字节数,类型为:8位无符号整型。
    // 不包括结束标志
    uint8_t alloc;
    
    //记录buf数组中已经使用的字节的数量,类型为:8位无符号整型。
    // 不包括结束标志
    uint8_t len;

    // 此字段记录SDS的空间大小
    // 因为存储空间不同,SDS类型也不同,有很多不同类型的SDS
    unsigned char flags;
};

之所以被称为动态字符串,因为这个字符串有扩容机制:

  • 扩容后的空间小于1M :扩容后的空间大小乘以2+1
  • 扩容后的空间大于1M :空间直接+1M+1
# 扩容方案:
ni -> nihao
# 原空间: 
    len=2
    alloc=2
# 扩容后:
    len=5
    alloc=10
# 为什么没有加一?
    因为字符串后面有 '\0', 而这len和alloc两个字段都不计算结束标志。

但是alloc的类型是8位无符号整型,只能存储2^8数量级的char,太有限,所以Redis提供了不同类型的SDS,它们的其他特性都相同,只有alloc、len的类型不同,有5位、8位、16位、32位。

如何区分?使用 flag 这个字段。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-K4RJkaK2-1671076295061)(https://typorehwf.oss-cn-chengdu.aliyuncs.com/image-20221212203840905.png)]

2.1 set

set [key] [value]

添加一个string类型的键值对.

如果已有,则覆盖。

# 给 name 赋值 "小明"
# 加不加引号无所谓
set name xioaming
set name "xiaoming"

2.2 get

get [key]

获取键值对的值

# 获取 name 的值
get name

2.3 mset

mset [key value] [key value]...

批量新增键值对

# 新增name为xiaoming, age为19
mset name "xiaoming" age "19"

2.4 mget

mget [key]...

批量获取键值对的值

# 获取name age money 的值
mget name age money

2.5 setnx

setnx key value

set if not exists ,如果不存在,就新增;如果已存在就不新增。

# 如果不存在name,则插入
setnx name xiaoming

2.6 setex

setex key seconds value

setex key value seconds

新增键值对的同时指定有效期。

# 新增name xiaoming,指定时间为20s
setex name 20 "xiaoming"
setex name "xiaoming" 20

2.4 incr

incr key

使 int 类型的数自增一,返回值自增后的值.

不能用到string、float上。

# 让age自增1
incr age

2.5 incrby

incrby key number

指定int类型增长的步数。

# 让age自增3
incrby age 3

2.6 incrbyfloat

incrbyfloat key number

指定float类型增长的步数。

# 将money增长1.1
incrbyfloat money 1.1

3. hash 类型

Hash类型,也叫散列,其value是一个无需字典,类似于Java中的HashMap结构。

Hash类型分为key、value。value又包含一个键和一个值。

通用命令只能作用于整个hash结构,不能作用于一个hash结构的具体的键

例如expire只能指定整个hash结构的有效期,不能指定具体哪个值的有效期

image-20220922104053358

3.1 hset

添加一个hash类型的值。

hset的key类型是hash,field和value类型都是string

hset key [field value]

# 添加一个user, name为xiaoming
hset user name "xiaoming"
# 给user 添加一个age:19
hset user age "19"
user:
{
    "name": "xiaoming",
    "age": "19"
}

3.2 hget

获取一个hash类型的值

hget key field

# 获取user下的name值
hget user name

3.3 hmset

添加一个key的多个值

hmset key [field value] [field value]...

# 设置user 的name、age
hmset user name "xiaoming" age "19"

3.4 hmget

获取一个key的多个值

hmget key field...

# 获取user的name age
hmget user name age

3.5 hgetall

获取一个key中的所有field和value。

hgetall key

# 获取user的所有键和值
hgetall user

#输出:
 1)  "name"
 2)  "xiaoming"
 3)  "age"
 4)  "19"

3.6 hkeys

获取一个key的所有field

hkeys key

# 获取user的所有field
hkeys user

3.7 hvals

获取一个key的所有value

hvals user

# 获取user的所有value
hvals user

3.8 hincrby

让一个key的field的值指定步数增长。

hincrby key field number

# 让user 的age增长2
hincrby user age 2

4. list 类型

Redis中的List类型与Java中的LinkedList类似,可以看作是一个双向链表结构,既支持正向检索也支持反向检索。

特征:

  • 有序
  • 元素可以重复

image-20220922131625849

链表节点:

typedef struct listNode{
    
    //前置节点
    struct listNode * prev;
 
    //后置节点
    struct listNode * next;
 
    //节点的值
    void * value;
};

链表:

typedef struct list{
    
    //表头节点
    listNode * head;
 
    //表尾节点
    listNode * tail;
 
    //链表所包含的节点数量
    unsigned long len;
 
    //节点值复制函数
    void *(*dup)(void * ptr);
 
    //节点值释放函数
    void *(*free)(void * ptr);
 
    //节点值对比函数
    int (*match)(void * ptr , void * key);
} list;

4.1 lpush

在列表左侧插入一个或多个数据

lpush key element...

# 向names这个列表左侧先后插入xiaoming xiaohong
lpush names xiaoming xiaohong
# 插入后names的值: xiaohong xiaoming

4.2 lpop

移除并返回指定列表最左侧的元素,没有则返回nil

lpop key

# 返回&移除names最左侧的值
lpop names
# xiaoming

4.3 rpush

在列表右侧插入一个或多个元素

rpush key element...

# 在names最右侧插入xiaoming xiaohong
rpush names xiaoming xiaohong

4.4 rpop

移除并返回列表最右侧的元素,没有则返回nil

rpop key

# 返回并移除names最右侧的元素
rpop names

4.5 lrange

返回一定范围的所有元素

lrange key [start end]

超出范围不会报错,有多少返回给你多少

如果想取出所有值,使用 0 -1

# 向numbers列表中存放1 2 3 4 5 6 
rpush numbers 1 2 3 4 5 6 
# 取出下标0-4的数:
lrange numbers 0 4
 1)  "1"
 2)  "2"
 3)  "3"
 4)  "4"
 5)  "5"
 # 取出numbers列表的所有值
 lrange numbers 0 -1
 1)  "1"
 2)  "2"
 3)  "3"
 4)  "4"
 5)  "5"
 6)  "6"

5. set 类型

redis的set结构与Java中的HashSet类似,可以看作是一个value为null的HashMap。

特征:

  • 无序
  • 元素不可重复
  • 支持交集、并集、差集

5.1 sadd

向字典中添加一个或多个元素。

sadd key [element...]

# 向names中插入xiaohe xiaohe xiaoming  
# 由于无法重复,所以返回值为2
sadd names xiaohe xiaohe xiaoming

5.2 smembers

随机返回字典中所有的元素

这里的“随机”不是每一次返回顺序都不同,是返回的顺序与你插入的顺序不同,但是只要你不插入,返回的顺序是一样的。

smembers key

# 返回names中的所有元素
smembers names

5.3 srem

从字典中删除指定的一个或多个元素,返回值为影响行数。

srem key [element...]

# 从names中删除xiaohe xiaoming xiaowang
srem xiaohe xiaoming xiaowang

5.4 scard

返回字典中元素的个数。

scard key

# 返回names中的元素个数
scard names

5.5 sismember

判断一个元素是否存在于set中。返回值为0或1。

sismenber key member

# 判断xiaowang是否在names中
sismember names xiaowang

6. sortedset 类型

有序字典。每一个元素都带有一个score属性,可以基于score属性对元素进行排序,底层实现是skiplist + hash。

特点:

  • 可排序
  • 元素不重复

6.1 zadd

添加一个或多个元素到有序字典集,如果已存在就更新score值

zadd key score value

# 添加一个100分的name,值为xiaoming
zadd name 100 xiaoming

6.2 zrem

删除有序字典集的指定元素。

zrem key value

# 删除key为name,value为xiaoming的值。
zrem name xiaoming

6.3 zscrore

获取指定元素的score值。

zscore key value

# 获取指定key&&指定value的score值
zscore name xiaoming

6.4 zrank

获取指定元素的排名(排序为从小到大,起始为0。故分数越小,排名数字越小)

zrank key value

# 获取xiaohe的排名
zadd name 100 xiaoming 
zadd name 90 xiaohong
zadd name 80 xiaohe 
排名为:
0) xiaohe
1) xiaohong
2) xiaoming

zrank name xiaohe
--> 0

6.5 zcard

获取有序字典的元素个数

zcard key

# 获取name的元素个数
zcard name

6.6 zcount

获取score值在指定范围内的元素个数

zcount key min max

# 获取name的score在50-100的元素个数
zcount name 50 100

6.7 zrange

按照score排序后,获取指定排名范围的元素

zrange key min max

# 按照score排序后,获取第1-3个。(倒数第二到倒数第四)
zrange name 1 3
image-20220922145532862

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

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

相关文章

互联网时代,云计算的6大特征

1 云计算的定义 云计算是目前业内的热点概念,它以开放的标准和服务为基础,以互联网为中心,提供安全、快速、便捷的数据存储和网络计算服务,让互联网这片“云”上的各种计算机共同组成数个庞大的数据中心及计算中心。它可以被看成…

Observability:我们该选 Beats 还是 Elastic Agents 来采集数据?

除了 Logstash 之外,Elastic 提供了两种主要的方式来向 Elasticsearch 发送数据: 我们可以选择直接把数据从 Beats 发送至 Elasticsearch。当然我们也可以通过 Logstash 更进一步处理再发送至 Elasticsearch。 另外一种方式是使用 Elastic Agents 来发送…

[附源码]Nodejs计算机毕业设计基于的二手车交易平台Express(程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程。欢迎交流 项目运行 环境配置: Node.js Vscode Mysql5.7 HBuilderXNavicat11VueExpress。 项目技术: Express框架 Node.js Vue 等等组成,B/S模式 Vscode管理前后端分…

[附源码]Python计算机毕业设计Django课室预约系统

项目运行 环境配置: Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术: django python Vue 等等组成,B/S模式 pychram管理等等。 环境需要 1.运行环境:最好是python3.7.7,…

Jmeter简单入门

背景 我们项目中一般测试接口都是用vscode中的REST Client插件(推荐好用)或者的话postman(适合写一些脚本和文件的上传) 但是他们都有一个不太行的功能,那就是多线程并发测试,其他市面上的什么apipost也都是不支持,网…

带你在Ubuntu 18.04上编译Linux内核

【推荐阅读】 一文了解Linux上TCP的几个内核参数调优 一文剖析Linux内核中内存管理 分析linux启动内核源码 一、环境说明 编译环境我选择了Ubuntu 18.04的虚拟机,内核截止2018-10-14最新版为4.18.14,笔者即将编译这个版本。 请确保磁盘空间足够&am…

Phoenix 对 Hbase 中表的映射

目录1)表的关系2)Hbase中创建表 test3)视图映射4)表映射数字类型说明1)表的关系 默认情况下, HBase 中已存在的表,通过 Phoenix 是不可见的。 如果要在 Phoenix 中操作 HBase 中已存在的表&…

java计算机毕业设计基于安卓Android的车位服务管理APP

项目介绍 网络的广泛应用给生活带来了十分的便利。所以把车位服务管理与现在网络相结合,利用java技术建设车位服务管理APP,实现车位服务管理的信息化。则对于进一步提高车位服务管理发展,丰富车位服务管理经验能起到不少的促进作用。 车位服务管理APP能够通过互联网得到广泛的、…

Python 爬虫库 urllib 使用详解!

一、Python urllib库 Python urllib 库用于操作网页 URL,并对网页的内容进行抓取处理。 Python3 的 urllib。 urllib 包 包含以下几个模块: urllib.request - 打开和读取 URL。 urllib.error - 包含 urllib.request 抛出的异常。 urllib.parse - 解析 …

自学了半个月python,感觉没用,怎么办?

本人从零基础开始学习python,已有两年之久,虽然一路上磕磕绊绊,但学习了一段时间之后,日常很多繁琐的工作,在python的助力下确实得到了很好的解决,工作效率也大大提高。 回到问题上来,自学了半…

Windows11如何通过附近共享发送文件,附近共享传输文件到电脑

Windows11如何通过附近共享发送文件?2018年,微软推出了名为Nearear Share(附近共享)的新功能。Near share是一种在PC之间传输文件的新方式,类似Airdrop的功能,只需要开启蓝牙和WiFi就能分享照片/影片/文件给…

[附源码]Python计算机毕业设计Django快转二手品牌包在线交易系统

项目运行 环境配置: Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术: django python Vue 等等组成,B/S模式 pychram管理等等。 环境需要 1.运行环境:最好是python3.7.7,…

Android OpenGL ES 学习(八) –矩阵变换

OpenGL 学习教程 Android OpenGL ES 学习(一) – 基本概念 Android OpenGL ES 学习(二) – 图形渲染管线和GLSL Android OpenGL ES 学习(三) – 绘制平面图形 Android OpenGL ES 学习(四) – 正交投影 Android OpenGL ES 学习(五) – 渐变色 Android OpenGL ES 学习(六) – 使用…

UML图讲解(关联关系,单向关联,双向关联,自关联,组合关系,依赖关系,继承关系,实现关系)

UML图讲解 简介:本文讲解UML图的各种情况下的含义。 简介 百度百科: UML-Unified Modeling Language统一建模语言,又称标准建模语言。是用来对软件密集系统进行可视化建模的一种语言。UML的定义包括UML语义和UML表示法两个元素。 UML是在开…

【实时数仓】动态分流的实现源码(反序列化器、配置表、广播流、业务流)

文章目录一 根据MySQL的配置表,动态进行分流1 自定义反序列化器(1)需求分析(2)代码实现2 从配置表中读取数据(1)自定义CDC采集的反序列化器(2)使用FlinkCDC读取配置表数据…

事务的隔离级别

目录 1.1 数据并发问题 1.2 SQL中的四种隔离级别 1.3 MySQL支持的四种隔离级别 1.4 如何设置事务的隔离级别 MySQL是一个 客户端/服务器 架构的软件,对于同一个服务器来说,可以有若干个客户端与之连接,每 个客户端与服务器连接…

简说四种架构的通用思维

一.自顶向下构建架构 ​1.首先定义问题,而定义问题中最重要的是定义客户的问题,特别主要识别出关键问题,关键问题是对客户有体感,能够解决客户痛点,通过一定的数据化来衡量识别出来,关键问题要优先给出解决…

我从“校园小白”到仿真“职场小达人”的CFD学习史

CFD属于CAE技术中比较难的一款软件,主要原因就是流体的特点决定了,因为相比于固体,流体太容易变形了,分子之间的距离比较大。所以,导致了一系列的问题。常常的结果是,忙了半天或者很长,根本得不…

Spring Security自定义认证逻辑实现图片验证码登录

前言 相信大家在网上冲浪都遇到过登录时输入图片验证码的情况,既然我们已经学习了 Spring Security,也上手实现过几个案例,那不妨来研究一下如何实现这一功能。 首先需要明确的是,登录时输入图片验证码,属于认证功能…

【录用案例】计算机电子类SCI,仅1个月15天录用

【期刊简介】IF:1.0-2.0,JCR4区,中科院4区 【检索情况】SCI在检,正刊 【征稿领域】自主传感器网络的高级接口电路及其应用 【参考周期】2-3个月左右 重要时间节点: 2022.12.15 | Accepted 2022.11.22 | 提交返修稿 20…