您当前的位置:首页 > 电脑百科 > 数据库 > Redis

Redis数据结构和通用命令

时间:2019-09-02 13:56:42  来源:  作者:

redis的数据结构

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

5年Java程序员技术分享:Redis数据结构和通用命令

 

五种基础数据结构

  • String:字符串,是构建其他数据结构的基础
  • Hash:哈希列表
  • List:列表
  • Set:集合,在哈希列表的基础上实现
  • Sort Set:有序集合

复杂的数据结构

  • Bitmaps:位图,在string的基础上进行位操作,可以实现节省空间的数据结构。
  • Hyperloglog:用于估计一个 set 中元素数量的概率性的数据结构。
  • Geo:geospatial,地理空间索引半径查询。
  • BloomFilter:布隆过滤器。

不同数据结构的相同之处

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

5年Java程序员技术分享:Redis数据结构和通用命令

 

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

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

5年Java程序员技术分享:Redis数据结构和通用命令

 

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

5年Java程序员技术分享:Redis数据结构和通用命令

 

这里就列出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 test
string
> hset htest test test
> type htest
hash
复制代码

小结

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



Tags:Redis 数据结构   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
基本数据结构简单动态字符串Redis中的字符串使用“简单动态字符串”(SDS)表示,无论是字符串值还是键底层都采用“简单动态字符串”。 free:未使用空间大小; len:字符串长度; buf...【详细内容】
2020-03-07  Tags: Redis 数据结构  点击:(77)  评论:(0)  加入收藏
一、简介和应用Redis是一个由ANSI C语言编写,性能优秀、支持网络、可持久化的K-K内存数据库,并提供多种语言的API。它常用的类型主要是 String、List、Hash、Set、ZSet 这5种...【详细内容】
2020-03-02  Tags: Redis 数据结构  点击:(80)  评论:(0)  加入收藏
Redis的数据结构Redis支持多种不同的数据结构,包括5种基础数据结构和几种比较复杂的数据,这些数据结构可以满足不同的应用场景。 五种基础数据结构 String:字符串,是构建其他数...【详细内容】
2019-09-02  Tags: Redis 数据结构  点击:(169)  评论:(0)  加入收藏
平常我们我接触最多的是5个入门级数据结构:String,Hash,List,Set,Sorted Set。本文介绍3个高级数据结构:Bitmaps,Hyperloglogs,GEO。...【详细内容】
2019-08-27  Tags: Redis 数据结构  点击:(201)  评论:(0)  加入收藏
Redis 是一个开源的,基于内存的结构化数据存储媒介,可以作为数据库、缓存服务或消息服务使用。Redis 支持多种数据结构,包括字符串、哈希表、链表、集合、有序集合、位图、Hype...【详细内容】
2019-05-05  Tags: Redis 数据结构  点击:(395)  评论:(0)  加入收藏
▌简易百科推荐
来源: my.oschina.net/xiaomu0082/blog/2990388首先说下问题现象:内网sandbox环境API持续1周出现应用卡死,所有api无响应现象刚开始当测试抱怨环境响应慢的时候 ,我们重启一下应...【详细内容】
2021-12-08  Java识堂    Tags:Redis   点击:(18)  评论:(0)  加入收藏
我不知道为什么你会选择对特定数量的“错误”(或警告)如此具体。听起来您正在寻找将要发布到 Yahoo! 的某些文章的内容。 Insider (N Foos to Blah for the BlahBlah)。那说:...【详细内容】
2021-12-07  富集云科技有限公司    Tags:Redis   点击:(14)  评论:(0)  加入收藏
目录 一、背景 二、步骤 0.理论支持 1、获取数据 2、结果 3、分析数据并评估大小 三、关于repl-backlog-size 一、背景 repl-backlog-size控制这个环形缓冲区. ​ 主从断...【详细内容】
2021-11-05  弈秋的美好生活    Tags:redis   点击:(41)  评论:(0)  加入收藏
Redis 性能测试是通过同时执行多个命令实现的。1,Redis-benchmarkRedis性能命令:redis性能命令格式: redis-benchmark [option] [option value] redis 性能测试工具可选参数如...【详细内容】
2021-11-02  川石信息    Tags:Redis   点击:(41)  评论:(0)  加入收藏
1 概述数据结构和内部编码 无传统关系型数据库的 Table 模型schema 所对应的db仅以编号区分。同一 db 内,key 作为顶层模型,它的值是扁平化的。即 db 就是key的命名空间。 key...【详细内容】
2021-11-01  JavaEdge    Tags:Redis   点击:(28)  评论:(0)  加入收藏
普通java中使用引用Java redis 驱动,即可连接:import redis.clients.jedis.Jedis; public class RedisTestJava { public static void main(String[] args) { //连...【详细内容】
2021-10-13  faesuite    Tags:Redis   点击:(34)  评论:(0)  加入收藏
Redis常用的数据结构有 string list set zset hashstringstring 是 Redis 的基本的数据类型,一个 key 对应一个 value。string 类型是二进制安全的,Redis的string可以包含任...【详细内容】
2021-10-12  语霖    Tags:Redis   点击:(36)  评论:(0)  加入收藏
列表类型可以存储一组按插入顺序排序的字符串,它非常灵活,支持在两端插入、弹出数据,可以充当栈和队列的角色。> LPUSH fruit apple(integer) 1> RPUSH fruit banana(integer)...【详细内容】
2021-09-17  深夜敲代码    Tags:Redis   点击:(54)  评论:(0)  加入收藏
Redis持久化意义 是做灾难恢复,数据恢复,也可以归类到高可用的一个环节里面去,比如你的redis整个挂了,然后redis就不可用了,你要做的事情是让redis变得可用,尽快变得可用 大量的请...【详细内容】
2021-08-12  小李说IT    Tags:Redis   点击:(77)  评论:(0)  加入收藏
当查询Redis中没有的数据时,该查询会下沉到数据库层,同时数据库层也没有该数据,当这种情况大量出现或被恶意攻击时,接口的访问全部透过Redis访问数据库,而数据库中也没有这些数据...【详细内容】
2021-07-30  随便t    Tags:缓存穿透   点击:(91)  评论:(0)  加入收藏
最新更新
栏目热门
栏目头条