基础概念
- 字符串、数字,都会转化为字符串来进行存储
- 以二进制的方式存储在内存中
key的命名规范
- key不宜过长,消耗内存,且在数据查找的这类键值的计算成本高(通过hash计算来查找)
- 不宜过短,可读性查值
- 一个字符串类型的值最多能存储512M内容
常用命令--必须掌握
1.存字符串类型的值
set key value nx ex
说明:设置一个字符串的key
特殊参数:
nx -> not exixt 代表当key不存在时,才存储这个key
ex -> expire 过期时间,单位s
例子
set username mike
2.取某个key所对应的值
get key
说明:获取指定 key 的值,如果key不存在则返回null
3.求key存储值得长度
strlen key
说明:获取key存储值得长度
4.
getrange key start stop
说明:获取指定范围切片内容(包含start stop)
5.
setrange key index value
说明:从索引值开始,用value替换原来得内容,并返回最新得长度
数值操作--必须掌握
1.
incrby key 步长
说明: 将key增加指定得步长
2.
decrby key 步长
说明: 将key减少指定得步长
3.
incr key : +1 操作
4.
decr key : -1操作
应用场景
缓存
说明:将MySQL中高频访问的数据存储到redis字符串类型中
并发计数 -- 点赞/秒杀
说明:通过redis单进程单线程的特点,由redis负责计数,由redis负责计数,并发问题转为串行问题
带有效期的验证码
说明:借助过期时间,存储验证码;到期后,自动消亡
过期时间
默认情况下,key没有设置过期时间,需要手动指定
方案1:直接用set的ex参数
set key value ex 3
方案2:使用expire通用命令
1.set key value
2.expire key 5 # 秒
3.pexpire key 5 # 毫秒
注意:这种方案可能存在丢包
检查过期时间
查看过期时间 ttl key -- 通用命令
返回值:
-1:代表当前key没有过期时间
大于0:代表当前key的剩余存活时间
-2: 代表当前key不存在
删除过期时间
persist key
说明:把带有过期时间的key 变为 永久不过期
返回值: 1代表删除过期时间成功/ 0代表当前key没有过期时间 or key 不存在
Redis删除过期key机制
每个redis数据库中,都会有一个特殊的容器负责存储带有过期时间的key以及它对应的过期时间,
这个容器称之为“过期字典”。
针对过期字典中的key,redis结合 惰性删除 和 定期删除 俩大机制, 有效删除过期数据
Redis 使用的过期删除策略是惰性删除+定期删除这两种策略配和使用。
惰性删除
当我们查询一个 key 时,Redis 首先检查该 key 是否存在于过期字典中:
- 如果不在,则正常读取键值;
- 如果存在,则会获取该 key 的过期时间,然后与当前系统时间进行比对,如果比系统时间大,那就没有过期,否则判定该 key 已过期。
惰性删除优缺点
优点
因为每次访问时,才会检查 key 是否过期,所以此策略只会使用很少的系统资源,因此,惰性删除策略对 CPU 时间最友好。
缺点:
如果一个 key 已经过期,而这个 key 又仍然保留在数据库中,那么只要这个过期 key 一直没有被访问,它所占用的内存就不会释放,造成了一定的内存空间浪费。所以,惰性删除策略对内存不友好。
定期删除策略
定期删除策略的做法是,每隔一段时间「随机」从数据库中取出一定数量的 key 进行检查,并删除其中的过期key。
Redis 的定期删除的流程:
1.从过期字典中随机抽取 20 个 key;
2.检查这 20 个 key 是否过期,并删除已过期的 key;
3.如果本轮检查的已过期 key 的数量,超过 5 个(20/4),也就是「已过期 key 的数量」占比「随机抽取 key 的数量」大于 25%,则继续重复步骤 1;如果已过期的 key 比例小于 25%,则停止继续删除过期 key,然后等待下一轮再检查
可以看到,定期删除是一个循环的流程,我们知道redis是单进程单线程机制,那 Redis 为了保证定期删除不会出现循环过度,导致线程卡死现象,为此增加了定期删除循环流程的时间上限,默认不会超过 25ms。
定期删除的流程如下:
定期删除策略优缺点
优点:
通过限制删除操作执行的时长和频率,来减少删除操作对 CPU 的影响,同时也能删除一部分过期的数据减少了过期键对空间的无效占用。
缺点:
难以确定删除操作执行的时长和频率。如果执行的太频繁,就会对 CPU 不友好;如果执行的太少,那又和惰性删除一样了,过期 key 占用的内存不会及时得到释放。