Redis--字符串

基础概念

  1. 字符串、数字,都会转化为字符串来进行存储
  2.  以二进制的方式存储在内存中  

key的命名规范

  1. key不宜过长,消耗内存,且在数据查找的这类键值的计算成本高(通过hash计算来查找)
  2. 不宜过短,可读性查值
  3. 一个字符串类型的值最多能存储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 使用的过期删除策略是惰性删除+定期删除这两种策略配和使用。

惰性删除

Redis--字符串_第1张图片

当我们查询一个 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。

定期删除的流程如下:

Redis--字符串_第2张图片

定期删除策略优缺点
优点:

通过限制删除操作执行的时长和频率,来减少删除操作对 CPU 的影响,同时也能删除一部分过期的数据减少了过期键对空间的无效占用。
缺点:

难以确定删除操作执行的时长和频率。如果执行的太频繁,就会对 CPU 不友好;如果执行的太少,那又和惰性删除一样了,过期 key 占用的内存不会及时得到释放。
 

你可能感兴趣的:(Redis,redis,数据库,缓存)