Redis通用命令 & key的过期删除策略

redis命令官方文档:https://redis.io/docs/

redis中文文档:回头找一下资源,建议能看英文文档就看英文文档

全文概要

set key value            //设置一个键值对,key、value均为String类型,可以不加引号
get key                  //获取key的value值
keys pattern             //查询所有符合pattern的key
exists key[key1 key2 ..] //查询key是否存在,可以同多个key
del key[key1 key2 ..]    //删除某个键值对,可以同时删除多个键值对
expire key seconds       //给key添加过期时间,单位为秒s
pexpire key seconds      //给key添加过期时间,单位为毫秒ms
ttl key                  //查看key的过期时间
type key                 //查看该键值对vlaue的类型

set&get:

set key value            //设置一个键值对,key、value均为String类型,可以不加引号
get key                  //获取key的value值

Tab键自动补全 ,补全的命令为是大写,一般情况下比较喜欢是用小写命令,读起来更容易一k

全局命令:

什么是全局命令?就是能够搭配任意数据结构使用的命令。

Redis以键值对的形式来在内存中存储数据,key的类型均为String类型,value的类型可以有很多种,Redis中支持很多种数据结构(字符串、哈希表、列表、集合、有序集合)Redis官网列举出来所支持的数据结构类型。操作不同的数据结构就会有不同的命令,有些命令可以搭配任意数据结构来使用,这些就是全局命令。

keys

keys pattern             //查询所有符合pattern的key

partten是类似于正则表达式进行样式匹配的字符串,支持一下通配符:

  1. h?llo 匹配 hello , hallo 和 hxllo
  2. h*llo 匹配 hllo 和 heeeello
  3. h[ae]llo 匹配 hello 和 hallo 但不匹配 hillo
  4. h[^e]llo 匹配 hallo , hbllo , ... 但不匹配 hello
  5. h[a-b]llo 匹配 hallo 和 hbllo
  • ?:可以匹配任意单个字符
  • * :可以匹配0个或多个任意字符
  • [abc] :可以匹配中括号中的任意一个字符
  • [^e]:可以匹配除e以外的任意单个字符
  • [a-b]:可以匹配a到b区间之间任意一个字符包括区间两端

keys命令的时间复杂度是O(N)的,为什么呢?

注意事项:一般情况严禁在生产环境/线上环境下使用 keys * 命令,因为生产环境下key可能非常多,而Redis又是单线程的服务器,执行keys *的时间会很长,就会造成Redis服务器阻塞,无法给其他客户提供服务。Redis经常作为缓存挡在MySQL数据的前面,如果因为阻塞查询Redis数据的操作超时了,此时就回去查询从数据中查询,大量的请求涌向数据库服务器,可能导致数据库罢工。

exists

exists key[key1 key2 ..] //查询key是否存在,可以同多个key

返回key存在的个数,时间复杂的为O(1)

Redis以键值对的形式将数据存储在内存中,key是唯一的,两次key值相同的set命令,第二次的value值会覆盖第一次的value值。Redis中的键值对是通过哈希表的方式来组织的,因此查询某一个key的时间复杂度是O(1),因为exists支持同时查询多个key,所以官网标注的时间复杂度为O(N),这个N指的是一次查询key的规模。

Redis是客户端/服务器结构的程序,客户端和服务器是通过网络进行通信的。每一次命令执行,客户端都会向服务器端发起http请求如果将exists key[key1 key2 ..]分开写的话会产生多次网络通信,网络通信慢的原因之一在于数据的封装和分用。发送方发送一个数据,这个数据共应用层,到物理层,层层封装。接收方收到一个数据,从物理层到应用层,层层分用,而且网络通信的速度还会受到距离的影响。Redfis本也清楚支个问题,因此它的很多命令都支持一次操作多个key.

del

del key[key1 key2 ..]    //删除某个键值对,可以同时删除多个键值对

返回删除key的个数,时间复杂的为O(1)

MySQL中删库删表都是比较危险的操作,Redis中的删除命令也需要谨慎使用,一般情况下当redis充当缓存的时候,存储的仅是热点数据,删除之后依然可以从数据库(全量数据)中加载回来,影响不大;当Redis充当数据库是,存储的数据就无法恢复了,影响会比较大;Redis充当消息队列的时候,具体情况还需要具体分析,总之谨慎使用删除命令,不要乱删数据。

expire & pexire

expire key seconds       //给key添加过期时间,单位为秒s

成功返回1,失败返回0,时间复杂度为O(1)

应用场景还是比较广泛的,比如手机验证码一般有效期为五分钟、优惠券的指定时间内有效等等。

pexpire key seconds       //给key添加过期时间,单位为毫秒ms

ttl

ttl key                  //查看key的过期时间

type

type key                 //查看该键值对vlaue的类型

时间复杂度:O(1)

返回值: none , string , list , set , zset , hash and stream。

在redis中上述类型的操作方式差别很大,使用的命令都完全不同,本片主要介绍的是一些全局命令,可以搭配任意类型使用

Redis中key的删除策略

Redis中有很多的键值对数据,其中绝大部分都有过期时间,此时Redis怎么知道那些需要key过期了,那些没有过期呢?如果全部遍历一遍效率是比较低的,而且存在和 keys * 同样的问题,导致redis服务阻塞。

redis的整体策略是:

  1. 定期删除——每次抽取一部分验证过期时间,这个过程要保证足够快才行。
  2. 惰性删除——假设key过期了,但是并没有及时删除,而是当key被访问的时候先判断一下有没有过期,如果过期就删除并返回nil

上述两种策略的效果一般,仍然可能会有很多过期的key占据内存没有及时删除,为此redis还提供了一种内存淘汰策略~~(挖坑)

关于定时删除:

redis低版本是单线程的,高版本中引入了多线程。对于单线程的redis而言,并没有使用定时器对key进行定时删除。因为使用定时器就势必要使用多线程。

  • 18
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Redis 的 Bitmap 类型是一种特殊的字符串类型,它可以用来处理一些基于二进制位的数据结构,例如布隆过滤器(Bloom Filter)或者统计用户在线时长等。 Bitmap 类型支持的操作包括: - bitset key offset value:将指定偏移量上的二进制位设置为 1 或 0。 - bitget key offset:获取指定偏移量上的二进制位的值。 - bitcount key [start end]:计算指定范围内的二进制位被设置为 1 的个数。 - bitop operation destkey key [key ...]:对多个 Bitmap 进行按位操作,并将结果保存到目标 Bitmap 中。 - bitpos key bit [start] [end]:在指定范围内查找第一个被设置为指定值的二进制位的位置。 以下是一个示例,演示如何使用 Bitmap 类型来统计用户在线时长: ``` # 将用户的登录时间记录到 Bitmap 中 # 假设用户 ID 为 1001,登录时间为 2021-10-01 10:00:00,登录时长为 30 分钟 # 将 2021-10-01 10:00:00 转换为时间戳,并除以 300,得到登录时间所在的 5 分钟时间段 redis> setbit online:1001 200 1 # 查询用户在线时长 # 统计 2021-10-01 10:00:00 ~ 2021-10-01 10:30:00 时间段内,用户在线的 5 分钟时间段个数 redis> bitcount online:1001 0 -1 6 ``` 在上面的示例中,我们将用户的登录时间记录到 online:1001 这个 Bitmap 中,偏移量为 200 的二进制位被设置为 1。接着,我们使用 bitcount 命令来统计该 Bitmap 中被设置为 1 的二进制位数量,即用户在线的时间段个数。由于每个时间段为 5 分钟,因此在线时长为 30 分钟,对应的时间段个数为 6。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值