Redis基础都不会,好意思出去面试?
发布日期:2021-06-30 12:38:16 浏览次数:2 分类:技术文章

本文共 3471 字,大约阅读时间需要 11 分钟。

640?wx_fmt=jpeg

作者:张君鸿

juejin.im/post/5d078cd6f265da1b8466e62c

Redis的数据结构

Redis支持多种不同的数据结构,包括5种基础数据结构和几种比较复杂的数据,这些数据结构可以满足不同的应用场景。

五种基础数据结构

  • String:字符串,是构建其他数据结构的基础

  • Hash:哈希列表

  • List:列表

  • Set:集合,在哈希列表的基础上实现

  • Sort Set:有序集合

复杂的数据结构

  • Bitmaps:位图,在string的基础上进行位操作,可以实现节省空间的数据结构。

  • Hyperloglog:用于估计一个 set 中元素数量的概率性的数据结构。

  • Geo:geospatial,地理空间索引半径查询。

  • BloomFilter:布隆过滤器。

不同数据结构的相同之处

从上面的介绍,我们看到支持的数据结构的不同,但其实,Redis的每一种数据结构都由一个key和value组成,可以抽象为:

640?wx_fmt=jpeg

而所有数据结构的key的值都是任意合法的字符串,不同的数据结构的区别就在于value存储的值的不同而不同。

比如,最简简单的String数据结构,其value为String,所以String可以表示为:

640?wx_fmt=jpeg

而Hash数据结构,其value为一个哈希列表,所以Hash可以表示为:

640?wx_fmt=jpeg

这里就列出String和Hash来讲解说明,关于更多数据结构的内部结构及详细操作,我们在之后的文章在再谈谈吧。

Redis的通用命令

Redis官网将Redis的命令按照功能划分为15个主题分组,其中,Kyes主题的命令对所有的数据结构都通用,因此,有必要在了解其他数据结构命令前好好学习一下。

keys

keys命令的作用是列出Redis所有的key,该命令的时间复杂度为O(N),N随着Redis中key的数量增加而增加,因此Redis有大量的key,keys命令会执行很长时间,而由于Redis是单线程,某个命令耗费过长时间,则会导致后面的的所有请求无法得到响应,因此,千万不要在生产服务器上使用keys命令。

# key命令,时间复杂度为O(n)keys pattern #pattern可为一个包含匹配模式的字符串,可以包含*,+,?,[a-z]等模式。

示例

> mset hello_test1 one hello_test2 two helloa a hellob b> keys hello*1) "hello_test1"2) "hello_test2"3) "helloa"4) "hellob"> keys heelo?1) "helloa"2) "hellob"> keys hello[a-z]1) "helloa"2) "hellob"

exists

exists命令用于判断一个或多个key是否存在,判断多个key时,key之间用空格分隔,exists的返回值为整数,表示当前判断有多少个key是存在的。

# exists命令,时间复杂度O(1)exists key [key ...]

示例

> set test1 t1> exists test1 test2 (integer) 1 #只有一个key存在> exists test3 test3(integer) 0 #key都不存在

del

del命令用于删除一个或多个key,多个key之间用空格分隔,其返回值为整数,表示成功删除了多少个存在的key,因此,如果只删除一个key,则可以从返回值中判断是否成功,如果删除多个key,则只能得到删除成功的数量。

# del命令,时间复杂度O(n)del key [key ...]

示例

> set test t> del test(integer) 1> mset test1 2 test2 1> del test1 test2 test3(integer) 2 # 返回2,表示成功删除两个#再次删除,返回0,因为删除成功个数为0> del test1 test2 test3(integer) 0

expire,pexpire

expire设置key在多少秒之后过期,pexpire设置key在多少毫秒之后过期,成功返回1,失败返回0。

# expire命令,时间复杂度为O(1)expire key seconds# pexpire命令,时间复杂度为O(1)pexpire key milliseconds

示例

> mset test test_value test1 test1_value> expire test 10 #设置10秒后过期(integer) 1> pexpire test1_value 10000 #设置10000毫秒(10s)后过期(integer) 1> expire ttt 100(integer) 0 # 不存在的key,设置失败,返回0 

ttl,pttl

ttl和pttl命令用于获取key的过期时间,其返回值为整型,代表的意义分为几种情况:

  • 当key不存在或过期时间,返回-2。

  • 当key存在且永久有效时,返回-1。

  • 当key有设置过期时间时,返回为剩下的秒数(pttl为毫秒数)

# ttl命令,时间复杂度O(1)ttl key# pttl命令,时间复杂度O(1)pttl key

示例(ttl的演示,pttl类似)

> set test test> expire test 100> ttl test(integer) 98#返回剩下的秒数> set test1 #永久有效> ttl test1(integer) -1> ttl test2(integer) -2#不存在或过期#100秒后> ttl test # test已过期(integer) -2

expireat,pexpireat

设置key在某个时间戳过期,expreat参数时间戳用秒表示,而pexpireat则用毫秒表示,与expire和pexpire功能类似,返回1表示成功,0表示失败。

#expireat命令,时间复杂度为O(1)expireat key timestamp#pexpireat命令,时间复杂度为O(1)pexpireat key milliseconds-timestamp

示例

> set test test> expireat test 1560873600 # 2019-06-19 00:00:00(integer) 1> set test1 test1> pexpireat test1 156087360000 # 2019-06-19 00:00:00的毫秒表示(integer) 1

persist

移除key的过期时间,将key设置为永久有效,当key设置了过期时间,使用persist命令移除后返回1,如果key不存在或本身就是永久有效的,则返回0。

# persist命令,时间复杂度O(1)persist key

示例

> set test test> ttl test(integer) -1 # 表示永久有效> persist test(integer) 0 # 对永久有效或不存在的key使用persist命令,返回> expire test 10(integer) 1> persist test(integer) 1

type

判断key是什么类型的数据结构,返回值为string,list,set,hash,zset,分别表示我们前面介绍的Redis的5种基础数据结构。

geo,hyperloglog,bitmaps等复杂的数据结构,都是在这五种基础数据结构上实现,比如geo是zset类型,hyperloglog和bitmaps都为string。

# type命令,时间复杂度O(1)type key

示例

> set test test> type teststring> hset htest test test> type htesthash

小结

上面介绍的是Redis中最常用的通用命令,虽然简单,但还是非常有必要掌握其用法和使用方面要注意的事项,其实,对于普通开发人员来说,很多时候,也只是使用这些基础通用的命令来操作Redis而已。

- END -

关注Java技术栈微信公众号,在后台回复关键字:Java,可以获取一份栈长整理的 Java 最新技术干货。

最近干货分享

640

点击「阅读原文」加入栈长的战队~

转载地址:https://javastack.blog.csdn.net/article/details/100380657 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:如何设计一个完美的权限管理模块?
下一篇:不用找了,大厂在用的分库分表方案,都在这了!

发表评论

最新留言

做的很好,不错不错
[***.243.131.199]2024年04月16日 13时14分57秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章

快速排序 2021-07-04
【Java习题】 -- 设计⼀个⽅法,将⼀个字符串中的⼤⼩写字⺟翻转 2021-07-04
【大数据开发】Java基础-总结1-可变参数的注意点 2021-07-04
【Java习题】 -- 设计⼀个⽅法,将⼀个数组中的元素倒序排列(注意,不是降序) 2021-07-04
【Java习题】(难)设计⼀个⽅法,找出⼀个整型数组中的第⼆⼤的值 2021-07-04
【Java习题】-- 已知⽅法 public static int[] combine(int[] arr1, int[] arr2) 的作⽤是,合并 两个数组,并对合并后的数组进⾏升序排序 2019-05-01
【Java习题】(难)已知⽅法 public static int[] delete(int[] arr, int ele) 的作⽤是删除数组中第 ⼀次出现的ele元素,并返回删除后的数组 2019-05-01
【大数据开发】Java基础-总结2-面向对象与面向过程的区别 2019-05-01
【大数据开发】Java基础-总结3-面向对象的特点和注意点 2019-05-01
MySQL5.7版本修改了my.ini配置文件后mysql服务无法启动问题 2019-05-01
【大数据开发】Java基础 -总结21-Hashmap和HashTable的区别 2019-05-01
MySQL中关于decimal与double字段类型的区别 2019-05-01
Exception in thread “main“ java.sql.SQLException错误之一: Column Index out of range, 0 < 1. 2019-05-01
C3p0连接池连接mysql出现: com.mchange.v2.resourcepool.BasicResourcePool 2019-05-01
webview加载网页或富文本oom 2019-05-01
线程池基本概念 2019-05-01
sleep与wait 区别 2019-05-01
JAVA中的各种锁 2019-05-01
线程上下文切换 2019-05-01
什么是 AQS(抽象的队列同步器) 2019-05-01