wordpress的建站教程,开源商用的商城项目,杭州企业管理咨询有限公司,discuz手机版一、get和set命令
Redis中最核心的两个命令
get 根据key来取value
set 把key和value存储进去
redis是按照键值对的方式存储数据的。必须要先进入到redis客户端。
语法 set key value #xff1a; key和value都是字符串。
对于上述这里的key value 不需要加上引号#…一、get和set命令
Redis中最核心的两个命令
get 根据key来取value
set 把key和value存储进去
redis是按照键值对的方式存储数据的。必须要先进入到redis客户端。
语法 set key value key和value都是字符串。
对于上述这里的key value 不需要加上引号就是表示字符串加上引号也无伤大雅。redis中的命令不区分大小写。
使用get得到key对应的value值。 get命令直接输入key就能得到value。如果当前key不存在返回nil和null/NULL就是一个意思。 redis使用简单学习成本很低。
二、全局命令
Redis全局命令
Redis是支持很多种数据结构的整体上来说Redis是键值对结构key固定都是字符串value实际上会有多种类型。比如字符串哈希表列表集合有序集合等等。每种数据结构都会对应着不同的命令而全局命令就是能够搭配任意一个数据结构来使用的命令。
1keys命令 用来查询当前服务器上匹配的key
通过一些特殊符号来描述key的模样匹配上述模样的key就能被查询出来。
语法keys pattern
pattern 包含特殊符号的字符串有的地方翻译成样式或者模式。重点去认识这个英文术语。存在的意义是去描述另外的字符串长啥样。
pattern具体咋写支持哪些通配符呢
匹配任意一个字符
*匹配0个任意多个字符
[ae] 只能匹配到ae别的不行相当于给出固定选项了
[^e] 排除e只有e匹配不了其他的都能匹配。
[a - e] 匹配a - e这个范围内的字符包含两侧边界。
设置这样的key通过上述的匹配方法进行查询 上述的匹配规则不需要去背。要查询文档。
keys命令的时间复杂度是O(N)。所以在生产环境上一般都会禁止使用keys命令尤其是大杀器keys * 。查询redis中所有的key生产环境上的key可能会非常多而redis是一个单线程的服务器执行keys * 的时间非常长就是redis服务器被阻塞了。无法给其他客户端提供服务。这样的后果可能是灾难性的。redis经常会用于做缓存挡在mysql前面。替mysql负重前行。万一redis被一个keys * 阻塞住了此时其他的查询redis操作就超时了。此时这些请求就会直接查数据库。突然一大波请求到来mysql措手不及会把它给搞挂了。这个操作非常危险容易把工作给搞丢。那你就得让你的媳妇吃土或者喝西北风了很可能你的媳妇就跟别人跑了。开个小玩笑。
穿插一个概念叫做生产环境线上环境
未来的工作中会涉及到几个环境
1、办公环境入职之后公司给你发个电脑
笔记本电脑/台式机。
2、开发环境有的时候开发环境和办公环境是一个有的时候开发环境是单独的服务器做前端/客户端一般来说开发环境就是办公环境了。后端来说很可能是单独的服务器有的后端程序会比较复杂。
1一次时间特别久。
2有的程序启动要消耗很多的cpu和内存资源。办公电脑难以支撑。
3有的程序比较依赖linux在windows环境搭不起来。
3、测试环境测试工程师用的
4、线上环境/生产环境
办公环境开发环境测试环境统称为线下环境外界用户无法访问到的。线上环境则是外界用户能够访问到的。一旦生产环境出问题一定会对于用户的使用产生影响直接的影响到公司营收。
未来咱们去操作线上环境的任何一个设备/程序都要怀着12分的谨慎。
2exists命令
exists判定key是否存在
语法
返回值key存在的个数。键值对存储的体系中类似于哈希表key得是唯一的呀。
这里的个数对于多个key来说是非常有用的 。他的查询复杂度为O(1)redis组织这些key就是按照哈希表的方式来组织的。
redis支持很多数据结构 》指的是一个value可以是一些复杂的数据结构redis自身的这些键值对是通过哈希表的方式来组织的。redis具体的某个值又可以是一些数据结构。 分开查询和一起查询会有什么区别吗。
我们要知道redis是一个客户端服务器结构的程序。客户端和服务器之间通过网络来进行通信我们所敲的命令都会构建一个请求发送给服务器服务器返回回复报文。要进行网络通信它是相对于内存来说效率比较低成本比较高。
进行网络通信的时候发送方发送一个数据这个数据就要从应用层到物理层层层封装。势必会导致传输速度慢。所以我们要尽量少发请求。能用一个命令不用两个命令。
3deldelete删除指定的key
语法返回值删除掉的key的个数。 redis主要的应用场景就是作为缓存此时redis里存的只是一个热点数据全量数据是在mysql数据库中。此时如果把redis中的key删除了几个一般来说问题不大。但是如果把所有的数据或者一大半数据一下都干没了这种影响会很大。相比之下如果是mysql这样的数据哪怕误删了一个数据都可能影响很大的。如果把redis作为数据库此时误删数据的影响就大了。如果把redis作为消息队列这种情况误删数据就得按情况来具体分析了。所以我们不能乱删数据。自己挖坑自己跳得不偿失。
4expire命令
作用是给指定的key设置过期时间key存活时间超出这个指定的值就会被自动删除。设置的时间单位是秒。基于redis实现分布式锁为了避免出现不能正确解锁的情况通常都会在加锁的时候设置一下过期时间所谓的使用redis作为分布式锁就是给redis里写一个特殊的key value。
语法
pexpire key mseconds 毫秒级
返回值1成功0失败
此处的设定的过期时间必须是针对已经存在的key设置设置成功返回1设置失败返回0。时间复杂度也是O(1)。
过期后get不到value。
5ttl命令
ttl time to live 存活时间。网络原理IP协议报头中有一个字段TTL。IP中的TTL不是用时间衡量过期的而是用次数。
ttl是一个时间。查看当前key的过期时间还剩多少
pttl查询毫秒级的key的过期时间。 时间复杂度也是O(1)。
redis的key的过期策略 【经典面试题】
redis的key的过期策略是怎么实现的
一个redis中可能同时存在很多很多key这些key中可能有很大一部分都有过期时间此时redis服务器咋知道哪些key已经过期要被删除哪些key还没过期
如果直接遍历所有的key显然是行不通的效率非常低。
redis整体的策略是:
1、定期删除此处也需要结合定期删除的操作每次抽出一部分验证过期时间保证这个抽取检查的过程足够快。对于定期删除的时间有明确的要求因为redis是单线程的程序。主要的任务处理每个命令的任务刚才扫描过期的key如果扫描过期key消耗的时间太多了就可能导致正常处理请求命令就被阻塞了产生了类似key *这样的效果。
2、惰性删除假设这个key已经到过期时间了但是暂时还没删它key还存在紧接着后面有一次访问正好用到了这个key于是这次访问就会让redis服务器触发删除key的操作同时在返回一个nil。
虽然有了上述两种策略结合整体的效果一般仍然可能会有很多过期的key被残留了没有及时删除掉redis为了对上述进行补充还提供了一系列的内存淘汰机制。 1redis中并没有采取定时器的方式来实现过期key删除
2如果有多个key过期也可以通过一个定时器来高效/节省cpu的前提下来处理多个key。
为啥redis没有采取这种定时器的方式呢
很难考证为啥个人的猜测基于定时器实现势必就要引入多线程了。redis早期版本就是奠定了单线程的基调引入多线程打破了作者的初衷。
定时器的实现原理
定时器在某个时间到达之后执行指定的任务
1、基于优先级队列/堆
正常的队列是先进先出。而优先级队列则是按照指定的优先级先出。啥叫优先级高自定义的。在redis过期key的场景中就可以通过“过期时间越早就是优先级越高”。现在假定有很多key设置了过期时间就可以把这些key加入到优先级队列中指定优先级规则是过期时间早的先出队列。队首元素就是最早要过期的key此时定时器中只要分配分配一个线程让这个线程取检查队首元素看是否过期即可如果队首元素没有过期后续元素一定没过期。此时扫描线程不需要遍历所有key只盯住这一个队首元素即可另外在扫描线程检查队首元素过期时间的时候也不能检查太频繁。此时做法就是可以根据当前时刻和队首元素的过期时间设置一个等待。当时间差不多到了系统再唤醒这个线程。此时扫描线程不需要高频扫描队首元素把CPU的开销也节省下来了。
万一在线程休眠的时候来了一个新的任务是1130要执行。可以在新任务添加的时候唤醒一下刚才的线程重新检查一下队首元素再根据时间差距重新调整阻塞时间即可。
2、基于时间轮实现的定时器
把时间划分成很多小段划分的粒度看实际需求。 每一个小段上都挂着一个链表每个链表都代表一个要执行的任务相当于一个函数指针以及对应的参数。有点像jiava中也可以通过对象来实现类似的效果。
假设需要添加一个key这个key在300ms之后过期。添加到第三个格子每个格子是100毫秒所以是第三个格子此时这个指针就会每隔固定的间隔每次走到一个格子就会把这个格子上链表的任务尝试执行一下。对于时间轮来说每个各自是多长时间一共多少个格子都是需要根据实际的场景灵活调配的。
此处大家注意Redis并没有采取上述的方案。但是要了解这两种方案都是属于高效的定时器的实现方式很多场景可能都会用得到。
6type命令
返回key对应的value的类型。此处redis所有的key都是stringkey对应的value可能会存在多种类型。 stream是redis作为消息队列的时候使用这个类型的value。 在redis中上述类型操作方式差别很大使用的命令都是完全不同的。时间复杂度也是O(1)
小结
当前已经学习了redis中几个基本的全局命令
set设置一个kv值
get通过key得到value
keys用来查看匹配规则的key。
exists用来判定指定key是否存在。
del删除指定的key
expire给key设置过期时间
ttl查询key的过期时间
type查询key对应的value的类型。 接下来就是围绕每个数据结构来介绍相关命令了。
当前版本的redis支持10个数据类型。