• 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秒之后过期
    PEXPIRE 命令key将在ts秒之后过期
    EXPIREAT 命令键key将在指定时间ts过期,ts为时间戳
    PEXPIREAT 命令键key将在指定时间ts过期,ts为时间戳

    取消过期时间设置

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

    计算并返回剩余时间

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

    判断是否过期

    is_expired 判断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时,进行全部复制。否则查看偏移量是否在复制积压缓冲区来决定复制策略。
  • 相关阅读:
    【数据结构】Decreasing String—CF1886C
    心中有码,自然快乐
    老年生活照护实训室:让养老护理变得更简单
    常用函数utils
    JAVA8特点
    Java.lang.Class类 getEnclosingMethod()方法有什么功能呢?
    Mybatis动态sql条件查询、判断空值和空字符串
    Spark 之 deploy
    介绍CY5-azide叠氮化物作为一种荧光染料的特点
    Redis7--基础篇1(概述,安装、卸载及配置)
  • 原文地址:https://blog.csdn.net/swg321321/article/details/126431111