Redis-常用命令

目录

1、Redis数据结构

2、命令简介

2.1、通用命令

DEL

EXISTS

EXPIRE

2.2、String命令

SET和GET

MSET和MGET

INCR和INCRBY和DECY

SETNX

SETEX

2.3、Key的层级结构

2.4、Hash命令

HSET和HGET

HMSET和HMGET

HGETALL

HKEYS和HVALS

HINCRBY

HSETNX

2.5、List命令

LPUSH和RPUSH

LPOP和RPOP

LRANGE

2.6、Set命令

2.7、SortedSet类型


1、Redis数据结构

Redis是一个key-value的数据库,key一般是String类型,不过value的类型多种多样:

贴心小建议:命令不要死记,学会查询就好啦

Redis为了方便我们学习,将操作不同数据类型的命令也做了分组,在官网( https://redis.io/commands )可以查看到不同的命令:

不同类型的命令称为一个group,我们也可以通过help命令来查看各种不同group的命令:

2、命令简介

2.1、通用命令

通用指令是部分数据类型的,都可以使用的指令,常见的有:

  • KEYS:查看符合模板的所有key
  • DEL:删除一个指定的key
  • EXISTS:判断key是否存在
  • EXPIRE:给一个key设置有效期,有效期到期时该key会被自动删除
  • TTL:查看一个KEY的剩余有效期

通过help [command] 可以查看一个命令的具体用法,例如:

127.0.0.1:6379> keys *1) "\"unique_visitor_count\""2) "sys_config:sys.index.skinName"3) "sys_dict:sys_common_status"4) "sys_dict:sys_normal_disable"5) "sys_config:sys.login.blackIPList"# 查询以a开头的key
127.0.0.1:6379> keys a*
1) "age"

小提示:在生产环境下,不推荐使用keys 命令,因为这个命令在key过多的情况下,效率不高

DEL
127.0.0.1:6379> help delDEL key [key ...]summary: Delete a keysince: 1.0.0group: generic127.0.0.1:6379> del name #删除单个
(integer) 1  #成功删除1个127.0.0.1:6379> keys *
1) "age"127.0.0.1:6379> MSET k1 v1 k2 v2 k3 v3 #批量添加数据
OK127.0.0.1:6379> keys *
1) "k3"
2) "k2"
3) "k1"
4) "age"127.0.0.1:6379> del k1 k2 k3 k4
(integer) 3   #此处返回的是成功删除的key,由于redis中只有k1,k2,k3 所以只成功删除3个,最终返回
127.0.0.1:6379>127.0.0.1:6379> keys * #再查询全部的key
1) "age"	#只剩下一个了
127.0.0.1:6379>
EXISTS
127.0.0.1:6379> help EXISTSEXISTS key [key ...]summary: Determine if a key existssince: 1.0.0group: generic127.0.0.1:6379> exists age
(integer) 1127.0.0.1:6379> exists name
(integer) 0
EXPIRE
127.0.0.1:6379> expire age 10
(integer) 1127.0.0.1:6379> ttl age
(integer) 8127.0.0.1:6379> ttl age
(integer) 6127.0.0.1:6379> ttl age
(integer) -2127.0.0.1:6379> ttl age
(integer) -2  #当这个key过期了,那么此时查询出来就是-2 127.0.0.1:6379> keys *
(empty list or set)127.0.0.1:6379> set age 10 #如果没有设置过期时间
OK127.0.0.1:6379> ttl age
(integer) -1  # ttl的返回值就是-1
2.2、String命令

String类型,也就是字符串类型,是Redis中最简单的存储类型。

Redis Strings存储字节序列,包括文本、序列化对象和二进制数组。因此,字符串是最基本的 Redis 数据类型。它们通常用于缓存,但它们支持额外的功能,让您也可以实现计数器并执行按位操作。

其value是字符串,不过根据字符串的格式不同,又可以分为3类:

  • string: 普通字符串
  • int: 整数类型,可以做自增.自减操作
  • float: 浮点类型,可以做自增.自减操作

String的常见命令有:

  • SET:添加或者修改已经存在的一个String类型的键值对
  • GET:根据key获取String类型的value
  • MSET:批量添加多个String类型的键值对
  • MGET:根据多个key获取多个String类型的value
  • INCR:让一个整型的key自增1
  • INCRBY:让一个整型的key自增并指定步长,例如:incrby num 2 让num值自增2
  • INCRBYFLOAT:让一个浮点类型的数字自增并指定步长
  • SETNX:添加一个String类型的键值对,前提是这个key不存在,否则不执行
  • SETEX:添加一个String类型的键值对,并且指定有效期

注意: 默认情况下,单个 Redis 字符串最大为 512 MB。

案例:

SET和GET

小提示: 如果key不存在则是新增,如果存在则是修改

127.0.0.1:6379> set name Rose  //原来不存在
OK127.0.0.1:6379> get name 
"Rose"127.0.0.1:6379> set name Jack //原来存在,就是修改
OK127.0.0.1:6379> get name
"Jack"
MSET和MGET
127.0.0.1:6379> MSET k1 v1 k2 v2 k3 v3
OK127.0.0.1:6379> MGET name age k1 k2 k3
1) "Jack" //之前存在的name
2) "10"   //之前存在的age
3) "v1"
4) "v2"
5) "v3"
INCR和INCRBY和DECY
127.0.0.1:6379> get age 
"10"127.0.0.1:6379> incr age //增加1
(integer) 11127.0.0.1:6379> get age //获得age
"11"127.0.0.1:6379> incrby age 2 //一次增加2
(integer) 13 //返回目前的age的值127.0.0.1:6379> incrby age 2
(integer) 15127.0.0.1:6379> incrby age -1 //也可以增加负数,相当于减
(integer) 14127.0.0.1:6379> incrby age -2 //一次减少2个
(integer) 12127.0.0.1:6379> DECR age //相当于 incr 负数,减少正常用法
(integer) 11127.0.0.1:6379> get age 
"11"
SETNX
127.0.0.1:6379> help setnxSETNX key valuesummary: Set the value of a key, only if the key does not existsince: 1.0.0group: string127.0.0.1:6379> set name Jack  //设置名称
OK
127.0.0.1:6379> setnx name lisi //如果key不存在,则添加成功
(integer) 0
127.0.0.1:6379> get name //由于name已经存在,所以lisi的操作失败
"Jack"
127.0.0.1:6379> setnx name2 lisi //name2 不存在,所以操作成功
(integer) 1
127.0.0.1:6379> get name2 
"lisi"
SETEX
127.0.0.1:6379> setex name 10 jack
OK127.0.0.1:6379> ttl name
(integer) 8127.0.0.1:6379> ttl name
(integer) 7127.0.0.1:6379> ttl name
(integer) 5
2.3、Key的层级结构

Redis没有类似MySQL中的Table的概念,我们该如何区分不同类型的key呢?

例如,需要存储用户、商品信息到redis,有一个用户id是1,有一个商品id恰好也是1,此时如果使用id作为key,那就会冲突了,该怎么办?

我们可以通过给key添加前缀加以区分,不过这个前缀不是随便加的,有一定的规范:

Redis的key允许有多个单词形成层级结构,多个单词之间用':'隔开,格式如下:

	项目名:业务名:类型:id

这个格式并非固定,也可以根据自己的需求来删除或添加词条。这样以来,我们就可以把不同类型的数据区分开了。从而避免了key的冲突问题。

例如我们的项目名称叫 gcxy,有user和product两种不同类型的数据,我们可以这样定义key:

  • user相关的key:gcxy:user:1
  • product相关的key:gcxy:product:1

如果Value是一个Java对象,例如一个User对象,则可以将对象序列化为JSON字符串后存储:

KEY

VALUE

gcxy:user:1

{"id":1, "name": "Jack", "age": 21}

gcxy:product:1

{"id":1, "name": "小米11", "price": 4999}

一旦我们向redis采用这样的方式存储,那么在可视化界面中,redis会以层级结构来进行存储,形成类似于这样的结构,更加方便Redis获取数据

2.4、Hash命令

Redis Hash是结构为字段值对集合的记录类型。可以使用散列来表示基本对象并存储计数器分组等。

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

String结构是将对象序列化为JSON字符串后存储,当需要修改对象某个字段时很不方便:

Hash结构可以将对象中的每个字段独立存储,可以针对单个字段做CRUD:

Hash类型的常见命令

  • HSET key field value:添加或者修改hash类型key的field的值
  • HGET key field:获取一个hash类型key的field的值
  • HMSET:批量添加多个hash类型key的field的值
  • HMGET:批量获取多个hash类型key的field的值
  • HGETALL:获取一个hash类型的key中的所有的field和value
  • HKEYS:获取一个hash类型的key中的所有的field
  • HINCRBY:让一个hash类型key的字段值自增并指定步长
  • HSETNX:添加一个hash类型的key的field值,前提是这个field不存在,否则不执行

案例:

HSET和HGET
127.0.0.1:6379> HSET gcxy:user:3 name Lucy//大key是 gcxy:user:3 小key是name,小value是Lucy
(integer) 1
127.0.0.1:6379> HSET gcxy:user:3 age 21// 如果操作不存在的数据,则是新增
(integer) 1
127.0.0.1:6379> HSET gcxy:user:3 age 17 //如果操作存在的数据,则是修改
(integer) 0
127.0.0.1:6379> HGET gcxy:user:3 name 
"Lucy"
127.0.0.1:6379> HGET gcxy:user:3 age
"17"
HMSET和HMGET
127.0.0.1:6379> HMSET gcxy:user:4 name ZhangSan
OK
127.0.0.1:6379> HMSET gcxy:user:4 name LiSi age 20 sex man
OK
127.0.0.1:6379> HMGET gcxy:user:4 name age sex
1) "LiSi"
2) "20"
3) "man"
HGETALL
127.0.0.1:6379> HGETALL gcxy:user:4
1) "name"
2) "LiSi"
3) "age"
4) "20"
5) "sex"
6) "man"
HKEYS和HVALS
127.0.0.1:6379> HKEYS gcxy:user:4
1) "name"
2) "age"
3) "sex"
127.0.0.1:6379> HVALS gcxy:user:4
1) "LiSi"
2) "20"
3) "man"
HINCRBY
127.0.0.1:6379> HINCRBY  gcxy:user:4 age 2
(integer) 22
127.0.0.1:6379> HVALS gcxy:user:4
1) "LiSi"
2) "22"
3) "man"
127.0.0.1:6379> HINCRBY  gcxy:user:4 age -2
(integer) 20
HSETNX
127.0.0.1:6379> HSETNX gcxy:user4 sex woman
(integer) 1
127.0.0.1:6379> HGETALL gcxy:user:3
1) "name"
2) "Lucy"
3) "age"
4) "17"
127.0.0.1:6379> HSETNX gcxy:user:3 sex woman
(integer) 1
127.0.0.1:6379> HGETALL gcxy:user:3
1) "name"
2) "Lucy"
3) "age"
4) "17"
5) "sex"
6) "woman"
2.5、List命令

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

特征也与LinkedList类似:

  • 有序
  • 元素可以重复
  • 插入和删除快
  • 查询速度一般

常用来存储一个有序数据,例如:朋友圈点赞列表,评论列表等。

List的常见命令有:

  • LPUSH key element ... :向列表左侧插入一个或多个元素
  • LPOP key:移除并返回列表左侧的第一个元素,没有则返回nil
  • RPUSH key element ... :向列表右侧插入一个或多个元素
  • RPOP key:移除并返回列表右侧的第一个元素
  • LRANGE key star end:返回一段角标范围内的所有元素
  • BLPOP和BRPOP:与LPOP和RPOP类似,只不过在没有元素时等待指定时间,而不是直接返回nil

LPUSH和RPUSH
127.0.0.1:6379> LPUSH users 1 2 3
(integer) 3
127.0.0.1:6379> RPUSH users 4 5 6
(integer) 6
LPOP和RPOP
127.0.0.1:6379> LPOP users
"3"
127.0.0.1:6379> RPOP users
"6"
LRANGE
127.0.0.1:6379> LRANGE users 1 2
1) "1"
2) "4"
2.6、Set命令

Redis的Set结构与Java中的HashSet类似,可以看做是一个value为null的HashMap。因为也是一个hash表,因此具备与HashSet类似的特征:

  • 无序
  • 元素不可重复
  • 查找快
  • 支持交集、并集、差集等功能

Set的常见命令有:

  • SADD key member ... :向set中添加一个或多个元素
  • SREM key member ... : 移除set中的指定元素
  • SCARD key: 返回set中元素的个数
  • SISMEMBER key member:判断一个元素是否存在于set中
  • SMEMBERS:获取set中的所有元素
  • SINTER key1 key2 ... :求key1与key2的交集

例如两个集合:s1和s2:

求交集:SINTER s1 s2

求s1与s2的不同:SDIFF s1 s2

具体命令

127.0.0.1:6379> sadd s1 a b c
(integer) 3
127.0.0.1:6379> smembers s1
1) "c"
2) "b"
3) "a"
127.0.0.1:6379> srem s1 a
(integer) 1127.0.0.1:6379> SISMEMBER s1 a
(integer) 0127.0.0.1:6379> SISMEMBER s1 b
(integer) 1127.0.0.1:6379> SCARD s1
(integer) 2

案例:

  • 将下列数据用Redis的Set集合来存储:
    • 张三的爱好:看书.睡觉.吃饭.打麻将
    • 李四的爱好:打麻将.爬山.打篮球
  • 利用Set的命令实现下列功能:
    • 计算张三的爱好有几个
    • 计算张三和李四有哪些共同爱好
    • 查询哪些人是张三的爱好却不是李四的爱好
    • 查询张三和李四的爱好总共有哪些
    • 判断看书是否是张三的爱好
    • 判断吃饭是否是李四的爱好
    • 将打麻将从张三的爱好列表中移除
127.0.0.1:6379> SADD zs kanshu shuijiao chifan damajiang
(integer) 4127.0.0.1:6379> SADD ls damajiang pashan dalanqiu
(integer) 3127.0.0.1:6379> SCARD zs
(integer) 4127.0.0.1:6379> SINTER zs ls
1) "damajiang"127.0.0.1:6379> SDIFF zs ls
1) "kanshu"
2) "shuijiao"
3) "chifan"127.0.0.1:6379> SUNION zs ls
1) "kanshu"
2) "shuijiao"
3) "chifan"
4) "damajiang"
5) "pashan"
6) "dalanqiu"127.0.0.1:6379> SISMEMBER zs kanshu
(integer) 1127.0.0.1:6379> SISMEMBER ls chifan
(integer) 0127.0.0.1:6379> SREM zs damajiang
(integer) 1127.0.0.1:6379> SMEMBERS zs
1) "kanshu"
2) "shuijiao"
3) "chifan"
2.7、SortedSet类型

Redis的SortedSet是一个可排序的set集合,与Java中的TreeSet有些类似,但底层数据结构却差别很大。SortedSet中的每一个元素都带有一个score属性,可以基于score属性对元素排序,底层的实现是一个跳表(SkipList)加 hash表。

SortedSet具备下列特性:

  • 可排序
  • 元素不重复
  • 查询速度快

因为SortedSet的可排序特性,经常被用来实现排行榜这样的功能。

SortedSet的常见命令有:

  • ZADD key score member:添加一个或多个元素到sorted set ,如果已经存在则更新其score值
  • ZREM key member:删除sorted set中的一个指定元素
  • ZSCORE key member : 获取sorted set中的指定元素的score值
  • ZRANK key member:获取sorted set 中的指定元素的排名
  • ZCARD key:获取sorted set中的元素个数
  • ZCOUNT key min max:统计score值在给定范围内的所有元素的个数
  • ZINCRBY key increment member:让sorted set中的指定元素自增,步长为指定的increment值
  • ZRANGE key min max:按照score排序后,获取指定排名范围内的元素
  • ZRANGEBYSCORE key min max:按照score排序后,获取指定score范围内的元素
  • ZDIFF.ZINTER.ZUNION:求差集.交集.并集

注意:所有的排名默认都是升序,如果要降序则在命令的Z后面添加REV即可,例如:

  • 升序获取sorted set 中的指定元素的排名:ZRANK key member
  • 降序获取sorted set 中的指定元素的排名:ZREVRANK key memeber

感兴趣的小伙伴可以点个关注!后续将推出springboot整合redis,谢谢~

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

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

相关文章

每日一题之既约分数

题目描述 本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。 如果一个分数的分子和分母的最大公约数是 1,这个分数称为既约分数。 例如 3/4,1/8,7/1​, 都是既约分数。 请问,有多少个既约分…

Java 图片压缩:高效压缩方案解析

目录 一、基于OpenCV的智能尺寸压缩(一)代码示例(二)技术亮点(三)适用场景二、WebP高效格式转换(一)代码示例(二)核心优势(三)性能对比三、基于Thumbnailator的简单压缩(一)代码示例(二)技术亮点(三)适用场景四、方案选型建议一、基于OpenCV的智能尺寸压缩 …

鸿蒙Next-集成HmRouter的路由模式

第一步:全局安装hmrouter依赖 ohpm install hadss/hmrouter第二步:修改全局的hvigor-config.json5(加入hm-router插件) hvigor/hvigor-config.json5 {"modelVersion": "5.0.1","dependencies": {"hadss/hmrouter-…

uni-app:指引蒙层

组件说明 指引蒙层组件: 通过id标签,突出对应id中的模块; 可以自定义提示词。 点击任意位置关闭蒙层 效果展示和使用示例 切换id之后的效果: 代码实现 <template><view class="guide-mask" v-if="showMask" @click="hideMask"&g…

基于Java与Go的下一代DDoS防御体系构建实战

引言:混合云时代的攻防对抗新格局 2024年某金融平台遭遇峰值2.3Tbps的IPv6混合攻击,传统WAF方案在新型AI驱动攻击面前全面失效。本文将以Java与Go为技术栈,揭示如何构建具备智能决策能力的防御系统。 一、攻击防御技术矩阵重构 1.1 混合攻击特征识别 攻击类型Java检测方案…

大数据Spark(五十五):Spark框架及特点

文章目录 Spark框架及特点 一、Spark框架介绍 二、Spark计算框架具备以下特点 Spark框架及特点 一、Spark框架介绍 Apache Spark 是一个专为大规模数据处理而设计的快速、通用的计算引擎。最初由加州大学伯克利分校的 AMP 实验室&#xff08;Algorithms, Machines, and Pe…

ubuntu 升级补丁,备份备份备份

一、常规软件包更新&#xff08;安全补丁和软件升级&#xff09; 更新软件包列表 从软件源服务器获取最新的软件包信息&#xff1a; sudo apt update升级已安装的软件包 安装所有可用的更新&#xff08;安全补丁、功能更新&#xff09;&#xff1a; sudo apt upgrade处理依赖…

CubeMx——串口与 printf 打印

CubeMx 配置 fputc 实现 /* USER CODE BEGIN 0 */ #include <stdio.h> /* USER CODE END 0 *//* USER CODE BEGIN 1 */ int fputc(int ch, FILE *f) {/* Place your implementation of fputc here *//* e.g. write a character to the USART */uint8_t send_data ch;HA…

多线程 -- Thread类

Thread 的常见构造方法 最后一个构造方法中的 ThreadGroup 线程组是 Java 中的概念&#xff0c;和系统内核中的线程组不是一个东西。我们自己创建的线程&#xff0c;默认是按照 Thread- 0 1 2 3 4...命名。但我们也可以给不同的线程&#xff0c;起不同的名字&#xff08;不同的…

Java基础关键_032_反射(二)

目 录 一、反射 Class 的 Method 1.反编译 String 类的方法签名 2.通过反射调用方法 3.反编译 String 类的构造方法签名 4.通过反射调用构造方法 二、类加载过程 1.装载&#xff08;Loading&#xff09; &#xff08;1&#xff09;说明 &#xff08;2&#xff09;双亲委…

《数据结构:单链表》

“希望就像星星&#xff0c;或许光芒微弱&#xff0c;但永不熄灭。” 博主的个人gitee&#xff1a;https://gitee.com/friend-a188881041351 一.概念与结构 链表是一种物理存储上非连续、非顺序的存储结构&#xff0c;数据元素的顺序逻辑是通过链表中的指针链接次序实现的。 单…

蓝桥杯 - 中等 - 绝美宋词

介绍 “今宵酒醒何处&#xff0c;杨柳岸晓风残月”&#xff0c;“蓦然回首&#xff0c;那人却在灯火阑珊处”&#xff0c;“试问闲愁都几许&#xff1f;一川烟草&#xff0c;满城风絮&#xff0c;梅子黄时雨” ...... 宋词可谓是古代文学桂冠上一颗璀璨的明珠&#xff0c;本题…

JDBC、excute()、DriveManager、Connection、Statement、自建JDBC工具类、占位符

DAY19.2 Java核心基础 JDBC JDBC&#xff1a;Java database Connectivity JDBC是java程序连接各种数据库的组件 Mybatis就是基于JDBC的封装&#xff0c;是独立于数据库的管理系统&#xff0c;通用的SQL数据库存取和操作的公共接口 定义了一套标准&#xff0c;为访问 不同数…

21天Python计划:函数简单介绍

文章目录 前言一、函数知识体系二、函数基础函数的定义和调用函数参数 三、函数对象、函数嵌套、名称空间与作用域、装饰器函数对象函数嵌套名称空间与作用域装饰器 四、迭代器、生成器、面向过程编程迭代器生成器面向过程编程 五、三元表达式、列表推导式、生成器表达式、递归…

污水处理厂人员定位方案-UWB免布线高精度定位

1. 方案概述 本方案采用免布线UWB基站与北斗卫星定位融合技术&#xff0c;结合UWBGNSS双模定位工卡&#xff0c;实现污水处理厂室内外人员高精度定位&#xff08;亚米级&#xff09;。系统通过低功耗4G传输数据&#xff0c;支持实时位置监控、电子围栏、聚集预警、轨迹回放等功…

无人机DSP处理器工作要点!

一、DSP处理器在无人机中的工作要点 1. 高效运算架构 哈佛结构&#xff1a;DSP采用程序与数据存储分离的哈佛结构&#xff0c;允许同时访问指令和数据&#xff0c;提升数据吞吐效率。 流水线技术&#xff1a;将指令分解为取指、译码、执行等多个阶段并行处理&#xff0c…

MySQL查询成本计算

对于如上SQL&#xff0c;只是因为查询字段不同&#xff0c;最终执行时选择的索引就不同&#xff0c;那么MySQL是如何决定选择使用哪个索引呢&#xff1f; 答案是MySQL会进行成本计算&#xff0c;对于各个场景查询进行成本预估&#xff0c;最终选择最优。 我们可以使用trace工具…

《K230 从熟悉到...》矩形检测

《K230 从熟悉到...》矩形检测 《庐山派 K230 从熟悉到...》矩形检测 矩形检测技术是一种广泛应用于电子图像处理的核心技术。它通过识别和分析图像中的矩形结构&#xff0c;为各种应用提供基础支持。从传统图像处理算法到现代深度学习技术&#xff0c;矩形检测的实现途径多种多…

python基础学习三(元组及字符串的使用)

文章目录 元组什么是元组元组的创建方式为什么要将元组设计成不可变序列元组的遍历集合集合的相关操作集合操作集合的数学操作集合生成式列表&#xff0c;字典&#xff0c;元组&#xff0c;集合总结 字符串字符串的驻留机制判断字符串的操作方法字符串的比较操作字符串的切片操…

Java基础-22-基本语法-实体类

实体类&#xff08;Entity Class&#xff09; 1. 什么是实体类&#xff1f; 实体类&#xff08;Entity Class&#xff09; 是 Java 中用于表示数据库表结构或业务对象的类。它通常包含属性&#xff08;字段&#xff09;和getter/setter 方法&#xff0c;用于存储和操作数据。…