园区建设网站的方案,做网上营销怎样推广,互动营销网站建设,创建一个网站主页Redis 中最核心的两个命令#xff1a;
set
作用#xff1a;设置 key 对应的 value 值并存储进去。若key已包含一个值#xff0c;则无论其类型如何#xff0c;都会覆盖该值。在SET操作成功时#xff0c;将丢弃与密钥相关联的任何先前生存时间。 对于上述这里的 key和val…Redis 中最核心的两个命令
set
作用设置 key 对应的 value 值并存储进去。若key已包含一个值则无论其类型如何都会覆盖该值。在SET操作成功时将丢弃与密钥相关联的任何先前生存时间。 对于上述这里的 key和value ,不需要加上引号直接就是表示字符串的类型~~ 当然如果要是给 key 和 value 加上引号也是可以的单引号或者双引号都可以 且 redis 中的命令与mysql一致不区分大小写。
get
作用根据 key 来获取 value值 如果当前key不存在那么返回 nil , 和 null / NULL一个意思
基本全局命令 Redis 有5种数据结构但它们都是键值对这种的值对于键来说有⼀些通⽤的命令。而全局命令就是能够搭配任意一个数据结构来使用的命令~~
keys
作用用来查询当前服务器上匹配的key 通过一些特殊符号通配符来描述 key 的模样匹配上述模样的 key 就能够被查询出来 返回所有满⾜样式pattern的key。⽀持如下统配样式。
h?llo 匹配 hello , hallo 和 hxllo ? 匹配任意一个字符h*llo 匹配 hllo 和 heeeello *匹配0个或者多个任意字符h[ae]llo 匹配 hello 和 hallo 但不匹配 hillo [abcde] 只能匹配到 a b c d e,别的不行相当于给出了固定的选项了 h[^e]llo 匹配 hallo , hbllo但不匹配 hello [^e] 排除e, 只有e 匹配不了其他的都能匹配h[a-b]llo 匹配 hallo 和 hbllo [a-b] 匹配 a - b 这个范围内的字符包含两侧边界
语法: keys pattern 注意事项 keys 命令的时间复杂度是 ON 所以在生产环境上一般都会禁止使用keys命令。尤其是大杀器 keys *。 生产环境上的 key * 可能会非常多而redis是一个单线程的服务器执行keys *的时间非常长就使得 redis 服务器被阻塞了无法给其他客户端提供服务
exists
作用判断 key 是否存在。 语法exists key [key ...] 返回值key 存在的个数。 时间复杂度ON,这里的N不是总的 key 数量N而是你索需要查询的 key 的个数如果是查询的key个数为1个那么就是O1
del
作用删除指定的 key 语法del key [key ...] 返回值删除掉的 key 的个数 时间复杂度ON,这里的N不是总的key数量N而是你查询的key的个数如果是查询的key个数为1个那么就是O1
expire
作用是给指定的 key 设置过期时间单位是秒 语法EXPIRE key seconds 与其相对应的就是pexpire它们之间的区别是设置的单位不同pexpire设置过期时间单位是毫秒expire单位是秒。
ttl
作用获取指定key的过期时间秒级 语法TTL key 返回值剩余过期时间。-1表⽰没有关联过期时间-2表⽰key不存在。 与其相对应的是pttl单位是毫秒。
type
作用返回key对应的value类型 语法 TYPE key 返回值 none , string , list , set , zset , hash and stream等
redis 的key 的过期策略是什么实现的
一个redis 中可能同时存在很多很多key这些 key中可能有很大一部分都有过期时间此时redis 服务器咋知道那些key 已经过期要被删除那些key还没过期 如果直接遍历所有的key显然是行不通的效率非常低~~ redis 整体的策略是
定期删除每次抽取一部分进行验证过期时间~~惰性删除假设这个 key 已经到过期时间了但是暂时还没删它key 还存在紧接这后面又有一次访问正好用到了这个key于是这次访问就会让redis服务器触发删除key的操作同时再返回一个nil
虽然有了上述两种策略结合整体的效果一般~~ 仍然可能会有很多过期的 key 被残留了没有及时删除掉~~ redis为了对上述进行补充还提供了一系列的内存淘汰策略~~
在其他博主上能看到下图这样的机制 其中定时删除是错误的原因如下 1.redis 中并没有采取 定时器 的方式来实现过期 key 删除。 2.如果有多个key 过期也可以通过一个 定时器(可以是基于 优先级队列 或者 基于 时间轮 都可以实现比较高效的定时器) 来高效/节省cpu的前提下来处理多个key~
基于优先级队列定时器设计思路
正常的队列是先进先出而优先级队列则是按照指定的优先级先出例如c STL中的priority_queue一样。 那么啥叫优先级高呢我们可以自定义比如再 reids 过期 key 的场景中就可以通过 “过期时间越早就是优先级越高”。
那么我们现在假定有很多 key 设置了过期时间就可以把这些 key 加入到一个优先级队列中指定优先级规则是过期时间早的先出队列队首元素就是最早的要过期的key
keyvaluekey112:00key213:00key314:00
此时定时器中只要分配一个线程让这个线程去检查队首元素看是否过期即可如果队首元素还没过期后续元素一定没过期此时让 这个扫描线程不需要遍历所有的key只需要盯住队首元素即可。 另外再扫描线程检查队首元素过期时间的时候不能太频繁此时做法就是可以根据当前时刻和队首元素的过期时间让扫描线程进行等待当时间到了系统在去唤醒这个线程此时扫描线程不需要高频扫描队首元素把cpu的开销可以降低下来。 其中万一再线程休眠时来了一个新的任务是11.30要执行那么可以再新任务添加进来的时候先唤醒一下刚下的线程并且重新检查一下队首元素再根据时间差距重新调整阻塞时间即可。
基于时间轮实现的定时器思路
首先把时间划分程很多小段假设每个单元格是100ms的间隔当有新任务进来时先找到要存储的单元格位置并存入如果发现设置的时间超出对应时间轮一轮的范围只需要多旋转几轮直到找到即可并且当每过100ms时此时就需要检查当前格子上的每一个任务并尝试看是否能执行当前任务。