Redis数据类型(上篇)
前提:(key代表键)
| 命令 | 作用 |
|---|---|
| keys * | 查看当前库所有的key |
| exists key | 判断某个key是否存在 |
| type key | 查看key是什么类型 |
| del key | 删除指定的key |
| unlink key | 非阻塞删除,仅仅将keys从keyspace元数据中删除,真正的删除会在后续异步中操作。 |
| ttl key | 查看还有多少秒过期,-1表示永不过期,-2表示已过期 |
| expire key 秒钟 | 为给定的key设置过期时间 |
| move key dbindex[0-15] | 将当前数据库的key移动到给定的数据库db中 |
| select dbindex[0-15] | 切换数据库【0-15】,默认为0 |
| dbsize | 查看当前数据库key的数量 |
| flushdb | 清空当前库(慎用) |
| flushall | 通杀全部库(慎用) |
两个删除操作的区别:(unlink key 和 del key)
del key:是同步操作,执行时会立即阻塞当前线程,直到键被删除完成。
unlink key:是异步操作,它发起删除请求后不会阻塞线程,而是让删除操作在后台进行,不会立即返回键是否已成功删除。这样在处理大量键删除时,可以避免阻塞导致性能下降。
1.Redis字符串(String)
string是redis最基本的类型,一个key对应一个value,一个redis中字符串value最多可以是512M
string类型是二进制安全的,意思是redis的string可以包含任何数据,比如jpg图片或者序列化的对象 。
(1)设置键值对:
set key value [NX|XX] [GET] [EX seconds|PX milliseconds|EXAT unix-time-seconds|PXAT unix-time-milliseconds|KEEPTTL]
NX:不存在时创建
XX:存在时创建(会覆盖前面的值,相当于修改k的值)
(2)keepttl作用:修改一个k的值会将原来的过期时间覆盖(值变了,但是过期时间也变了),keepttl可以保留原来的过期时间(只改变值,但是过期时间不变)
例:keepttl的使用
127.0.0.1:6379> set k1 v1 ex 30 设置k1过期时间为30s
OK
127.0.0.1:6379> set k1 v1kppl keepttl 修改k1的值,后面使用keepttl
OK
127.0.0.1:6379> ttl k1 获取k1过期时间
(integer) 8
127.0.0.1:6379> get k1
"v1kppl"
(3)在Java代码中获取当前Unix时间:
System.out.println(Long.toString(System.currentTimeMillis()/1000L));
(4)同时设置获取多个值:(mset)
使用:
127.0.0.1:6379> mset k1 v1 k2 v2
OK
127.0.0.1:6379> keys *
1) "k2"
2) "k1"
127.0.0.1:6379> msetnx k2 v2 k3 v3 ----------(失败)
(integer) 0
127.0.0.1:6379> keys *
1) "k2"
2) "k1"
注意:msetnx与事务类似,同成功,同失败(NX:不存在时创建,但是k2已经存在)
(5)获取和设置指定区间范围内的值:(getrange 和 setrange )
使用:
127.0.0.1:6379> get k1
"abcdefghijk"
127.0.0.1:6379> getrange k1 0 -1 0到-1代表全部
"abcdefghijk"
127.0.0.1:6379> getrange k1 0 3
"abcd"
127.0.0.1:6379> setrange k1 1 xxxx
(integer) 11
127.0.0.1:6379> get k1
"axxxxfghijk"
(6)数值增减(incr 、incrby 、decr 、decrby)
例如:
127.0.0.1:6379> set k1 100
OK
127.0.0.1:6379> get k1
"100"
127.0.0.1:6379> incr k1
(integer) 101
127.0.0.1:6379> incr k1
(integer) 102
127.0.0.1:6379> incrby k1 3 指定每次增加多少
(integer) 105
127.0.0.1:6379> incrby k1 3
(integer) 108
127.0.0.1:6379> decr k1
(integer) 107
127.0.0.1:6379> decr k1
(integer) 106
127.0.0.1:6379> decrby k1 3 指定每次减少多少
(integer) 103
127.0.0.1:6379> decrby k1 3
(integer) 100
(7)获取字符串长度和追加(str 、appebd)
例如:
127.0.0.1:6379> set k1 abcd
OK
127.0.0.1:6379> get k1
"abcd"
127.0.0.1:6379> strlen k1
(integer) 4
127.0.0.1:6379> append k1 xxxx
(integer) 8
127.0.0.1:6379> get k1
"abcdxxxx"
(8)分布式锁(setex key 过期时间 value (还有setnx))
第一步,set key value
第二步,expire k 过期时间
上面的两个加起来等同于:setex key 过期时间 value
例:
127.0.0.1:6379> set k1 v1
OK
127.0.0.1:6379> expire k1 10
(integer) 1
127.0.0.1:6379> ttl k1
(integer) 6
127.0.0.1:6379> ttl k1
(integer) 2
127.0.0.1:6379> setex k1 10 vll
OK
127.0.0.1:6379> ttl k1
(integer) 0
127.0.0.1:6379> setnx k1 v11
(integer) 1
127.0.0.1:6379> get k1
"v11"
127.0.0.1:6379> setnx k1 v11
(integer) 0
(9)先获取再设置值(getset)
127.0.0.1:6379> getset k1 haha 先获取到原来的值v11,再修改为haha
"v11"
127.0.0.1:6379> get k1
"haha"
注意:getset命令等同于 set key value get ,例:
127.0.0.1:6379> get k1
"aaa"
127.0.0.1:6379> set k1 haha get
"aaa"
127.0.0.1:6379> get k1
"haha"
2.Redis列表(List)
Redis列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)
它的底层实际是个双端链表,最多可以包含 2^32 - 1 个元素 (4294967295, 每个列表超过40亿个元素)
(1)创建和遍历列表(lpush 、rpush、lrange)
127.0.0.1:6379> LPUSH list1 1 2 3 4 5 6 从左边加入
(integer) 6
127.0.0.1:6379> RPUSH list2 1 2 3 4 5 6 从右边加入
(integer) 6
127.0.0.1:6379> LRANGE list1 0 -1 遍历
1) "6"
2) "5"
3) "4"
4) "3"
5) "2"
6) "1"
127.0.0.1:6379> LRANGE list2 0 -1 遍历
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
6) "6"
(2)弹出元素(lpop、rpop)
127.0.0.1:6379> LPOP list1 左边弹出一个
"6"
127.0.0.1:6379> RPOP list1 右边弹出一个
"1"
127.0.0.1:6379> LRANGE list1 0 -1
1) "5"
2) "4"
3) "3"
4) "2"
(3)从上到下获取指定的元素(lindex)
127.0.0.1:6379> LINDEX list1 2
"3"
127.0.0.1:6379> LINDEX list1 0
"5"
(4)获取列表中元素的个数(llen)
127.0.0.1:6379> LLEN list1
(integer) 4
(5)删除N个值等于v1的元素(lrem key 数字N 给定的值v1)
127.0.0.1:6379> lpush list1 1 1 1 2 2 2 3 4 5 6
(integer) 10
127.0.0.1:6379> lrem list1 2 2 删除2个2
(integer) 2
127.0.0.1:6379> lrange list1 0 -1
1) "6"
2) "5"
3) "4"
4) "3"
5) "2"
6) "1"
7) "1"
8) "1"
(6)截取指定范围的值再赋值给key(ltrim key 开始index 结束index)
127.0.0.1:6379> lrange list1 0 -1
1) "6"
2) "5"
3) "4"
4) "3"
5) "2"
6) "1"
127.0.0.1:6379> ltrim list1 0 2
OK
127.0.0.1:6379> lrange list1 0 -1
1) "6"
2) "5"
3) "4"
(7)将列表key1中的值加到列表key2中去(rpoplpush 列表key1 列表key2)
127.0.0.1:6379> lrange list2 0 -1
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
6) "6"
127.0.0.1:6379> rpoplpush list1 list2 将list1中的4加到list2中去
"4"
127.0.0.1:6379> lrange list1 0 -1
1) "6"
2) "5"
127.0.0.1:6379> lrange list2 0 -1
1) "4"
2) "1"
3) "2"
4) "3"
5) "4"
6) "5"
7) "6"
(8)修改某个索引处的值(lset key index value)
127.0.0.1:6379> lset list2 2 9 将索引2的值改为9
OK
127.0.0.1:6379> lrange list2 0 -1
1) "4"
2) "1"
3) "9"
4) "3"
5) "4"
6) "5"
7) "6"
(9)插入新的值(linsert key before/after 已有的值 插入新的值)
127.0.0.1:6379> lrange list2 0 -1
1) "4"
2) "1"
3) "9"
4) "3"
5) "4"
6) "5"
7) "6"
127.0.0.1:6379> linsert list2 after 9 10 在9后面加一个10
(integer) 8
127.0.0.1:6379> lrange list2 0 -1
1) "4"
2) "1"
3) "9"
4) "10"
5) "3"
6) "4"
7) "5"
8) "6"
默认插入前一个:
127.0.0.1:6381> linsert keylist after 3 6
(integer) 5
127.0.0.1:6381> lrange keylist 0 -1 keylist里面有两个3,只在第一个3后面加入了6
1) "3"
2) "6"
3) "2"
4) "3"
5) "1"
3.Redis哈希(Hash)
简单说就是:Map<String,Map<Object,Object>>
Redis hash 是一个 string 类型的 field(字段) 和 value(值) 的映射表,hash 特别适合用于存储对象。
Redis 中每个 hash 可以存储 2^32 - 1 键值对(40多亿)
(1)hset:为一个键赋值;hget:获取值
127.0.0.1:6381> hset user1 name tom age 18
(integer) 2
127.0.0.1:6381> hget user1 name
"tom"
(2)hmset:为多个属性赋值;hmget:获取多个属性的值
127.0.0.1:6381> hmset user2 name jack age 19
OK
127.0.0.1:6381> hmget user2 name age
1) "jack"
2) "19"
(3)hgetall:获取全部;hdel:删除某个属性
127.0.0.1:6381> hgetall user2
1) "name"
2) "jack"
3) "age"
4) "19"
127.0.0.1:6381> hdel user1 name
(integer) 1
(4)hlen:获取key的长度
127.0.0.1:6381> hlen user2
(integer) 2
(5)hexists key:判断key中有没有某一个属性
127.0.0.1:6381> hexists user2 name
(integer) 1
127.0.0.1:6381> hexists user2 email
(integer) 0
(6)hkeys:获取全部的属性 ;hvals:获取全部属性对应的值
127.0.0.1:6381> hkeys user2
1) "name"
2) "age"
127.0.0.1:6381> hvals user2
1) "jack"
2) "19"
(7)hincrby:属性增加;hincrbyfloat:增加小数;
127.0.0.1:6381> hincrby user2 age 2
(integer) 21
127.0.0.1:6381> hget user2 age
"21"
127.0.0.1:6381> hincrbyfloat user2 age 2.3
"23.3"
127.0.0.1:6381> hget user2 age
"23.3"
4.Redis集合(Set)
无重复
(1)sadd key member1 【member2】:向集合中加入多个成员
127.0.0.1:6381> sadd set1 1 1 2 2 3 4 5 6
(integer) 6
127.0.0.1:6381> sadd set2 3 4 5 6 7 8
(integer) 6
(2)scard key : 获取集合成员数
127.0.0.1:6381> scard set1
(integer) 6
(3)sdiff key1 【key2】:返回给定集合的差集
127.0.0.1:6381> sdiff set1 set2
1) "1"
2) "2"
(4)sdiffstore destination key1 【key2】:返回给定集合的差集并存储到destination中
127.0.0.1:6381> sdiffstore set3 set1 set2 将结果放入set3
(integer) 2
(5)sinter key1 【key2】:返回给定集合的交集
127.0.0.1:6381> sinter set1 set2
1) "3"
2) "4"
3) "5"
4) "6"
(6)sinterstore destination key1【key2】:返回给定集合的交集并存储到destination中
127.0.0.1:6381> sinterstore set3 set1 set2
(integer) 4
(7)sismember key member:判断member是不是key的成员
127.0.0.1:6381> sismember set1 1
(integer) 1
(8)smembers key:返回集合中全部的成员
127.0.0.1:6381> smembers set1
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
6) "6"
(9)smove source destination member :将member元素从source集合移动到destination中
127.0.0.1:6381> smove set2 set1 8
(integer) 1
127.0.0.1:6381> smembers set1
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
6) "6"
7) "8"
(10)spop key 【count】 :移除并返回集合中的某count个元素(返回并删除)
127.0.0.1:6381> spop set1
"5"
127.0.0.1:6381> spop set1 2
1) "4"
2) "8"
(11)srandmember key 【count】:返回集合中一个或多个随机数(但是并未删除)
127.0.0.1:6381> srandmember set1 2
1) "3"
2) "6"
(12)srem key member1 【member2】:移除集合中一个或多个成员
127.0.0.1:6381> srem set1 1 2
(integer) 2
127.0.0.1:6381> smembers set1
1) "3"
2) "6"
(13)sunion key1 【key2】:返回给定集合的并集
127.0.0.1:6381> sunion set1 set2
1) "3"
2) "4"
3) "5"
4) "6"
5) "7"
(14)sunionstore destination key1 【key2】:返回给定集合的并集存在destination中
127.0.0.1:6381> sunionstore set4 set1 set2
(integer) 5
127.0.0.1:6381> smembers set4
1) "3"
2) "4"
3) "5"
4) "6"
5) "7"相关文章:
Redis数据类型(上篇)
前提:(key代表键) Redis常用的命令 命令作用keys *查看当前库所有的keyexists key判断某个key是否存在type key查看key是什么类型del key 删除指定的keyunlink key非阻塞删除,仅仅将keys从keyspace元数据中删除,真正的…...
VMware虚拟机安装Linux
1.下载Linux的ISO镜像文件 阿里镜像源网站: https://developer.aliyun.com/mirror/ 清华大学镜像源网站: https://mirrors.tuna.tsinghua.edu.cn/本人选择的是:Centos7.9.2009标准版 https://mirrors.tuna.tsinghua.edu.cn/centos/7.9.2009/isos/x86_64/ 标准版&a…...
slurm是什么,怎么用? For slurm和For Pytorch有什么区别和联系?
1.slurm是什么? Slurm(Simple Linux Utility for Resource Management)是一种开源的、用于集群和超级计算机的作业调度系统。它主要用于管理和调度大规模计算任务,使得用户可以有效地利用集群中的计算资源。Slurm提供了一套功能强…...
类和对象【六】友元和内部类
文章目录 友元友元的作用友元的缺点友元函数语法:特点: 友元类语法:特点: 内部类概念特点 友元 友元的作用 友元提供了一种打破封装的方式,有时提供了便利。 友元的主要作用就是打破封装 即可以让一个类的友元函数…...
一点点 cv 经验 1:cv方向、模型评估、输入尺寸、目标检测器设计
一点点 cv 经验 1:cv方向、模型评估、输入尺寸、目标检测器设计 cv 方向Pytorch数据集划分 模型评估误差偏差方差噪声 输入尺寸方法一:让数据适应模型方法二:修改模型适应数据方法三:划分Patch,分别处理 目标检测器结构…...
Java-SpringBoot集成Langchain4j文本嵌入模型实现向量相似度查询
集成Pg数据库并创建vector字段类型 运行pgvector容器 根据需要进行容器目录挂载 docker run --name pgvector \-e POSTGRES_PASSWORD123456 \-p 5432:5432 \-d --platform linux/amd64 ankane/pgvector:latest 进入docker容器并创建vector字段类型 docker exec -it pgvecto…...
正宇软件:引领数字人大新纪元,开启甘肃人大代表履职新篇章
在数字化强国的主旋律之下,政府工作的数字化、智能化转型已成为提升治理效能、增强人民满意度的关键一环。在这个大背景下,正宇软件技术开发有限公司以其卓越的技术实力和丰富的行业经验,成为了政府信息化建设的杰出代表。甘肃省人大代表履职…...
UniApp中,在页面显示时触发子组件的重新渲染
在UniApp中,要在页面显示时触发子组件的重新渲染,可以利用生命周期钩子函数来实现。具体来说,可以在页面的onShow生命周期钩子中调用子组件的方法或者改变子组件的props,从而触发子组件的重新渲染。 首先,确保子组件有…...
Linux(三)
Linux(三) Linux网络配置管理网络基础知识 IP地址A类 由1个字节网络地址3个字节主机地址B类 由2个字节网络地址2个主机地址C类 由3个字节网络地址1个主机地址D类:主要用于组播E类:为将来使用保留 子网掩码子网掩码作用网关DNS服务器 Linux用户管理用户的…...
2024年郫都区区级农业生产社会化服务重点服务组织评定申报条件材料、程序要求
第一章 总 则 第一条 为深入贯彻《中共中央办公厅 国务院办公厅关于促进小农户和现代农业发展有机衔接的意见》《农业农村部关于加快发展农业社会化服务的指导意见》精神,充分发挥农业生产社会化服务组织在引领现代农业发展、打造新时代更高水平“天府粮仓”郫都…...
Java入门须知术语
文章目录 前言JVM (Java Virtual Machine)JVM的组成部分JVM的作用为什么需要JVM JRE(Java Runtime Environment)JRE的组成部分JRE的作用为什么需要JRE JDK(Java Development Kit,Java开发工具包)JDK的组成部分JDK的作用…...
Spring Boot中集成WebSocket
目录 WebSocket简介WebSocket原理WebSocket的使用场景在Spring Boot中集成WebSocket 创建Spring Boot项目添加依赖配置WebSocket创建WebSocket处理器配置WebSocket端点前端使用WebSocket添加WebSocket拦截器 WebSocket简介 WebSocket是一种在单个TCP连接上进行全双工通信的…...
18.多分类问题代码实现
在机器学习中,多分类问题是一类常见的问题,它涉及到将输入数据划分为多个类别中的一个。例如,在图像识别中,我们可能需要将图像分为不同的类别,如手写数字识别(MNIST数据集)就是将手写数字图像分…...
实时通信的方式——WebRTC
文章目录 基于WebRTC实现音视频通话P2P通信原理如何发现对方? 不同的音视频编解码能力如何沟通?(媒体协商SDP)如何联系上对方?(网络协商) 常用的API音视频采集getUserMedia核心对象RTCPeerConne…...
Android 使用 ActivityResultLauncher 申请权限
前面介绍了 Android 运行时权限。 其中,申请权限的步骤有些繁琐,需要用到:ActivityCompat.requestPermissions 函数和 onRequestPermissionsResult 回调函数,今天就借助 ActivityResultLauncher 来简化书写。 步骤1:创…...
如何将前端项目打包并部署到不同服务器环境
学习源码可以看我的个人前端学习笔记 (github.com):qdxzw/frontlearningNotes 觉得有帮助的同学,可以点心心支持一下哈(笔记是根据b站尚硅谷的前端讲师【张天禹老师】整理的,用于自己复盘,有需要学习的可以去b站学习原版视频&…...
什么样的展馆场馆才是科技满满?就差一张智慧场馆大屏
随着科技的飞速发展,传统的场馆展示方式已经无法满足现代人对信息获取和体验的需求。智慧场馆大屏作为一种新型的展示方式,应运而生。它将高清大屏显示技术、智能交互技术、数据分析技术等融为一体,为观众带来更加丰富、生动的展示体验。 一…...
python核心编程(二)
python面向对象 一、基本理论二、 面向对象在python中实践2.1 如何去定义类2.2 通过类创建对象2.3 属性相关2.4 方法相关 三、python对象的生命周期,以及周期方法3.1 概念3.2 监听对象的生命周期 四、面向对象的三大特性4.1 封装4.2 继承4.2.1 概念4.2.1 目的4.2.2 分类4.2.3 t…...
【wiki知识库】02.wiki知识库SpringBoot后端的准备
📝个人主页:哈__ 期待您的关注 目录 一、🔥今日目标 二、📂打开SpringBoot项目 2.1 导入所需依赖 2.2修改application.yml配置文件 2.3导入MybatisPlus逆向工程工具 2.4创建一个公用的返回值 2.5创建CopyUtil工具类 2.6创建…...
python tuple(元组)
python list(列表)、创建、访问、内置index、判断in、not in、添加元素、insert、append、extend、列表排序、颠倒顺序、删除元素、remove、pop、clear-CSDN博客 目录 tuple: 元组的主要特点包括: tuple的创建 单个元组需要注…...
脑机新手指南(八):OpenBCI_GUI:从环境搭建到数据可视化(下)
一、数据处理与分析实战 (一)实时滤波与参数调整 基础滤波操作 60Hz 工频滤波:勾选界面右侧 “60Hz” 复选框,可有效抑制电网干扰(适用于北美地区,欧洲用户可调整为 50Hz)。 平滑处理&…...
Go 语言接口详解
Go 语言接口详解 核心概念 接口定义 在 Go 语言中,接口是一种抽象类型,它定义了一组方法的集合: // 定义接口 type Shape interface {Area() float64Perimeter() float64 } 接口实现 Go 接口的实现是隐式的: // 矩形结构体…...
【Redis技术进阶之路】「原理分析系列开篇」分析客户端和服务端网络诵信交互实现(服务端执行命令请求的过程 - 初始化服务器)
服务端执行命令请求的过程 【专栏简介】【技术大纲】【专栏目标】【目标人群】1. Redis爱好者与社区成员2. 后端开发和系统架构师3. 计算机专业的本科生及研究生 初始化服务器1. 初始化服务器状态结构初始化RedisServer变量 2. 加载相关系统配置和用户配置参数定制化配置参数案…...
高频面试之3Zookeeper
高频面试之3Zookeeper 文章目录 高频面试之3Zookeeper3.1 常用命令3.2 选举机制3.3 Zookeeper符合法则中哪两个?3.4 Zookeeper脑裂3.5 Zookeeper用来干嘛了 3.1 常用命令 ls、get、create、delete、deleteall3.2 选举机制 半数机制(过半机制࿰…...
uniapp微信小程序视频实时流+pc端预览方案
方案类型技术实现是否免费优点缺点适用场景延迟范围开发复杂度WebSocket图片帧定时拍照Base64传输✅ 完全免费无需服务器 纯前端实现高延迟高流量 帧率极低个人demo测试 超低频监控500ms-2s⭐⭐RTMP推流TRTC/即构SDK推流❌ 付费方案 (部分有免费额度&#x…...
MySQL 8.0 OCP 英文题库解析(十三)
Oracle 为庆祝 MySQL 30 周年,截止到 2025.07.31 之前。所有人均可以免费考取原价245美元的MySQL OCP 认证。 从今天开始,将英文题库免费公布出来,并进行解析,帮助大家在一个月之内轻松通过OCP认证。 本期公布试题111~120 试题1…...
NFT模式:数字资产确权与链游经济系统构建
NFT模式:数字资产确权与链游经济系统构建 ——从技术架构到可持续生态的范式革命 一、确权技术革新:构建可信数字资产基石 1. 区块链底层架构的进化 跨链互操作协议:基于LayerZero协议实现以太坊、Solana等公链资产互通,通过零知…...
华为云Flexus+DeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建
华为云FlexusDeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建 前言 如今大模型其性能出色,华为云 ModelArts Studio_MaaS大模型即服务平台华为云内置了大模型,能助力我们轻松驾驭 DeepSeek-V3/R1,本文中将分享如何…...
Linux --进程控制
本文从以下五个方面来初步认识进程控制: 目录 进程创建 进程终止 进程等待 进程替换 模拟实现一个微型shell 进程创建 在Linux系统中我们可以在一个进程使用系统调用fork()来创建子进程,创建出来的进程就是子进程,原来的进程为父进程。…...
基于TurtleBot3在Gazebo地图实现机器人远程控制
1. TurtleBot3环境配置 # 下载TurtleBot3核心包 mkdir -p ~/catkin_ws/src cd ~/catkin_ws/src git clone -b noetic-devel https://github.com/ROBOTIS-GIT/turtlebot3.git git clone -b noetic https://github.com/ROBOTIS-GIT/turtlebot3_msgs.git git clone -b noetic-dev…...
