后端开发应该掌握的Redis基础
转自:https://juejin.im/post/5d078cd6f265da1b8466e62c
在上一篇文章中,我们简单地讲了一下Redis的应用场景、安装、如何连接等比较基础的知识,那么在这篇文章,我们就再接再励,继续Redis基础知识的学习吧。
在这篇文章中,我们来讲一讲Redis的数据结构和通用命令。
Redis的数据结构
Redis支持多种不同的数据结构,包括5种基础数据结构和几种比较复杂的数据,这些数据结构可以满足不同的应用场景。
五种基础数据结构
String:字符串,是构建其他数据结构的基础Hash:哈希列表List:列表Set:集合,在哈希列表的基础上实现Sort Set:有序集合
复杂的数据结构
Bitmaps:位图,在string的基础上进行位操作,可以实现节省空间的数据结构。Hyperloglog:用于估计一个 set 中元素数量的概率性的数据结构。Geo: geospatial,地理空间索引半径查询。BloomFilter:布隆过滤器。
不同数据结构的相同之处
从上面的介绍,我们看到支持的数据结构的不同,但其实,Redis的每一种数据结构都由一个key和value组成,可以抽象为:
Redis数据结构组成
而所有数据结构的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而已。
后端开发应该掌握的Redis基础的更多相关文章
- ABP开发框架前后端开发系列---(6)ABP基础接口处理和省份城市行政区管理模块的开发
		
最近没有更新ABP框架的相关文章,一直在研究和封装相关的接口,总算告一段落,开始继续整理下开发心得.上次我在随笔<ABP开发框架前后端开发系列---(5)Web API调用类在Winform项目 ...
 - Redis基础知识之—— 缓存应用场景
		
转载原文:http://www.cnblogs.com/jinshengzhi/articles/5225718.html 一.MySql+Memcached架构的问题 Memcached采用客户端- ...
 - 【劳动节江南白衣Calvin 】我的后端开发书架2015
		
自从技术书的书架设定为”床底下“之后,又多了很多买书的空间.中国什么都贵,就是书便宜. 不定期更新,在碎片化的阅读下难免错评. 书架主要针对Java后端开发,书单更偏爱那些能用简短流畅的话,把少壮不努 ...
 - Java后端开发书架
		
本人摘录于江南白衣文章,文章地址:http://calvin1978.blogcn.com/articles/javabookshelf.html 书架主要针对Java后端开发. 3.0版把一些后来买 ...
 - Python后端开发要求
		
关于Python后端开发要求 一.对Python有兴趣,熟悉Python(标准库) 最好阅读过源码 了解Python的优化(熟悉pypy更佳) 二.至少至少一门语言(不说"精通") ...
 - 后端开发实践——Spring Boot项目模板
		
在我的工作中,我从零开始搭建了不少软件项目,其中包含了基础代码框架和持续集成基础设施等,这些内容在敏捷开发中通常被称为"第0个迭代"要做的事情.但是,当项目运行了一段时间之后再来反 ...
 - 1、redis 基础
		
1.1 导言 如果你从来没使用过 Redis 数据库,那你肯定会问,为什么我们要学 Redis数据库,我只使用 MySQL 或 Oracle 就够了.其实 Redis 虽叫数据库,可又不是传统意义上的 ...
 - 转载关于Python Web后端开发面试心得
		
先介绍下我的情况:通信背景,工作一年多不到两年.之前一直在做C++的MFC软件界面开发工作.公司为某不景气的国企研究所.(喏,我的工作经验很水:1是方向不对:2是行业有偏差).然后目前是在寻找Pyth ...
 - redis的使用和安装,redis基础和高级部分
		
redis的使用和安装,redis基础和高级部分 在后端开发中,为了提高性能,对于一些经常查询但是又不太变化的内容会使用redis,比如前端的列表展示项等,如果数据有变化也可以清空缓存,让前端查一次数 ...
 
随机推荐
- File类与常用IO流第二章过滤器
			
在第一章中,有一个练习使用递归搜索文件 1 public static void main(String[] args) { 2 File f=new File("E:\\aaa" ...
 - Guava Cache使用的三种姿势
			
姿势一 使用expiredAferWriter 优点 简单 粗暴 缺点 同步阻塞问题:如果多个线程同时请求同一个过期的key,只有一个线程能够获得去加载缓存的锁,但是其他未获取加载缓存锁的线程也会阻塞 ...
 - Linux系统下Java 转换Word到PDF时,结果文档内容乱码的解决方法
			
本文分享在Linux系统下,通过Java 程序代码将Word转为PDF文档时,结果文档内容出现乱码该如何解决.具体可参考如下内容: 1.问题出现的背景 在Windows系统中,使用Spire.Doc ...
 - 一台电脑安装两个不同版本的MySQL
			
背景: 本人电脑上已有mysql-8.0.12-winx64,并且可以使用.但由于工作需要,得使用mysql-5.5.59-winx64,已有mysql-5.5.59-winx64的解压好的安装包 参 ...
 - 迈达斯midas Gen 2019 2.1 中文汉化安装教程
			
midas Gen 2019 v2.1 for win是一款关于结构设计有限元分享的工具,分为建筑领域.桥梁领域.岩土领域.仿真领域四个大类.具有人性化的操作界面,且采用了优秀的的计算机显示技术,是建 ...
 - canvas的globalCompositeOperation属性
			
在开发过程中遇到过类似刮刮卡的效果,就是涂抹时变透明,显示出下方的内容,做法思路简单说一下问题和解决方案: 分为2层,最下面一层是内容,比如'一等奖',上面一层用一个canvas遮挡住,画布本来是透明 ...
 - Java 异步编程的几种方式
			
前言 异步编程是让程序并发运行的一种手段.它允许多个事情同时发生,当程序调用需要长时间运行的方法时,它不会阻塞当前的执行流程,程序可以继续运行,当方法执行完成时通知给主线程根据需要获取其执行结果或者失 ...
 - JDK的安装与配置java环境变量
			
JDK安装与配置java环境变量 安装JDK 1.百度搜索jdk8找到下载地址 下载地址:Java SE Development Kit 8 - Downloads (oracle.com) 2.点击 ...
 - 自动部署Springboot项目脚本小脚本
			
#!/bin/bash echo '自动部署Springboot项目脚本...' # aaa.jar 项目jar包 pid=`ps -ef|grep aaa.jar|grep -v grep|grep ...
 - YsoSerial 工具常用Payload分析之Common-Collections7(四)
			
前言 YsoSerial Common-Collection3.2.1 反序列化利用链终于来到最后一个,回顾一下: 以InvokerTranformer为基础通过动态代理触发AnnotationInv ...