redis02——一篇终结redis的五种数据类型操作命令(可学习、复习、面试、收藏备用)(上)

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Tair(兼容Redis),内存型 2GB
简介: redis02——一篇终结redis的五种数据类型操作命令(可学习、复习、面试、收藏备用)

redis的常用数据操作命令

redis的操作命令相当于mysql中的sql语句,可以用来对于数据进行增删改查等操作。

1 redis有关key的操作

1.1 查看数据库中的key

语法:keys pattern

作用:查找所有符合模式pattern的key. pattern可以使用通配符。

通配符:

*:表示0或多个字符,例如:keys * 查询所有的key。

?:表示单个字符,例如:wo?d , 匹配 word , wood

[] :表示选择[]内的一个字符,例如wo[or]d, 匹配word, wood, 不匹配wold、woord



demo如下

127.0.0.1:6379> set k1 v1
OK
127.0.0.1:6379> set k2 v2
OK
127.0.0.1:6379> set o3 v3
OK
127.0.0.1:6379> keys k*
1) "k2"
2) "k1"
127.0.0.1:6379> set hello hello
OK
127.0.0.1:6379> keys h[ade]llo
1) "hello"

1.2 判断key是否存在

语法:exists key [key…]

作用:判断key是否存在

返回值:整数,存在key返回1,其他返回0。使用多个key,返回存在的key的数量。

demo如下

127.0.0.1:6379> exists hello
(integer) 1
127.0.0.1:6379> exists hello k1 k2 k3
(integer) 3

1.3 移动key到指定的数据库

语法:move key db

作用:移动key到指定的数据库,移动的key在原库被删除。

返回值:移动成功返回1,失败返回0.

demo如下

127.0.0.1:6379> keys *
1) "k2"
2) "o3"
3) "k1"
4) "hello"
127.0.0.1:6379> move o3 1
(integer) 1
127.0.0.1:6379> keys *
1) "k2"
2) "k1"
3) "hello"

1.4 设置key的生存时间

redis会将数据存放在内存中,如果不及时清除不被使用不被使用的数据,将会消耗内存的资源,除了手动删除外,也可以给数据设置生存时间。

语法:expire key seconds

作用:设置key的生存时间,超过时间,key自动删除。单位是秒。

返回值:设置成功返回数字 1,其他情况是 0 。

127.0.0.1:6379> expire k2 20
(integer) 1

1.5查看key的剩余生存时间

可以使用ttl key查看key的剩余生存时间。

语法:ttl key

作用:查看key的剩余生存时间(ttl: time to live),以秒为单位。

返回值:

-1 :没有设置key的生存时间, key永不过期。

-2:key不存在

demo如下

127.0.0.1:6379> ttl k2
(integer) 7

1.6 查看key所存储值的数据类型

语法:type key

作用:查看key所存储值的数据类型

返回值:字符串表示的数据类型

none (key不存在)

string (字符串)

list (列表)

set (集合)

zset (有序集)

hash (哈希表)

demo如下

127.0.0.1:6379> type k1
string

1.7 重命名key(不推荐)

语法:rename key newkey

作用:将key改为名newkey。当 key 和 newkey 相同,或者 key 不存在时,返回一个错误。

当 newkey 已经存在时, RENAME 命令将覆盖旧值。

demo如下

127.0.0.1:6379> keys *
1) "k1"
2) "hello"
127.0.0.1:6379> rename hello k2
OK
127.0.0.1:6379> keys *
1) "k1"
2) "k2"

1.8 删除存在的key

语法:del key [key…]

作用:删除存在的key,不存在的key忽略。

返回值:数字,删除的key的数量。

demo如下

127.0.0.1:6379> del k1
(integer) 1
127.0.0.1:6379> keys *
1) "k2"

2.操作字符串类型数据(string)

字符串类型是Redis中最基本的数据类型,它能存储任何形式的字符串,包括二进制数据,序列化后的数据,JSON化的对象甚至是一张图片。

字符串类型的数据操作总的思想是通过key操作value,key是数据标识,value是我们感兴趣的业务数据。

2.1 添加string数据

语法:set key value

功能:将字符串值 value 设置到 key 中,如果key已存在,后放的值会把前放的值覆盖掉。

返回值:OK表示成功

demo如下

127.0.0.1:6379> set zhangsan zhangsan
OK

2.2 获取 key 中设置的字符串值

语法:get key

功能:获取 key 中设置的字符串值

返回值:key存在,返回key对应的value;

key不存在,返回nil

demo如下

127.0.0.1:6379> set zhangsan zs
OK
127.0.0.1:6379> get zhangsan
"zs"

2.3 追加字符串

语法:append key value

功能:如果 key 存在,则将 value 追加到 key 原来旧值的末尾

如果 key 不存在,则将新增key,将value 设置值为 value

返回值:追加字符串之后的总长度(字符个数)

demo如下

127.0.0.1:6379> append zhangsan zs
(integer) 4
127.0.0.1:6379> get zhangsan
"zszs"

2.4获取字符串值的长度

语法:strlen key

功能:返回 key 所储存的字符串值的长度

返回值:如果key存在,返回字符串值的长度;

key不存在,返回0

demo如下

127.0.0.1:6379> STRLEN zhangsan
(integer) 4

2.5 将字符串数字值自增

语法:incr key

功能:将 key 中储存的数字值加1,如果 key 不存在,则 key 的值先被初始化为 0 再执行incr操作。,非数字值类型报错

返回值:返回加1后的key值

demo如下

127.0.0.1:6379> set zsage 10
OK
127.0.0.1:6379> INCR zsage
(integer) 11
127.0.0.1:6379> INCR zhangsan
(error) ERR value is not an integer or out of range

2.6 将字符串数字值自减

语法:decr key

功能:将 key 中储存的数字值减1,如果 key 不存在,则么 key 的值先被初始化为 0 再执行 decr 操作。

返回值:返回减1后的key值

demo如下

127.0.0.1:6379> DECR zsage
(integer) 10

2.7 将字符串数字值改变偏移量

将字符串数字值增加偏移量

语法:incrby key offset

功能:将 key 所储存的值加上增量值,如果 key 不存在,则 key 的值先被初始化为 0 再执行

INCRBY 命令。

返回值:返回增量之后的key值。

demo如下

127.0.0.1:6379> INCRBY zsage 3
(integer) 13

将字符串数字值减少偏移量

语法:decrby key offset

功能:将 key 所储存的值减去减量值,如果 key 不存在,则 key 的值先被初始化为 0 再执行 DECRBY 命令。

返回值:返回减量之后的key值。

demo如下

127.0.0.1:6379> DECRBY zsage 2
(integer) 11

2.8 截取字符串

语法:getrange key startIndex endIndex

功能:获取 key 中字符串值从 startIndex 开始到 endIndex 结束的子字符串,包括startIndex和endIndex, 下标从0开始,负数表示从字符串的末尾开始,-1 表示最后一个字符。截取的子字符串是闭区间截取的。

demo如下

127.0.0.1:6379> getrange wz 2 6
"ngzho"
127.0.0.1:6379> getrange wz 1 -1
"angzhoushishuaige"

2.9 修改(覆盖)字符串

语法:setrange key offsetIndex value

功能:用value覆盖key的存储的值从offset开始,能够覆盖几个就是几个。

返回值:修改后的字符串的长度。

demo如下

127.0.0.1:6379> setrange wz 4 xiaopengyou
(integer) 18
127.0.0.1:6379> get wz
"wangxiaopengyouige"

2.10 设置数据的同时设置生存时间

语法:setex key seconds value

功能:设置key的值,并将 key 的生存时间设为 seconds (以秒为单位) ,如果key已经存在,将覆盖旧值。

返回值:设置成功,返回OK。

demo如下

127.0.0.1:6379> setex k3 20 v3
OK

2.11 设置字符串数据(不重复)

语法:setnx key value

功能:setnx 是 set if not exists 的简写,如果key不存在,则 set 值,存在则不设置值。

返回值:设置成功,返回1

设置失败,返回0

demo如下

127.0.0.1:6379> setnx k4 v4
(integer) 1
127.0.0.1:6379> setnx k4 v4
(integer) 0

2.12 同时设置一个或多个字符串数据

语法:mset key value [key value…]

功能:同时设置一个或多个 key-value 对

返回值:设置成功,返回OK。

2.13 同时获取一个或多个字符串数据

语法:mget key [key …]

功能:获取所有(一个或多个)给定 key 的值

返回值:包含所有key的列表,如果key不存在,则返回nil。

demo如下

127.0.0.1:6379> mset k4 v4 k5 v5
OK
127.0.0.1:6379> mget k1 k2 k3 k4 k5
1) (nil)
2) "hello"
3) (nil)
4) "v4"
5) "v5"

2.14 设置多个字符串数据(不重复)

语法:msetnx key value[key value…]

功能:同时设置一个或多个 key-value 对,如果有一个key是存在的,则设置不成功。

返回值:设置成功,返回1

设置失败,返回0

demo如下

127.0.0.1:6379> msetnx k5 vv k6 v6
(integer) 0

3.操作列表类型数据(list)

Redis列表是简单的字符串列表,按照插入顺序排序,左边(头部)、右边(尾部)或者中间都可以添加元素。链表的操作无论是头或者尾效率都极高,但是如果对中间元素进行操作,那效率会大大降低了。

列表类型的数据操作总的思想是通过key和下标操作value,key是数据标识,下标是数据在列表中的位置,value是我们感兴趣的业务数据。表头元素的下标是0,依次往后下标都是前一个下标加1.当然也可以按照表尾为-1,依次往前下标减1来表示。

其主要的操作可以参考下图,下面我们将一一讲解。

935bcba8dc104037b2910348791622da.png

3.1 将一个或多个值依次插入列表表头

语法:lpush key value [value…]

功能:将一个或多个值 value 插入到列表 key 的最左边(表头),各个value值依次插入到表头位置。

返回值:插入之后的列表的长度。

demo如下

127.0.0.1:6379> lpush list01 1 2 3
(integer) 3

3.2 将一个或多个值依次插入列表表尾

语法:rpush key value [value…]

功能:将一个或多个值 value 插入到列表 key 的最右边(表尾),各个 value 值按依次插入到表尾。

返回值:插入之后的列表的长度。

demo如下

127.0.0.1:6379> rpush list02 3 2 1
(integer) 3

3.3 获取列表的元素

语法:lrange key startIndex endIndex

功能:获取列表 key 中指定下标区间内的元素,下标从0开始,到列表长度-1;下标也可以是负数,表示列表从后往前取,-1表示倒数第一个元素,-2表示倒数第二个元素,以此类推;startIndex和endIndex超出范围不会报错。

返回值:获取到的元素列表。

demo如下

127.0.0.1:6379> lrange list01 0 2
1) "3"
2) "2"
3) "1"

3.4 移除并返回列表头部第一个元素

语法:lpop key

功能:移除并返回列表key头部第一个元素,即列表左侧的第一个元素。

返回值:列表左侧第一个元素的值;列表key不存在,返回nil。

demo如下

127.0.0.1:6379> lpop list01
"3"
127.0.0.1:6379> lrange list01 0 2
1) "2"
2) "1"

3.5 移除并返回列表尾部第一个元素

语法:rpop key

功能:移除并返回列表key尾部第一个元素,即列表右侧的第一个元素。

返回值:列表右侧第一个元素的值;列表key不存在,返回nil。

demo如下

127.0.0.1:6379> rpop list01
"1"
127.0.0.1:6379> lrange list01 0 2
1) "2"

3.6 获取列表指定下标元素

语法:lindex key index

功能:获取列表 key 中下标为指定 index 的元素,列表元素不删除,只是查询。0 表示列表的第一个元素,1 表示列表的第二个元素;index也可以负数的下标, -1 表示列表的最后一个元素-2 表示列表的倒数第二个元素,以此类推。

返回值:key存在时,返回指定元素的值;

Key不存在时,返回nil。

demo如下

127.0.0.1:6379> lindex list02 1
"2"

3.7 获取列表的长度

语法:llen key

功能:获取列表 key 的长度

返回值:数值,列表的长度;key不存在返回0

demo如下

127.0.0.1:6379> llen list02
(integer) 3

3.8 批量移除列表值为value的元素

语法:lrem key count value

功能:根据参数 count 的值,移除列表中与参数 value 相等的元素,

count >0 ,从列表的左侧向右开始移除count个元素;

count < 0 从列表的尾部开始移除count个元素;

count = 0移除表中所有与 value 相等的值。

返回值:数值,移除的元素个数

demo如下

127.0.0.1:6379> lpush list03 a b c a d e a
(integer) 7
127.0.0.1:6379> lrem list03 1 a
(integer) 1
127.0.0.1:6379> lrange list03 0 -1
1) "e"
2) "d"
3) "a"
4) "c"
5) "b"
6) "a"

3.9 截取列表指定下标区间的元素

语法:ltrim key startIndex endIndex

功能:截取key的指定下标区间的元素,并且赋值给key。

下标从0开始,一直到列表长度-1;下标也可以是负数,表示列表从后往前取,-1表示倒数第一个元素,-2表示倒数第二个元素,以此类推;startIndex和endIndex超出范围不会报错。

返回值:执行成功返回ok

demo如下

127.0.0.1:6379> ltrim list03 0 -2
OK
127.0.0.1:6379> lrange list03 0 -1
1) "e"
2) "d"
3) "a"
4) "c"
5) "b"

3.10 修改列表指定下标的元素

语法:lset key index value

功能:将列表 key 下标为 index 的元素的值设置为 value。

功能:设置成功返回ok ; key不存在或者index超出范围返回错误信息。

demo如下

127.0.0.1:6379> lrange list01 0 -1
1) "3"
2) "2"
3) "1"
4) "0"
127.0.0.1:6379> lset list01 0 4
OK
127.0.0.1:6379> lrange list01 0 -1
1) "4"
2) "2"
3) "1"
4) "0"

3.11 在指定位置插入元素

语法:linsert key before/after pivot value

功能:将值 value 插入到列表 key 当中位于值 pivot 之前或之后的位置。key不存在或者pivot不在列表中,不执行任何操作。

返回值:命令执行成功,返回新列表的长度。没有找到pivot返回 -1, key不存在返回0。

demo如下

127.0.0.1:6379> linsert list01 before 2 x
(integer) 5
127.0.0.1:6379> lrange list01 0 -1
1) "4"
2) "x"
3) "2"
4) "1"
5) "0"


相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
6天前
|
存储 缓存 NoSQL
解决Redis缓存数据类型丢失问题
解决Redis缓存数据类型丢失问题
121 85
|
1月前
|
缓存 NoSQL 关系型数据库
大厂面试高频:如何解决Redis缓存雪崩、缓存穿透、缓存并发等5大难题
本文详解缓存雪崩、缓存穿透、缓存并发及缓存预热等问题,提供高可用解决方案,帮助你在大厂面试和实际工作中应对这些常见并发场景。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
大厂面试高频:如何解决Redis缓存雪崩、缓存穿透、缓存并发等5大难题
|
21天前
|
存储 NoSQL Redis
redis常见数据类型
Redis 是一种基于内存的键值存储数据库,支持字符串、哈希表、列表、集合及有序集合等多种数据类型,每种类型均有特定用途与适用场景,提供丰富的命令操作,适用于高速数据访问与处理。
35 5
|
1月前
|
存储 NoSQL 算法
阿里面试:亿级 redis 排行榜,如何设计?
本文由40岁老架构师尼恩撰写,针对近期读者在一线互联网企业面试中遇到的高频面试题进行系统化梳理,如使用ZSET排序统计、亿级用户排行榜设计等。文章详细介绍了Redis的四大统计(基数统计、二值统计、排序统计、聚合统计)原理和应用场景,重点讲解了Redis有序集合(Sorted Set)的使用方法和命令,以及如何设计社交点赞系统和游戏玩家排行榜。此外,还探讨了超高并发下Redis热key分治原理、亿级用户排行榜的范围分片设计、Redis Cluster集群持久化方式等内容。文章最后提供了大量面试真题和解决方案,帮助读者提升技术实力,顺利通过面试。
|
1月前
|
存储 NoSQL 算法
面试官:Redis 大 key 多 key,你要怎么拆分?
本文介绍了在Redis中处理大key和多key的几种策略,包括将大value拆分成多个key-value对、对包含大量元素的数据结构进行分桶处理、通过Hash结构减少key数量,以及如何合理拆分大Bitmap或布隆过滤器以提高效率和减少内存占用。这些方法有助于优化Redis性能,特别是在数据量庞大的场景下。
面试官:Redis 大 key 多 key,你要怎么拆分?
|
1月前
|
存储 缓存 Java
大厂面试必看!Java基本数据类型和包装类的那些坑
本文介绍了Java中的基本数据类型和包装类,包括整数类型、浮点数类型、字符类型和布尔类型。详细讲解了每种类型的特性和应用场景,并探讨了包装类的引入原因、装箱与拆箱机制以及缓存机制。最后总结了面试中常见的相关考点,帮助读者更好地理解和应对面试中的问题。
61 4
|
1月前
|
存储 消息中间件 NoSQL
使用Java操作Redis数据类型的详解指南
通过使用Jedis库,可以在Java中方便地操作Redis的各种数据类型。本文详细介绍了字符串、哈希、列表、集合和有序集合的基本操作及其对应的Java实现。这些示例展示了如何使用Java与Redis进行交互,为开发高效的Redis客户端应用程序提供了基础。希望本文的指南能帮助您更好地理解和使用Redis,提升应用程序的性能和可靠性。
41 1
|
4月前
|
存储 Java
【IO面试题 四】、介绍一下Java的序列化与反序列化
Java的序列化与反序列化允许对象通过实现Serializable接口转换成字节序列并存储或传输,之后可以通过ObjectInputStream和ObjectOutputStream的方法将这些字节序列恢复成对象。
|
1月前
|
存储 缓存 算法
面试官:单核 CPU 支持 Java 多线程吗?为什么?被问懵了!
本文介绍了多线程环境下的几个关键概念,包括时间片、超线程、上下文切换及其影响因素,以及线程调度的两种方式——抢占式调度和协同式调度。文章还讨论了减少上下文切换次数以提高多线程程序效率的方法,如无锁并发编程、使用CAS算法等,并提出了合理的线程数量配置策略,以平衡CPU利用率和线程切换开销。
面试官:单核 CPU 支持 Java 多线程吗?为什么?被问懵了!
|
1月前
|
存储 算法 Java
大厂面试高频:什么是自旋锁?Java 实现自旋锁的原理?
本文详解自旋锁的概念、优缺点、使用场景及Java实现。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
大厂面试高频:什么是自旋锁?Java 实现自旋锁的原理?