四:redis的常见命令及5种基本数据类型

news2025/1/18 4:42:14

四:redis的常见命令及数据类型

      • Redis 键(key) 命令
      • 1.String(字符串)
      • 2.List(列表类型)
      • 3.set(集合)
      • 4.Hash(哈希)
      • 5.Zset(有序集合)

redis官网可查看所有命令:
https://www.redis.net.cn/order/

在这里插入图片描述

Redis 键(key) 命令

127.0.0.1:6379> keys *                        #查看所有key
(empty list or set)
127.0.0.1:6379> set name zhangsanfeng         #设置key和value
OK
127.0.0.1:6379> exists name                   #判断当前key是否存在
(integer) 1
127.0.0.1:6379> move name 1                   #将当前key移到指定库下
(integer) 1
127.0.0.1:6379> expire age 10                 #设置过期时间,单位为秒
(integer) 1
127.0.0.1:6379> ttl age                       #查看key的剩余过期时间
(integer) 4
127.0.0.1:6379> type name                     #查看key属于什么类型
string                    

1.String(字符串)

redis字符串类型:

/**
   常见字符串操作
*/
127.0.0.1:6379> set k1 v1           #设置值
OK
127.0.0.1:6379> get k1              #获得值
"v1"
127.0.0.1:6379> keys *              #获得所有的key
1) "k1"
127.0.0.1:6379> exists k1           #判断一个key是否存在
(integer) 1
127.0.0.1:6379> append k1 ,hello    #追加字符串,若key不存在相当于set一个key
(integer) 8
127.0.0.1:6379> strlen k1           #获取字符串的长度
(integer) 8
127.0.0.1:6379> get k1              
"v1,hello"
/**
   自增自减(常用于计数,如浏览量)
*/
127.0.0.1:6379> set count 0         #初始值为0
OK
127.0.0.1:6379> get count
"0"
127.0.0.1:6379> incr count          #自增1
(integer) 1
127.0.0.1:6379> get count
"1"
127.0.0.1:6379> decr count          #自减1
(integer) 0
127.0.0.1:6379> get count
"0"
127.0.0.1:6379> incrby count 2      #设置步长,指定自增量
(integer) 2
127.0.0.1:6379> get count
"2"
127.0.0.1:6379> decrby count 5      #设置步长,指定自减量
(integer) -3
127.0.0.1:6379> get count
"-3"
/**
   字符串截取和替换
*/
127.0.0.1:6379> get k1
"v1,hello"
127.0.0.1:6379> getrange k1 3 7      #截取字符串 [3,7]
"hello"
127.0.0.1:6379> setrange k1 2 ;%     #替换指定位置开始的字符串 
(integer) 8
127.0.0.1:6379> get k1
"v1;%ello"
127.0.0.1:6379> getrange k1 0 -1     #获取全部位置的字符串,同get key
"v1;%ello"
/**
   设置过期时间
   key存在则创建失败
*/
127.0.0.1:6379> setex kt 30 time     #设置kt的值为time,30秒后过期
OK
127.0.0.1:6379> get kt
"time"
127.0.0.1:6379> ttl kt               #查看过期时间

(integer) 20
127.0.0.1:6379> setnx ex redis       #如果ex不存在,才创建ex
(integer) 1
127.0.0.1:6379> get ex
"redis"
127.0.0.1:6379> setnx ex mysql       #如果ex存在,则创建失败
(integer) 0
127.0.0.1:6379> get ex
"redis"
127.0.0.1:6379> ttl kt
(integer) -2
/**
   批量设置或获取多个值
*/
127.0.0.1:6379> mset k1 v1 k2 v2 k3 v3  #同时设置多个值
OK
127.0.0.1:6379> keys *
1) "k2"
2) "k3"
3) "k1"
127.0.0.1:6379> mget k1 k2 k3           #同时获取多个值
1) "v1"
2) "v2"
3) "v3"
127.0.0.1:6379> mset k1 v1 k4 v4
OK
127.0.0.1:6379> keys *
1) "k2"
2) "k3"
3) "k1"
4) "k4"
127.0.0.1:6379> msetnx k1 v1 k5 v5      #msetnx是原子操作,要么key都不存在才成功,要么只要存在哪怕一个key都会失败
(integer) 0
127.0.0.1:6379> keys *
1) "k2"
2) "k3"
3) "k1"
4) "k4"
# 对象
127.0.0.1:6379> set user:1 {name:zhangsan,age:21}  #设置一个user:1对象 值为json字符对象
OK
127.0.0.1:6379> get user
(nil)
127.0.0.1:6379> get user:1  
"{name:zhangsan,age:21}"
127.0.0.1:6379> get user:1:name
(nil)
127.0.0.1:6379> mset user:2:name lisi user:2:age 23  #这里key可以设计为:user:{id}:{filed}
OK
127.0.0.1:6379> mget user:2:name
1) "lisi"
127.0.0.1:6379> get user:2
(nil)
127.0.0.1:6379> mget user:2:name user:2:age
1) "lisi"
2) "23"
/**
getset 先get后set
*/
127.0.0.1:6379> getset myvalue redis  #如果不存在key值,则返回nil
(nil)
127.0.0.1:6379> get myvalue
"redis"
127.0.0.1:6379> getset myvalue mysql  #如果存在key值,获取原来值,并设置新值
"redis"
127.0.0.1:6379> get myvalue
"mysql"

string类型的使用场景:value可以是字符串还可以是数字

  • 计数器
  • 统计多单位的数量
  • 对象缓存存储

2.List(列表类型)

redis中的list可以当做栈或队列使用
list的命令只有push和pop才分左(lpush)右(rpush),其余命令前的l均表示list的意思,则命令均以l开头

/**
   list左新增和右新增,左或右取数据
*/
127.0.0.1:6379> lpush mylist 1     #将一个或者多个值,插入到列表头部(左)
(integer) 1
127.0.0.1:6379> lpush mylist 1 2
(integer) 3
127.0.0.1:6379> lrange mylist 0 -1 #获取list中的值
1) "2"
2) "1"
3) "1"
127.0.0.1:6379> rpush mylist 3 4   #将一个或者多个值,插入到列表尾部(右)
(integer) 5
127.0.0.1:6379> lrange mylist 0 -1
1) "2"
2) "1"
3) "1"
4) "3"
5) "4"
/**
   移除列表中的值
*/
127.0.0.1:6379> lpop mylist           #移除list的第一个元素
"2"
127.0.0.1:6379> lrange mylist 0 -1
1) "1"
2) "1"
3) "3"
4) "4"
127.0.0.1:6379> rpop mylist           #移除list的最后一个元素
"4"
127.0.0.1:6379> lrange mylist 0 -1
1) "1"
2) "1"
3) "3"
/**
   获取列表中的值
*/
127.0.0.1:6379> lrange mylist 0 -1
1) "1"
2) "1"
3) "3"
127.0.0.1:6379> lindex mylist 2     #通过下标获得list中的某一个值
"3"
127.0.0.1:6379> lindex mylist 0
"1"
/**
   获取列表长度
*/
127.0.0.1:6379> lpush list 1 2 3
(integer) 3
127.0.0.1:6379> lrange list 0 -1
1) "3"
2) "2"
3) "1"
127.0.0.1:6379> llen list          #返回列表的长度
(integer) 3
/**
   移除指定的值
*/
127.0.0.1:6379> lrange list 0 -1
1) "3"
2) "2"
3) "1"
127.0.0.1:6379> lrem list 1 2      #移除list集合中指定个数的值,精确匹配
(integer) 1
127.0.0.1:6379> lrange list 0 -1
1) "3"
2) "1"
/**
   让列表只保留指定区间内的元素,不在区间内的元素将被删除
*/
127.0.0.1:6379> lpush list h1 h2 h3 h4
(integer) 4
127.0.0.1:6379> lrange list 0 -1
1) "h4"
2) "h3"
3) "h2"
4) "h1"
127.0.0.1:6379> ltrim list 1 2     #通过下标截取指定区间内的元素,原列表会被改变
OK
127.0.0.1:6379> lrange list 0 -1
1) "h3"
2) "h2"
/**
    将列表中值移到新列表
*/
127.0.0.1:6379> lrange list 0 -1
1) "h3"
2) "h2"
127.0.0.1:6379> rpoplpush list listnew  #将列表中最后一个元素移动到新列表
"h2"
127.0.0.1:6379> lrange list 0 -1
1) "h3"
127.0.0.1:6379> lrange listnew 0 -1
1) "h2"
/**
    替换指定下标的值
*/
127.0.0.1:6379> lrange list 0 -1
(empty list or set)
127.0.0.1:6379> rpush list v1 v2 v3 v4
(integer) 4
127.0.0.1:6379> lrange list 0 -1
1) "v1"
2) "v2"
3) "v3"
4) "v4"
127.0.0.1:6379> lset list 1 hello       #替换指定下标的值
OK
127.0.0.1:6379> lrange list 0 -1
1) "v1"
2) "hello"
3) "v3"
4) "v4"
127.0.0.1:6379> lset list 4 noexits     #若指定下标不存在会报错
(error) ERR index out of range
/**
   将值插入到某个值的前面或后面
*/
127.0.0.1:6379> lrange list 0 -1
1) "v1"
2) "hello"
3) "v3"
4) "v4"
127.0.0.1:6379> linsert list before v1 before #在v1前面插入before
(integer) 5
127.0.0.1:6379> linsert list after v4 after   #在v4后面插入after
(integer) 6
127.0.0.1:6379> lrange list 0 -1
1) "before"
2) "v1"
3) "hello"
4) "v3"
5) "v4"
6) "after"

总结:

  • 列表实际上是一个链表
  • 如果移除了所有值,空链表,代表这个链表不存在
  • 在两边插入或改动值,效率最高!操作中间元素效率相对偏低
    消息队列(lpush rpop) 栈(lpush lpop)

3.set(集合)

set中的值是无序不重复的

127.0.0.1:6379> sadd myset a b c          #set集合中添加值
(integer) 3
127.0.0.1:6379> smembers myset            #查看指定set集合的所有值
1) "b"
2) "a"
3) "c"
127.0.0.1:6379> sadd myset a              #不能添加重复值
(integer) 0
127.0.0.1:6379> smembers myset
1) "b"
2) "a"
3) "c"
127.0.0.1:6379> sismember myset a        #判断一个值在set集合中是否存在
(integer) 1
127.0.0.1:6379> sismember myset d
(integer) 0
127.0.0.1:6379> scard myset              #查看集合中元素值个数
(integer) 3
127.0.0.1:6379> srem myset c             #移除集合中指定元素值
(integer) 1
127.0.0.1:6379> scard myset
(integer) 2
127.0.0.1:6379> smembers myset
1) "e"
2) "d"
3) "b"
4) "a"
5) "f"
127.0.0.1:6379> srandmember myset        #随机获取set集合中的一个值
"f"
127.0.0.1:6379> srandmember myset
"b"
127.0.0.1:6379> srandmember myset 2      #随机获取指定个数的值
1) "f"
2) "e"
127.0.0.1:6379> spop myset               #随机删除集合中一个值
"e"
127.0.0.1:6379> smembers myset
1) "f"
2) "d"
3) "a"
4) "b"
127.0.0.1:6379> smove myset myset2 a    #将集合myset中指定元素移动到另一个集合
(integer) 1
127.0.0.1:6379> smembers myset
1) "f"
2) "d"
3) "b"
127.0.0.1:6379> smembers myset2
1) "a"
127.0.0.1:6379> smembers myset2
1) "b"
2) "a"
127.0.0.1:6379> smembers myset
1) "f"
2) "d"
3) "b"
127.0.0.1:6379> sdiff myset myset2       #差集
1) "f"
2) "d"
127.0.0.1:6379> sinter myset myset2      #交集
1) "b"
127.0.0.1:6379> sunion myset myset2      #并集
1) "f"
2) "d"
3) "a"
4) "b"

4.Hash(哈希)

Map集合,存储key-value

127.0.0.1:6379> hset myhash k1 v1        #保存一个key-value
(integer) 1
127.0.0.1:6379> hget myhash k1           #获取一个key对应的value
"v1"
127.0.0.1:6379> hmset myhash k2 v2 k3 v3 #保存多个key-value
OK
127.0.0.1:6379> hmget myhash k1 k2 k3    #获取多个key对应的多个value
1) "v1"
2) "v2"
3) "v3"
127.0.0.1:6379> hgetall myhash           #获取所有的key和value
1) "k1"
2) "v1"
3) "k2"
4) "v2"
5) "k3"
6) "v3"
127.0.0.1:6379> hdel myhash k1           #删除一个key及其value
(integer) 1
127.0.0.1:6379> hgetall myhash
1) "k2"
2) "v2"
3) "k3"
4) "v3"
127.0.0.1:6379> hlen myhash             #获取集合长度
(integer) 2
127.0.0.1:6379> hlen myhash
(integer) 2
127.0.0.1:6379> hexists myhash k2       #判断集合中一个key是否存在
(integer) 1
127.0.0.1:6379> hexists myhash k1
(integer) 0
127.0.0.1:6379> hkeys myhash            #获取所有的key
1) "k2"
2) "k3"
127.0.0.1:6379> hvals myhash            #获取所有的value
1) "v2"
2) "v3"
127.0.0.1:6379> hset myhash k4 2        
(integer) 1
127.0.0.1:6379> hincrby myhash k4 2     #将数值value加2
(integer) 4
127.0.0.1:6379> hincrby myhash k4 -1    #将数值value减1
(integer) 3
127.0.0.1:6379> hsetnx myhash k5 zhangsan  #key不存在则保存,存在则保存失败
(integer) 1
127.0.0.1:6379> hsetnx myhash k5 lisi
(integer) 0

hash一般用来存储像用户信息一类的对象信息,string更适合字符串保存

5.Zset(有序集合)

在set的基础上增加了一个排序的值,set k1 v1 zset k1 score1 v1

127.0.0.1:6379> zadd myzset 1 v1        #添加一个值
(integer) 1
127.0.0.1:6379> zadd myzset 2 v2 3 v3   #添加多个值
(integer) 2
127.0.0.1:6379> zrange myzset 0 -1      #获取所有值
1) "v1"
2) "v2"
3) "v3"
127.0.0.1:6379> zrangebyscore myzset -inf +inf  #显示所有值,升序排序
1) "v1"
2) "v2"
3) "v3"
127.0.0.1:6379> zrevrange myzset 0 -1       #显示所有值,降序排序
1) "v3"
2) "v2"
3) "v1"
127.0.0.1:6379> zrangebyscore myzset -inf 100 withscores #显示小于100的升序,并显示排序依据值
1) "v1"
2) "1"
3) "v2"
4) "2"
5) "v3"
6) "3"
127.0.0.1:6379> zrem myzset v1        #移除有序集合中指定元素
(integer) 1
127.0.0.1:6379> zcard myzset          #获取有序集合中的个数
(integer) 2
127.0.0.1:6379> zadd myzset 4 v4 5 v5
(integer) 2
127.0.0.1:6379> zrange myzset 0 -1
1) "v2"
2) "v3"
3) "v4"
4) "v5"
127.0.0.1:6379> zcount myzset 3 4     #获取指定区间的值的个数
(integer) 2

一般用于需要排序的场景,比如排行榜

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

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

相关文章

String、StringBufer、StringBuild类

文章目录 1. String1.1 String的特性1.2 String的不可变的特性理解1.3 String不同实例化方式的对比1.4 *String中的常用方法1.5 String与其他类型之间的转换1.5.1 String与基本数据类型、包装类之间的转换1.5.2 String与字符数组(char[])之间的转换 2. StringBuffer类2.1 Strin…

如何从菜鸟变成大佬:提升写文案的技巧

其实很多人都不知道文案是什么? 他们分不清文案和日常的写作之间的区别。 其实,文案和日常的写作的最大区别就是是否能够产生销售力。 比如你平时写作文、写博客、写情感文章、写政府报告,公文、写书之类的,都不属于文案的范畴…

基于线上考研资讯数据抓取的推荐系统的设计与实现(论文+源码)_kaic

摘 要 随着互联网的飞速发展,互联网在各行各业的应用迅速成为众多学校关注的焦点。他们利用互联网提供电子商务服务,然后有了“考研信息平台”,这将使学生考研的信息平台更加方便和简单。 对于考研信息平台的设计,大多采用java技…

Ae:绘画面板

Ae菜单:窗口/绘画 Paint 快捷键:Ctrl 8 绘画工具(画笔工具、仿制图章工具及橡皮擦工具)仅能工作在图层面板上。在使用绘画工具之前,建议先在绘画 Paint面板中查看或进行相关设置。 说明: 如果要在绘画描边…

尝试通过俄罗斯方块解释程序员这个职业

每到毕业季和高考季,总会有相关的职业前景咨询环节等待着我,不管我愿不愿意~~。 每次我都会变着法向众人解释程序员这个职业,声泪俱下地描述互联网各种血泪史,先去考公不要进坑云云。可是效果非常不好,7、8月份这群人…

使用docker compose 安装最新版neo4j

一、Neo4j和图数据库简介 neo4j是基于Java语言编写图形数据库。图是一组节点和连接这些节点的关系。图形数据库也被称为图形数据库管理系统或GDBMS。 Neo4j的是一种流行的图形数据库。 其他的图形数据库是Oracle NoSQL数据库,OrientDB,HypherGraphDB&am…

AIGC周报|下一个裁谁?老板:问问AI;OpenAI推出Shap·E;库克:AI仍有不少问题要解决

AIGC(AI Generated Content)即人工智能生成内容。近期爆火的 AI 聊天机器人 ChatGPT,以及 DallE 2、Stable Diffusion 等文生图模型,都属于 AIGC 的典型案例,它们通过借鉴现有的、人类创造的内容来快速完成内容创作。 …

网络基础之应用层协议,组织方式,自定义协议和http协议https协议简单介绍

网络基础之应用层协议 应用层介绍应用层是什么 组织方式序列化反序列化常见的自定义序列化方式 HTTP协议——超文本传输协议(最早就是用来传输web网页传输的)HTTP协议的特性HTTP协议的格式: HTTP 请求请求行HTTP常见HeaderHTTP常见状态码 HTT…

asp.net+C#公交线路换乘查询系统

系统功能结构图 (1)用户查询模块 在用户查询模块中,主要是查询出用户自己所需要的线路信息,这也是整个系统最主要的功能模块。主要包括: ①查询车次信息:输入要查询的车次进行搜索,可以查询出于它相应的站点名和站点描…

unity航点寻径

一、游戏框架:设置了六个路标,角色会在这六个路标之间一次移动,当移动到第六个路标后又会返回第一个路标,继续依次移动。 road: 道路,由五个立方体组成 sign:路标,由六个胶囊组成 …

系统集成项目管理工程师 下午 真题 及考点(2020年下半年)

文章目录 2020年下半年试题一:第10章 项目质量管理,规划质量管理过程的输入试题二:第9章 项目成本管理,典型:EAC ACETC AC(BAC-EV)/CPI BAC/CPI试题三:第18章 项目风险管理&#x…

Grafana 系列-统一展示-3-Prometheus 仪表板

系列文章 Grafana 系列文章 知识储备 Prometheus Template Variables 你可以使用变量来代替硬编码的细节,如 server、app 和 pod_name 在 metric 查询中。Grafana 在仪表盘顶部的下拉选择框中列出这些变量,帮助你改变仪表盘中显示的数据。Grafana 将…

【Java EE】-Servlet(四) Cookie和Session

作者:学Java的冬瓜 博客主页:☀冬瓜的主页🌙 专栏:【JavaEE】 分享: 寂寞会发慌,孤独是饱满的。——史铁生《命若琴弦》 主要内容:Cookie的理解,Cookie是什么?Cookie从哪里来&#x…

【消息中间件】kafka高性能设计之内存池

文章目录 前言实现创建内存池分配内存释放内存 总结 前言 Kafka的内存池是一个用于管理内存分配的缓存区域。它通过在内存上保留一块固定大小的内存池,用于分配消息缓存、批处理缓存等对象,以减少频繁调用内存分配函数的开销。 Kafka内存池的实现利用了…

怎么在本地运行umi框架的生产模式

怎么在本地运行umi框架的生产模式 第一种 先使用build进行编译构建, 在webstorm软件上可以在package.json文件上点击运行;或者直接在命令行上敲max build进行构建, 构建好后就会多个dist目录,里面就是编译好的静态文件。 然后在package.json中添加 "serve&qu…

UDP通信机制详解

欢迎关注博主 Mindtechnist 或加入【Linux C/C/Python社区】一起学习和分享Linux、C、C、Python、Matlab,机器人运动控制、多机器人协作,智能优化算法,滤波估计、多传感器信息融合,机器学习,人工智能等相关领域的知识和…

Helm常用命令记录

问: 到哪里去搜索helm package? 答: artifacthub.io helm versionhelm repo add bitnami https://charts.bitnami.com/bitnamihelm install my-release bitnmai/mysqlkubectl get po --all-namespaceshelm uninstall my-release 安装monitoring,推荐kube-prometheus-stack&am…

【SWAT水文模型】SWAT水文模型建立及应用第三期:基于世界土壤数据库HWSD建立土壤库

SWAT水文模型建立及应用:土壤库建立 1 简介2 土壤数据下载2.1 数据下载方式2.1.1 世界土壤数据库HWSD数据2.1.2 中国土壤数据库 2.2 数据下载 3 土壤数据的准备3.1 SWAT土壤数据库参数3.2 提取HWSD中土壤参数3.3 土壤类型分布图的处理3.4 土壤质地转化3.5 土壤参数的…

人工智能浪潮中,AI如何为企业降本增效?

人工智能浪潮下,企业应如何抓住机遇,用AI降本增效?如何选择适合自身产业的人工智能服务?如果你想了解更多,本文或许能给你提供一点思路。 一、企业如何利用AI降本增效 在人工智能浪潮下,已有多款AI产品问世…

京东APP百亿级商品与车关系数据检索实践 | 京东云技术团队

导读 本文主要讲解了京东百亿级商品车型适配数据存储结构设计以及怎样实现适配接口的高性能查询。通过京东百亿级数据缓存架构设计实践案例,简单剖析了jimdb的位图(bitmap)函数和lua脚本应用在高性能场景。希望通过本文,读者可以对缓存的内部结构知识有…