Redis基本数据与数据过期策略/主从复制/发布订阅/事物


Redis数据类型

数据库的key(键)总是一个字符串对象(String Object)

String(字符串对象)

创建缓存
>SET msg “msg 是key ,这里是值"
执行结果:OK

获取缓存值
>GET msg
执行结果: “msg 是key ,这里是值"

缓存值追加内容
>APPEND msg “。这里是追加的值!”
执行结果:(integer)字符串字节长度

获取缓存值
>GET msg
执行结果: “msg 是key ,这里是值。这里是追加的值!"

List(列表对象)

创建缓存
RPUSH fruits “fruits是key,这是列表第一个值” “第二个值” “第三个值”
返回值:(integer) 3。 其中3表示数组长度

删除数组头元素,并返回被删除元素值
RPOP fruits
返回值:“fruits是key,这是列表第一个值”

删除数组指定位置的元素
LREM fruits 2
返回值:“第三个值”

返回指定索引位置的值
LINDEX fruits 1
返回值:“第二个值”

数据插入到指定位置
LINSERT fruits 1 “指定元素1的值!”
返回值:(integer) 3。 其中3表示数组长度

Hash(哈希对象)

设置值
HSET test name “张三”
返回值:(integer) 1。

获取指定键的值
HGET test name
返回值:“张三”

判断键值对是否存在
HEXISTS test name
返回值:true

删除指定键和对应的键值
HDEL test name
返回值:

返回整个字典值
HGETALL test
返回值:

Set(集合对象)

设置值
SADD numberSet 1 2 3
返回值:3

删除指定元素
SREM numberSet 1 2 3
返回值:

Sorted Set(有序集合对象)

设置值
ZADD numberSet 1 2 3
返回值:3

Redis发布订阅

Redis的发布与订阅功能由PUBLISH(发布消息)、SUBSCRIBE(订阅消息)、PSUBSCRIBE(批订阅消息)等命令组成。

订阅主题之后,如果有客户端向主题发布消息,那么所有的订阅者都可以收到对应的消息。

一次订阅一个频道

SUBSCRIBE “news.it” //订阅频道 news.it
PUBLISH “news.it” “send订阅消息” //想频道news.it发送消息
UNSUBSCRIBE “news.it” //退订频道 news.it

一次订阅多个频道(批订阅)

PSUBSCRIBE “news.[ie]t” //订阅频道 news.it 和 news.et 。规则类似正则表达式
PUNSUBSCRIBE “news.[ie]t” //退订频道 news.it 和 news.et 。规则类似正则表达式

Redis事物

Redis通过MULTI、EXEC、WATCH等命令来实现事务功能。事物是将多个命令打包后一次性按顺序执行,在执行期间服务器不处理其他命令。

MULTI //开启事物,只是告诉服务器需要将下列命令一起打包
SET “name" “执行第一步”
GET “name”
SET “author” “执行第三步”
EXEC //执行事物,在这里完成命令打包,并执行打包的命令

WATCH命令,是乐观锁在EXEC命令执行之前,监视任务数量的数据库键,并在EXEC执行时,判断被监视的键是否至少有一次已经被修改过,如果被修改过则拒绝执行事务,并向客户端返回代表事务执行失败的空回复。

WATCH “author” //监视键author是否在执行事务之前被修改过
MULTI //开始事物,只是告诉服务器需要将下列命令一起打包
SET “name” “执行第一步”
GET “name”
SET “author” “执行第三步”
EXEC //执行事物,在这里完成命令打包,并按顺序执行打包的命令

过期处理

过期设置

EXPIRE <key> <ts> 命令键key将在ts秒之后过期
PEXPIRE <key> <ts> 命令key将在ts秒之后过期
EXPIREAT <key> <ts> 命令键key将在指定时间ts过期,ts为时间戳
PEXPIREAT <key> <ts> 命令键key将在指定时间ts过期,ts为时间戳

取消过期时间设置

PERSIST <key> 命令键key的过期时间设置取消

计算并返回剩余时间

TTL <key> 计算key 的过期时间和当前时间的间隔时间。返回时间为秒
PTTL <key> 计算key 的过期时间和当前时间的间隔时间。返回时间为毫秒

判断是否过期

is_expired <key> 判断key是否过期,过期返回true,否则为false。

过期键删除策略

定时删除

设置过期时间的同时,创建一个定时器,让定时器在建的过期时间到达之后,立即删除键。
好处:能够及时删除键,并释放空间
坏处:定时器会占用CPU资源,影响服务的响应时间和吞吐量。

惰性删除

不管键是否过期,在每次获取键的时候,在获得键之后,检查键是否过期,如果过期则删除键,否则返回该键。
好处:对CPU友好,不会占用太多的CPU资源。
坏处:占用不必要的内存空间。特别是当键过期之后,不会被访问到。

定期删除

每个一段时间检查数据库中有多少键是过期的,并删除这些过期的键。
好处:结合了定时删除和惰性删除的优点,有效减少过期键带来的内存让费,定时执行可以限制删除操作执行时间和频率来减少操作对CPU的影响。
难点:确定删除执行的时长和频率

如果删除操作执行得频繁,或者执行的时间太长,定期删除策略就会退化为定时删除策略,以至于将CPU时间过多地消耗在删除操作上。

如果删除操作太少,或者执行时间太短,定期删除策略又会退化成惰性删除策略,让费内存空间。

Redis定期删除策略

每次执行时间,会从一定数量的数据库中取出一定数量的随机键进行检查,并删除其中过期的键。

其中一定数量的数据库:执行策略是循环数据库
一定数量的随机键:按照上次进度继续下一轮。

Redis客服端

Redis服务器使用单线程进程的方式来处理请求命令,通过采用I/O多路复用技术提高与客户端的网络通信能力。

Redis会对每一个处于连接状态的客户端,创建以下相关信息,已达到多客户端时候能够准确完成请求。

  1. 客户端的套接字描述符:伪客户端(AOF、Lua脚本),普通客户端需要使用套接字通信的客户端。
  2. 客户端的名字: 一般为空
  3. 客户端的标志值(flag): 记录客户端角色、以及客户端所处状态。
  4. 执行客户端正在使用数据库的指针,以及该数据库的号码。
  5. 客户端当前要执行的命令、命令的参数、命令参数的个数,以及执行命令实现函数的指针。
  6. 客户端的输入缓存区和输出缓冲区。 动态调整大小,不能超多最大值1GB。
  7. 客户端的复制状态信息,以及进行复制所需要的数据结构
  8. 客户端执行BRPOP、BLPOP等列表阻塞命令时使用的数据结构。
  9. 客户端的事物状态、以及执行WATCH命令时用到的数据结构。
  10. 客户端执行发布与订阅功能时用到的数据结构。
  11. 客户端的身份验证标志。0:未认证,1:已认证
  12. 客户端的创建时间,客户端和服务器最后一次通信时间,以及客户端的输出缓冲区大小超出软性限制的时间。

主从复制

同步复制

客户端向从服务器发送SLAVEEOF命令,要求从服务器复制主服务器的数据,并实现主从数据同步。

旧版本

  1. 从服务器向主服务器发送SYNC命令。
  2. 主服务器收到SYNC命令,开始执行BGSAVE命令,在后台生成一个RDB文件,且使用一个缓冲区记录从现在开始执行的所有命令。
  3. 当主服务器BGSAVE命令执行完毕时,主服务器将生成的RDB文件发送给从服务器,从服务器接收并载入RDB文件,使数据库状态更新值主服务器BGSAVE命令时的数据状态。
  4. 主服务器将记录在缓冲区里面所有写命令发送给从服务器,从服务器执行这些命令,使其达到数据一致。
  5. 当主服务器完成上述两个不步骤之后,会将更改数据的命令发送给从服务器使其后面数据一致。

新版本

通过PSYNC命令实现:完整同步功能(和SYNC命令执行一致)和部分同步(主服务器只发送断开连接之后执行的命令给从服务器)

部分同步功能实现
  1. 主服务器的复制偏移量和从服务器的复制偏移量。通过对比两者的偏移量来决定同步数据的多少。偏移量的数据来源于复制积压缓冲区。
  2. 主服务器进行命令传播时,不仅将写命令发送所有从服务器,还会将写命令入队到复制积压缓冲区。当同步的时候发现偏移量不存在缓冲区中则进行全部复制,否则只复制偏移的数据。
  3. 服务器ID,每个服务器都会存在一个。在同步的时候会发送上次主服务器ID给现在连接上的主服务器,当主服务器发现ID不等于自己ID时,进行全部复制。否则查看偏移量是否在复制积压缓冲区来决定复制策略。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值