Redis的数据结构
Redis支持多种不同的数据结构,包括5种基础数据结构和几种比较复杂的数据,这些数据结构可以满足不同的应用场景。
五种基础数据结构
  • String:字符串,是构建其他数据结构的基础
  • Hash:哈希列表
  • List:列表
  • Set:集合,在哈希列表的基础上实现
  • Sort Set:有序集合
复杂的数据结构
  • Bitmaps:位图,在string的基础上进行位操作,可以实现节省空间的数据结构。
  • Hyperloglog:用于估计一个 set 中元素数量的概率性的数据结构。
  • Geo:geospatial,地理空间索引半径查询。
  • BloomFilter:布隆过滤器。
不同数据结构的相同之处
从上面的介绍,我们看到支持的数据结构的不同,但其实,Redis的每一种数据结构都由一个key和value组成,可以抽象为:
而所有数据结构的key的值都是任意合法的字符串,不同的数据结构的区别就在于value存储的值的不同而不同。
比如,最简简单的String数据结构,其value为String,所以String可以表示为:
而Hash数据结构,其value为一个哈希列表,所以Hash可以表示为:
这里就列出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而已。

3年Java开发都知道的Redis数据结构和通用命令的更多相关文章

  1. Git / 程序员需要知道的12个Git高级命令

    众所周知,Git目前已经是分布式版本控制领域的翘楚,围绕着Git形成了完整的生态圈.学习Git,首先当然是学习Git的基本工作流.相比于SVN等传统版本控制系统来说,Git是专为分布式版本控制而生的强 ...

  2. iOS开发应该知道的7个编程概念

    对流行工具(如Xcode)和编程概念(如视图控制器)的高级讨论,这些对iOS开发本身很有用. 1. Xcode Xcode是iOS应用开发社区所见过的最通用的IDE.由于集成开发环境来自Apple,它 ...

  3. 深入剖析Redis系列:Redis数据结构与全局命令概述

    前言 Redis 提供了 5 种数据结构.理解每种数据结构的特点,对于 Redis 的 开发运维 非常重要,同时掌握 Redis 的 单线程命令处理 机制,会使 数据结构 和 命令 的选择事半功倍. ...

  4. 高可用Redis(一):通用命令,数据结构和内部编码,单线程架构

    1.通用API 1.1 keys命令和dbsize命令 keys * 遍历所有key keys [pattern] 遍历模式下所有的key dbsize 计算Redis中所有key的总数 例子: 12 ...

  5. Redis 数据结构解析和命令指南

    命令參考文档:redis commands - 你或许已经知道Redis并非简单的key-value存储.实际上他是一个数据结构server.支持不同类型的值. 也就是说.你不必只把字符串当作键所指向 ...

  6. redis数据结构和常用命令

    redis常用数据结构 String 最简单的K_V,value可以是数字或者字符串,使用场景:微博数.普通计数,命令:get set incr(加1) decr(减1) mget(获取多个值),se ...

  7. Netty精粹之JAVA NIO开发需要知道的

    学习Netty框架以及相关源码也有一小段时间了,恰逢今天除夕,写篇文章总结一下.Netty是个高效的JAVA NIO框架,总体框架基于异步非阻塞的设计,基于网络IO事件驱动,主要贡献在于可以让用户基于 ...

  8. 这篇建议java开发都看看,对Java方法及加深理解的很深,值得一看!

    方法和加深 方法的定义 修饰符 返回类型 break:跳出switch,结束循环 和 return 的区别 方法名:注意规范 见名知意 参数列表(参数类型,参数名)- 异常抛出 // Demo01 类 ...

  9. java开发都需要学什么

    1.java基础 2.JSP+Servlet+JavaBean 环节主要 懂流程 MVC而已 别往深了研究 现 开发基本 用 模式 3.Struts+Hibernate+Spring 才 开发 主流技 ...

随机推荐

  1. 【SSM Spring 线程池 OJ】 使用Spring线程池ThreadPoolTaskExecutor

    最近做的Online Judge项目,在本地判题的实现过程中,遇到了一些问题,包括多线程,http通信等等.现在完整记录如下: OJ有一个业务是: 用户在前端敲好代码,按下提交按钮发送一个判题请求给后 ...

  2. Nginx服务器安装及配置解释

    nginx是高性能的轻量级web服务器. 特性: 1.http代理 2.反向代理 3.负载均衡 4.缓存机制 一,安装及启动(centos7,nginx 1.14.0) 1.下载 wget http: ...

  3. Java流程控制之(一)条件

    目录 条件语句 单if情况 单if/else情况 if/else多分支情况 switch条件语句 条件语句+循环语句,直接甩图甩代码! 条件语句 Java希望在某个条件为真时执行相应的语句. 单if情 ...

  4. C#Windows Forms 计算器--xdd

    一.计算器 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data ...

  5. Linux -- 进程间通信几种方式的总结

    管道 优点 管道文件不占磁盘空间,打开管道时在内存中分配空间: 管道读端会在读取完管道内数据后自动进入阻塞,直到写端再次写入数据: 缺点 管道是半双工的,数据只能从一个方向上流动: 管道大小 PIPE ...

  6. nginx集群架构

    Linux集群从功能分类 高可用集群,高可用集群通常为俩台服务器,一台工作,另一台冗余,当提供服务器的服务器宕机时候,冗余服务器将接替宕机的服务器继续提供服务.实现高可用的集群开源软件有Heatbea ...

  7. 【数据结构】之链表(Java语言描述)

    以前写过一篇帖子,记录了链表在C语言中的描述代码.C语言中没有链表的直接实现,因此,我们需要自己编写代码实现.请参考[我的这篇文章]. Java中默认为我们提供了链表的API—— LinkedList ...

  8. 【Android - 组件】之IntentFilter的匹配规则

    我们知道,Activity的启动模式分为两种,分别是显式启动和隐式启动.显式启动需要明确的指定被启动的对象的组件信息,包括包名和类名:而隐式启动需要 Intent 能够匹配目标组件的 IntentFi ...

  9. nginx中proxy_pass小斜杠

    nginx中proxy_pass小斜杠 1. 故事背景 相信做微信公众号开发的朋友都知道,要想在微信中预览效果,必须使用域名访问.很多朋友使用内网穿透工具.不仅不好用还不稳定.所以,发挥脸厚吃天下的态 ...

  10. Django REST framework(DRF)

    Django REST framework(DRF) FBV与CBV CBV源码分析 Restful接口规范 DRF简单配置使用和源码解析 DRF序列化器 DRF10大接口 DRF视图集 三大组件 j ...