文章目录
- Redis特性
- Redis典型使用场景
- [Redis 为什么这么快](#Redis 为什么这么快)
- 全局命令
Redis特性
-
可作为缓存中间件:克服传统数据库读写慢的问题,Redis存储数据的方式不同于传统的关系型数据存储,而是采用键值对的非关系型存储
-
交互命令简单:还可以用脚语言来批量操作
-
扩展性高:Redis原生支持存储string、list、set、hash等数据存储格式,Redis保留了扩展api,可以自定义数据格式作为'值'来存储,还可以自定义操作命令
-
支持数据持久化:Redis把数据作为备份存储在硬盘上,当Redis重启丢失内存中数据时,从硬盘同步数据
-
高可用性:作为集群部署稳定可靠。Redis集群中每个节点代表一个主节点,每个主节点搭配多个从节点,从节点不仅可以备份主节点数据还可以分担主节点的'读'压力,当主节点发生错误挂掉从节点可以快速顶上胜任主节点的工作
-
性能优秀速度快 :Redis采用了单线程,核心功能增删改查都是简单逻辑使用,单线程足以胜任且由于是内存级别的读写,速度会非常快
为何不采用多线程:多线程发生发生线程竞争、线程切换的时间开销甚至远超读写时间,制约Redis 性能的最大因素是网络的请求响应,于是在Redis6.0后在网络IO阶段采用IO多路复用(多线程处理),核心的增删改查仍然是单线程
-
键值对存放数据:Redis以键值对的形式存放数据
-
以二进制格式存储数据:Redis存储数据输入和输出都是二进制
-
Redis存储隔离:一个Redis服务器自带15个数据库,不支持添加数据库,它们互相隔离,每个库容量只取决于服务器内存大小
Redis典型使用场景
- 作为缓存中间件,Redis能很好地应付高并发场景,Redis从数据库同步数据,缓解大量访问压力
- 保存session数据,session在服务端存储,但在分布式系统中,服务器间的数据不一定全部同步,持有sessionId的客户端却可能无法在其他服务器获得服务,将session放在Redis中,这样所有服务器都从Redis中获取session校验 客户端身份
- 手机验证码登录,Redis可以设置key的过期时间,刚好满足验证码使用时限的场景
Redis 为什么这么快
Redis为什么这么快:(快是相对MySQL、Oracle等数据库而言的)
- 内存级别的操作,而MySQL等是操作硬盘
- 数据操作逻辑简单,与之对比关系型数据库更'重',涉及索引、约束、事务等
- 采用单线程模型,核心操作单线程足以应付且避免了多线程竞争、切换的开销
- Rdis6.0后,网络采纳了多线程,且每个线程都是I/O多路复用,每个线程都可以处理多个socket(说人话就是网络通信连接)
全局命令
1)文章根据Redis6.0版本编写
2)所有涉及到下标的都支持负数下标,所有涉及到区间的默认指闭区间('[ ]');
3)符号含义:必选:'< >'、可选:'[ ]'、多选一:'|'、多个:'...'、如果'[ ]'里有单词是大写的,代表使用这种修饰符必须要写上这个大写单词
Redis全局命令:(很多命令都支持一次性操作多个键值对,网络IO的时间开销使得Redis不得不这样做)
- select index:选择使用的数据库编号(0~15),默认使用0号数据库
- dbsize :返回当前数据库key的数量
- keys < pattern > :获取所有满足条件的键名,其中pattern(?、*、[ ]、^、-)代表匹配条件
- ·h?llo( 匹配单个任意字符):匹配 hello, hallo 和 hxllo
- h*llo (匹配0个或多个字符) :匹配 hllo 和 heeeello 【但是特别危险,keys命令是顺序查找的时间复杂度O(N),如果匹配到大量key可能会让redis挂掉】
- h[ae]llo ( 匹配单个指定字符,这里匹配字符a或者e):匹配 hello 和hallo, 而hillo 不行
- h[^e]llo(匹配字符e以外的单个任意字符): 匹配 hallo, hbllo, ... 而 hello 不行
- h[a-b]llo (匹配字典序a到b的单个字符):匹配 hallo 和 hbllo
- scan cursor [MATCH pattern] [COUNT count] [TYPE type] :渐进式遍历,cursor代表哈希槽的一个位置作为每次扫描的起点(扫描标记);每次扫描返回下一次扫描的cursor和扫描结果;
但请注意,你输入的cursor无效,它只会按它内部的扫描规则来,返回给你cursor是通知你它下次扫描的cursor;扫描返回的cursor为0标识扫描开始,返回的cursor为0表示扫描结束- MATCH:使用的pattern样式同keys命令的pattern一样,可以使用'?'、'*'、'[]'、'[^]'、'[-]'来限定匹配key
- COUNT:每次扫描返回的key个数,但是注意,Redis仍不会严格遵循这个返回条数,会返回跟count数值相近条数
- TYPE:限定key对应的value的类型
- exists key [key1...]:查找键是否存在,返回存在个数,支持同时查找多个键,如果表达式里重复一个键返回值也计入重复个数;查找时间复杂度为O(N),N代表查出的键数
- del key [key1...]:删除一个或多个键,返回删除键数,时间复杂度为O(N),N为删除的键数
- expire key seconds [NX|XX|GT|LX] :设置key过期时间,单位为秒,后缀作用:
- NX:只能为没有过期时间的key设置过期时间
- XX:只能为有过期时间的key设置
- GT:只能为key设置比当前过期时间的更大的过期时间才有效(greater than)
- LX:只能为key设置比当前过期时间的更小的过期时间才有效(less than)
- pexpire key milliseconds [NX|XX|GT|LT]:作用同expire但是单位为毫秒
- ttl key:通常搭配expire/pexpire使用,查看当前key的剩余过期时间,返回数据单位为秒,返回-1时代表当前key没有过期时间,返回-2代表当前key不存在
- type key:获取当前键对应的值的数据类型,支持原生的string, list, set, zset, vectorset, hash, and stream类型,键不存在返回none。不支持返回自定义数据类型
- object encoding key:获取值的实际数据结构,比如value=123,用type key返回string,而该命令返回int,具体有哪些类型参考后面的数据存放策略章节
- flushall [ASYNC|SYNC] :清除所有数据库里所有的键,返回"OK"相当于删库了,【跟keys *一样危险,时间复杂度O(N)】
- ASYNC:同步操作,Redis服务阻塞全用来遍历删除
- SYNC:异步操作,Redis正常运行,而删除操作交给后台IO线程
- flushdb [ASYNC|SYNC]:删除当前数据库所有的key
明天见