写点什么

解析 Redis 操作五大数据类型常用命令

  • 2021 年 12 月 21 日
  • 本文字数:3227 字

    阅读完需:约 11 分钟

​​摘要:分享经常用到一些命令和使用场景总结,以及对 Redis 中五大数据类型如何使用 cmd 命令行的形式进行操作的方法。

 

本文分享自华为云社区《Redis操作五大数据类型常用命令解析》,作者:灰小猿。

Redis 的几个常用命令

数据库切换


我们知道 Redis 默认有 16 个数据库,默认是第 0 个数据库,那么如果在需要对数据库进行切换的时候,我们就可以使用下面这个命令:


使用如下命令进行切换


SELECT index
复制代码


清除当前数据库的数据


如果想要清除指定某一个数据库的数据


flushdb
复制代码


​清除所有数据库的数据


flushall
复制代码


查看数据库所有 key


接下来这个命令应该是最常用的了


keys *
复制代码


判断某个键是否存在


平常在开发中,我们还需要经常对 key 进行判断,判断其是否存在


exists key
复制代码


设置过期时间和查看剩余时间


因为我们设置的缓存数据一般都不能是永久的,这个时候就需要我们在存储数据的时候,就为其设置过期时间。


127.0.0.1:6379> expire test01 10(integer) 1127.0.0.1:6379> ttl test01(integer) -2
复制代码


查看当前 key 的类型


type keyname
复制代码


string 数据类型


string 类型是 Redis 中五大基本数据类型之一,这也是最常使用到的一个数据类型,所有很多小伙伴们对 Redis 的认识和操作就仅仅的停留在了对 Redis 的操作层面,但是你是否知道 string 类型中的相关命令,还是有非常多实用的

String 类型存取基本操作


接下来先看一下对 string 类型进行基本存储和获取的命令。


127.0.0.1:6379> set key1 v1  #设置key和valueOK127.0.0.1:6379> get key1  #获取key对应的value"v1"127.0.0.1:6379> keys *  #获取所有的key1) "key1"2) "mykey"3) "hxy"4) "site-list"5) "hxy2"6) "huixiaoyuan"127.0.0.1:6379> exists key1  #查看当前key是否存在(integer) 1127.0.0.1:6379> append key1 hello  #给当前key的value后面追加(integer) 7127.0.0.1:6379> strlen key1  #获取value的长度(integer) 7
复制代码


递增递减操作


如果我们存储的 string 中的内容是数字的话,我们也可以对其进行增或减操作,Redis 可以自动的对字符串进行相关的操作。实现的命令如下:


127.0.0.1:6379> set views 0OK127.0.0.1:6379> get views"0"127.0.0.1:6379> incr views(integer) 1127.0.0.1:6379> decr views(integer) 1127.0.0.1:6379> incrby views 10(integer) 9127.0.0.1:6379> decrby view 9(integer) -9127.0.0.1:6379> get views"9"127.0.0.1:6379> decrby views 9(integer) 0127.0.0.1:6379>
复制代码

setex 和 setnx 使用


  • setex 设置过期时间

  • setnx 不存在再设置,如果存在就设置不成功。常用于分布式锁

#设置key3的值为hello,过期时间为30秒127.0.0.1:6379> setex key3 30 helloOK127.0.0.1:6379> ttl key3(integer) 21127.0.0.1:6379> get key3"hello"127.0.0.1:6379> setnx mykey2 redis(integer) 1127.0.0.1:6379> setnx mykey2 hxy(integer) 0127.0.0.1:6379> get mykey2"redis"127.0.0.1:6379>
复制代码


mset 和 mget 进行批量设置


使用 msetnx 时,同时设置一个或多个 key-value 对,当且仅当所有给定 key 都不存在时才成立。


127.0.0.1:6379> mset k1 v1 k2 v2 k3 v3OK127.0.0.1:6379> mget k1 k2 k31) "v1"2) "v2"3) "v3"127.0.0.1:6379> msetnx k1 v1 k4 v4(integer) 0127.0.0.1:6379> get k4(nil)127.0.0.1:6379>
复制代码


getset 命令使用


getset 命令从字面意思就可以看出来,他的作用是先 get 再 set。


#如果不存在值,则返回null127.0.0.1:6379> getset k5 v5(nil)127.0.0.1:6379> get k5"v5"如果存在值,就先获取再设置新的值127.0.0.1:6379> getset k5 vv5"v5"127.0.0.1:6379> get k5"vv5"
复制代码


​总结 string 类似的使用场景:

  • 计数器

  • 统计多单位数量

  • 对象缓存存储

  • 粉丝数

list 数据类型

list 存取基本操作


在使用 list 类型进行存取的时候,有两个命令需要进行区分:

  • lpush:从左边插入元素

  • rpush:从右边插入元素


127.0.0.1:6379> lpush list1 v1(integer) 1127.0.0.1:6379> lpush list1 v2(integer) 2127.0.0.1:6379> lpush list1 v3(integer) 3127.0.0.1:6379> lrange list1 0 11) "v3"2) "v2"127.0.0.1:6379> rpush list1 v4(integer) 4127.0.0.1:6379> lrange list1 0 41) "v3"2) "v2"3) "v1"4) "v4"
复制代码


list 类型移除元素


  • lpop 从左边删除

  • rpop 从右边删除

  • lrange keyname 0 -1 获取 list 中的全部元素


127.0.0.1:6379> lpop list1"v3"127.0.0.1:6379> rpop list1"v4"127.0.0.1:6379> lrange list1 0 -11) "v2"2) "v1"127.0.0.1:6379>
复制代码


注意:只有 pop 和 push 才分左右,其他的 l 都是 list 的意思


总结:

  • redis 中的 list 其实是一个链表。before node after,left,right 都可以插入值

  • 如果 key 不存在,就创建新的链表

  • 如果 key 存在,就新增内容

  • 如果移除了所有值,空链表,也代表不存在

  • 在两边插入或改动值效率最高,中间元素效率相对来说会低一点

set 集合

set 集合存取基本操作


127.0.0.1:6379> sadd myset hello(integer) 1127.0.0.1:6379> sadd myset hello2(integer) 1127.0.0.1:6379> sadd myset hello3(integer) 1127.0.0.1:6379> smembers myset1) "hello"2) "hello3"3) "hello2"127.0.0.1:6379> sismember myset hello(integer) 1127.0.0.1:6379> sismember myset world(integer) 0127.0.0.1:6379>
复制代码


获取 set 中元素个数


127.0.0.1:6379> scard myset(integer) 3
复制代码


移除 set 集合中的指定元素


127.0.0.1:6379> srem myset hello(integer) 1127.0.0.1:6379> scard myset(integer) 2
复制代码


随机抽选出指定个数的元素


127.0.0.1:6379> srandmember myset"hello3"127.0.0.1:6379> srandmember myset 21) "hello2"2) "hello3"
复制代码


随机删除一个元素


127.0.0.1:6379> spop myset"hello2"
复制代码


SDIFF 差集 SINTER 交集 SUNION 并集


SDIFF keyname1 keyname2
复制代码


​总结 set 集合一般用于元素的不重复的场景,比如抽奖系统,轮播等场景下

Hash(哈希)

Hash 存取基本操作


在使用 hash 集合的时候,要注意,hash 其实就是一个 Map 集合,key-map 的时候,值是一个 map 集合的形式进行存储的,也和 Java 中的 hashmap 有一个类似。


#set一个具体的key-value127.0.0.1:6379> hset myhash fieid1 v1(integer) 1127.0.0.1:6379> hget myhash fieid1"v1"#set多个key-value127.0.0.1:6379> hmset myhash fieid1 v1 fieid2 v2OK#get多个字段值127.0.0.1:6379> hmget myhash fieid1 fieid21) "v1"2) "v2"
复制代码


​HVALS 获取所有的 value,HKEYS 获取所有的 key,HGETALL 获取所有的键值


127.0.0.1:6379> HVALS myhash1) "v1"2) "v2"127.0.0.1:6379> HKEYS myhash1) "fieid1"2) "fieid2"127.0.0.1:6379> HGETALL myhash1) "fieid1"2) "v1"3) "fieid2"4) "v2"
复制代码


总结:

hash 可以用于存储变更的数据,比如 user,name,age 等,尤其是用户信息之类的,hash 更加适合用于对象的存储,string 更加适合用于字符串的存储。

Zset(有序集合)


在 set 集合的基础上增加一个序列号,来进行排序

Zset 有序集合存取基本操作


127.0.0.1:6379> ZADD salary 2500 xiaohong(integer) 1127.0.0.1:6379> ZADD salary 6000 dahui(integer) 1127.0.0.1:6379> ZADD salary 1000 wanggang(integer) 1#指定输出范围是负无穷到正无穷,按照从小到大排序,127.0.0.1:6379> ZRANGEBYSCORE salary -inf +inf1) "wanggang"2) "xiaohong"3) "dahui"# 从大到小排序127.0.0.1:6379> ZREVRANGE salary 0 -11) "dahui"2) "xiaohong"3) "wanggang"
复制代码


​ZRANGEBYSCORE 使用语法


ZRANGEBYSCORE key min max
复制代码


显示所有数据,并且 key 和 value 同时显示


127.0.0.1:6379>  ZRANGEBYSCORE salary -inf +inf withscores1) "wanggang"2) "1000"3) "xiaohong"4) "2500"5) "dahui"6) "6000"
复制代码


获取集合中元素的个数


127.0.0.1:6379> ZCARD salary(integer) 3
复制代码


总结

  • 案例思路:set 排序,存储班级成绩,工资表排序

  • 普通消息 1,重要消息 2,带权重进行判断

  • 排行榜应用实现


以上是在对五种数据类型进行存取时的一些常用命令操作。关于其他的命令使用,小伙伴们在用到的时候可以直接入官网查看就可以了。


点击关注,第一时间了解华为云新鲜技术~

发布于: 1 小时前阅读数: 4
用户头像

提供全面深入的云计算技术干货 2020.07.14 加入

华为云开发者社区,提供全面深入的云计算前景分析、丰富的技术干货、程序样例,分享华为云前沿资讯动态,方便开发者快速成长与发展,欢迎提问、互动,多方位了解云计算! 传送门:https://bbs.huaweicloud.com/

评论

发布
暂无评论
解析Redis操作五大数据类型常用命令