数据库的key(键)总是一个字符串对象(String Object)
创建缓存
>SET msg “msg 是key ,这里是值"
执行结果:OK
获取缓存值
>GET msg
执行结果: “msg 是key ,这里是值"
缓存值追加内容
>APPEND msg “。这里是追加的值!”
执行结果:(integer)字符串字节长度
获取缓存值
>GET msg
执行结果: “msg 是key ,这里是值。这里是追加的值!"
创建缓存
RPUSH fruits “fruits是key,这是列表第一个值” “第二个值” “第三个值”
返回值:(integer) 3。 其中3表示数组长度
删除数组头元素,并返回被删除元素值
RPOP fruits
返回值:“fruits是key,这是列表第一个值”
删除数组指定位置的元素
LREM fruits 2
返回值:“第三个值”
返回指定索引位置的值
LINDEX fruits 1
返回值:“第二个值”
数据插入到指定位置
LINSERT fruits 1 “指定元素1的值!”
返回值:(integer) 3。 其中3表示数组长度
设置值
HSET test name “张三”
返回值:(integer) 1。
获取指定键的值
HGET test name
返回值:“张三”
判断键值对是否存在
HEXISTS test name
返回值:true
删除指定键和对应的键值
HDEL test name
返回值:
返回整个字典值
HGETALL test
返回值:
设置值
SADD numberSet 1 2 3
返回值:3
删除指定元素
SREM numberSet 1 2 3
返回值:
设置值
ZADD numberSet 1 2 3
返回值:3
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通过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服务器使用单线程进程的方式来处理请求命令,通过采用I/O多路复用技术提高与客户端的网络通信能力。
Redis会对每一个处于连接状态的客户端,创建以下相关信息,已达到多客户端时候能够准确完成请求。
- 客户端的套接字描述符:
伪客户端(AOF、Lua脚本),普通客户端需要使用套接字通信的客户端。- 客户端的名字:
一般为空- 客户端的标志值(flag): 记录客户端角色、以及客户端所处状态。
- 执行客户端正在使用数据库的指针,以及该数据库的号码。
- 客户端当前要执行的命令、命令的参数、命令参数的个数,以及执行命令实现函数的指针。
- 客户端的输入缓存区和输出缓冲区。 动态调整大小,不能超多最大值1GB。
- 客户端的复制状态信息,以及进行复制所需要的数据结构
- 客户端执行BRPOP、BLPOP等列表阻塞命令时使用的数据结构。
- 客户端的事物状态、以及执行WATCH命令时用到的数据结构。
- 客户端执行发布与订阅功能时用到的数据结构。
- 客户端的身份验证标志。0:未认证,1:已认证
- 客户端的创建时间,客户端和服务器最后一次通信时间,以及客户端的输出缓冲区大小超出软性限制的时间。
客户端向从服务器发送SLAVEEOF命令,要求从服务器复制主服务器的数据,并实现主从数据同步。
通过PSYNC命令实现:完整同步功能(和SYNC命令执行一致)和部分同步(主服务器只发送断开连接之后执行的命令给从服务器)
进行全部复制,否则只复制偏移的数据。