文章目录
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会对每一个处于连接状态
的客户端,创建以下相关信息,已达到多客户端时候能够准确完成请求。
- 客户端的套接字描述符:
伪客户端
(AOF、Lua脚本),普通客户端
需要使用套接字通信的客户端。- 客户端的名字:
一般为空
- 客户端的标志值(flag): 记录客户端角色、以及客户端所处状态。
- 执行客户端正在使用数据库的指针,以及该数据库的号码。
- 客户端当前要执行的命令、命令的参数、命令参数的个数,以及执行命令实现函数的指针。
- 客户端的输入缓存区和输出缓冲区。 动态调整大小,不能超多最大值1GB。
- 客户端的复制状态信息,以及进行复制所需要的数据结构
- 客户端执行BRPOP、BLPOP等列表阻塞命令时使用的数据结构。
- 客户端的事物状态、以及执行WATCH命令时用到的数据结构。
- 客户端执行发布与订阅功能时用到的数据结构。
- 客户端的身份验证标志。0:未认证,1:已认证
- 客户端的创建时间,客户端和服务器最后一次通信时间,以及客户端的输出缓冲区大小超出软性限制的时间。
主从复制
同步复制
客户端向从服务器发送SLAVEEOF
命令,要求从服务器复制主服务器的数据,并实现主从数据同步。
旧版本
- 从服务器向主服务器发送SYNC命令。
- 主服务器收到SYNC命令,开始执行BGSAVE命令,在后台生成一个RDB文件,且使用一个缓冲区记录从现在开始执行的所有命令。
- 当主服务器BGSAVE命令执行完毕时,主服务器将生成的RDB文件发送给从服务器,从服务器接收并载入RDB文件,使数据库状态更新值主服务器BGSAVE命令时的数据状态。
- 主服务器将记录在缓冲区里面所有写命令发送给从服务器,从服务器执行这些命令,使其达到数据一致。
- 当主服务器完成上述两个不步骤之后,会将更改数据的命令发送给从服务器使其后面数据一致。
新版本
通过PSYNC命令实现:完整同步功能(和SYNC命令执行一致)和部分同步(主服务器只发送断开连接之后执行的命令给从服务器)
部分同步功能实现
- 主服务器的复制偏移量和从服务器的复制偏移量。通过对比两者的偏移量来决定同步数据的多少。偏移量的数据来源于复制积压缓冲区。
- 主服务器进行命令传播时,不仅将写命令发送所有从服务器,还会将写命令入队到复制积压缓冲区。当同步的时候发现偏移量不存在缓冲区中则
进行全部复制
,否则只复制偏移
的数据。 - 服务器ID,每个服务器都会存在一个。在同步的时候会发送上次主服务器ID给现在连接上的主服务器,当主服务器发现ID不等于自己ID时,进行全部复制。否则查看偏移量是否在复制积压缓冲区来决定复制策略。