因为redis本质是键值对结构。
1.set key value(设置对应的key和value)
2.get key(得到value值)
这里我们是没有这个key3的,所以他返回一个nil(null的含义)
Redis全局命令(支持很多的数据结构)
3.keys(用来查询当前服务器匹配的key)
通过一些特殊符号(通配符)来描述当前key的模型
如何查找key呢? pattern包含特殊符号的字符串,存在的意义,描述另外的服务器长啥样,?匹配任意一个字符,*匹配0个或多个字符。
*:保证的
?保证一个占位符,他就像是like里面的_
key复杂度O(N),生产环境一般禁止用keys命令,因为生产环境上key可能非常多,redis作为一个单线程的服务器,很容易执行keys*时间非常长,就会使redis服务器被阻塞了,无法给其他客户端提供服务。
redis常常用于缓存,redis挡在mysql前面,redis被keys*阻塞住,此时其他的查询redis操作就超时了,突然一大波请求过来,mysql也会挂
生产环境/线上环境
(办公环境/开发环境,测试环境也叫线上环境,外界用户无法无法访问,线上环境是外界用户能够访问到,一旦生产环境出问题,一定对用户的使用产生影响)
4.exist(判定key是否存在):判定key是否存在
Exist key[key ...]
网络通信->效率比较低
->成本比较高
hashMap中key唯一,但可以判定多个key,要是1个key则非0则1.
redis支持很多数据结构
自身这些键值对,是通过哈希表方式来组织的:
Redis具体的某个值,又可以数据结构
redis是一个客户端,服务器结构的程序,客户端和服务器之间通过网络来进行通信
进行网络通信,发送方发送一个数据,这个数据要从应用层,到物理层,层层封装(每一层协议都要加上报头或尾)->发一个快递,要包装,包好几层
del:删除指定的key,可以删一个或者多个
5.DEL key 返回删掉的key的个数
redis主应用场景:缓存(数据库,消息队列),只是一个热点数据
(redis替mysql负重前行,redis没数据,大部分请求就直接打给mysql易把mysql搞挂)
6.expire作用给指定的key设置过期时间
注意:如果expire key 的键不存在,返回结果为0
如果过期时间为负值,键会立即被删除,犹如使用del命令一样
7.ttl key查看当前键的剩余时间
redis key过期策略的实现(面试题)
redis同时可能存在很多很多的key,这些key中可能很大一部分都有过期时间,此时redis怎么知道哪一部分过期被删除,哪些key还没过期呢?
倘若是直接遍历所有的key,显然是行不通的,效率非常低
redis的整体策略
1.定期删除
每次抽取一部分,进行验证过期时间,保证这个抽查过程足够快,
为啥对定期删除的时间,又明确要求呢?
因为Redis是单线程程序(主要的任务,处理每个命令的任务,刚才扫描过期的key)
如果扫描过期的key消耗的时间太多了,就可能会导致正常处理请求的命令被阻塞(类似于key* 这样的效果)
2.惰性删除
假设这个key到了过期时间,但是暂时未删除它,key还存在,紧接着后面又一次的访问,正好用到这个key,于是这次访问会让Redis触发删除key的操作,同时返回个nil
整体的效果一般仍有过期的key 未被删除,redis还提供了一系列内存淘汰策略。