目录
Redis简介
Redis5.0新特性
-
新增 Streams 数据类型,这是 Redis5.0最重要的改进之一。可以把 Streams 当做消息队列。
-
新的模块 API、定时器、集群及字典。
-
RDB 中持久化存储 LFU 和 LRU 的信息
-
将集群管理功能完全用 C 语言集成到 redis-cli 中,Redis 3.x 和 Redis 4.x 的集群管理是通过 Ruby 脚本实现的。
-
有序集合新增命令 ZPOPMIN/ZPOPMAX。
-
改进 HyperLogLog 的实现。
-
新增 Client Unblock 和 Client ID
-
新增 LOLWUT 命令。
-
Redis 主从复制中的从不在称为 Slave,改成 Replicas。
-
Redis 5.0引入动态哈希,以平衡 CPU 的使用率和响应性能,可以通过配置文件进行配置。Redis 5.0默认使用动态哈希。
-
Redis 核心代码进行了部分重构和优化。
Redis 安装与调试
安装
$ wget http://download.redis.io/releases/redis-5.0.0.tar.gz $ tar -zxvf redis-5.0.0.tar.gz $ cd redis-5.0.0 $ make $ cd src $ make install
至此,编译安装完成,生成的可执行文件在/usr/local/bin 目录中。
-
其中redis-benchmark 是官方自带的 Redis 性能测试工具;
-
当 AOF 文件或者 RDB 文件出现语法错误时,可以使用 redis-check-aof 或者 redis-check-rdb 修复;
-
redis-cli 是客户端命令行工具,可以通过命令 redis-cli -h {host} -p {port}连接到指定 Redis 服务其;
-
redis-sentinel 是 Redis 哨兵启动程序;
-
redis-server 是 Redis 服务端启动程序。
Stream
Stream 结构主要由消息、生产者、消费者、消费组4部分组成。
键相关命令
查看键信息
查看键类型type
type 命令用于查看 key 的类型,一般用于排查问题
格式:type key
查看键过期时间 ttl
ttl命令返回 key 剩余生存时间,单位秒。一般用于根据 key 生存时间进行业务逻辑判断处理等,也可以排插问题。类似命令还有 pttl 返回以毫秒为单位的生存时间。
格式:ttl key
设置键信息
设置键过期时间expire
expire 命令用于设置 key 的过期时间,一般情况下 redis 的 key 应该都有一个对应的过期时间。类似命令还有 expireat、pexpire、pexpireat,格式都一样,区别在于时间和单位。他们调用的函数也是同一个,以 expire 为例。
格式:expire key seconds
删除键过期时间persist
persist 命令用于移除 key 的过期时间,如果有。有时候我们需要将临时 key 编程永久 key,那么可以使用 persist 命令处理。
格式:persist key
重命名键rename
rename命令将 key 重命名,使用频率较低。同样类似命令还有 renamenx,标识重命名后的 key 不存在时才能执行成功。
格式:rename key new_key
修改键最后访问 touch
touch 命令用于更新 key 的访问时间,避免被 lru 策略淘汰,使用频率较低。
格式:touch key [key ...]
查找键
exists 命令查询键是否存在,keys 命令查找符合模式的键,scan 命令遍历键,以及 randomkey 命令随机取键。
判断键是否存在 exists
exists 命令用于判断指定的 key 是否存在,并返回 key 存在的数量
格式:exists key1 key2 ... key_N
查找符合模式的键 keys
keys 命令匹配合适的 key 并一次性返回,如果匹配的键较多,则可能阻塞服务器,因此该命令一般禁止在线上使用。
格式:keys pattern
遍历键
scan 命令可以遍历数据库中几乎所有的键,并且不用担心阻塞服务器。使用频率低
格式:scan cursor [MATCH pattern] [COUNT count]
随机取键 randomkey
rendomkey 命令随机返回数据库中的 key
操作键
del 是比较常用的删除键命令,unlink 是 Redis 4.0为了弥补 del 删除大值时阻塞服务器而加入的异步删除键命令。
删除键
del 命令用于同步删除一个或多个 key,因为池同步删除,所以在删除大 key 时可能会阻塞服务器。以阻塞方式删除 key
格式:del key [key ...]
unlink 命令以异步方式删除 key,这可以避免 del 删除大 key 的问题,unlink 在删除时会判断删除所需的工作量,以此决定使用同步还是异步删除(另一个线程中进行内存回收,不会阻塞当前线程),通常建议使用 unlink 代替 del 命令,但注意使用 unlink 命令需 Redis 版本在4.0及以上。
格式:unlink key [key ...]
说明:根据删除 key 需要的工作量来选择以阻塞或非阻塞方式删除 key。
序列化/反序列化键
-
dump 命令
该命令将指定 key 序列化,一般使用较少。
格式:dump key
说明:序列化 key 并返回序列化后的数据。
-
restore 命令
该命令使用 dump 命令序列化后的数据进行反序列化,使用频率较低。
格式:restore key ttl serialized-value [replace]
说明:反序列化给定的序列化值,并与 key 关联。
移动键move
-
move命令
move 命令将指定 key 移动到另一个数据库,该命令使用较少。 此命令不能工作在集群模式下。
格式:move key db
-
migrate 命令
migrate 命令将指定 key 迁移到另一个 redis 实例,一般用于运维迁移数据。
格式:migrate host port key|"" destination-db timeout [copy] [replace] [keys key [key ...]]
键排序 sort
sort 命令对列表,集合或有序集合中的元素进行排序,使用方法相对复杂。
字符串相关命令
设置字符串
set命令
set 命令用于将 key-value 设置到数据库。如果 key 已经设置,则 set 会用新值覆盖旧值,如果在设置时不指定 ex 或 px 参数,set 命令会清除原有超时格式。
格式:
set key value [NX] [XX] [EX <deconds>] [PX <milliseconds>]
参数:
-
NX:当数据库中 key 不存在时,可以将 key-value 添加到数据库
-
XX:当数据库中 key存在时,可以将 key-value 设置到数据库,与 NX 参数互斥
-
EX:key 的超时秒数
-
PX:key 的超时毫秒数,与 EX参数互斥。
mset 命令
修改字符串
append命令
数据库已经有了 key,它的值为 value。当我们发现 value 值需要追加字符串却又不想直接用 set 命令覆盖原值时,可以用 append 命令来实现。将 value 值追加到原值的末尾,如果 key 不存在,此命令等同于 set key value命令。
格式:
append key value
setrange 命令
setrange 命令主要用于设置 value 的部分子串给,设置时将值从偏移量 offset 开始覆盖成 value 值。如果偏移值大于原值的长度,则偏移量之前的字符串由"\x00"填充。
格式:setrange key offset value
计数器命令
计数器命令主要包括 incr/decr、incrby/decrby 和 incrbyfloat 这5个相关命令,Redis 的计数器命令都是原子性的操作,因此并不会因为并发导致统计出错。
格式:
incr key
decr key
说明:将 key 存储的值加或减1
incrby key increment
decrby key decrement
说明:将 key 存储的值加或减指定值(increment//decrement)
字符串获取
get 命令
get 命令用于获取 key 的值,当 key 不存在时,返回 NULL,当 key 存在时,返回查找到的结果
getset 命令
getset 命令将指定 key 的值设为 value,并返回 key 的旧值。
格式:getset key value
getrange 命令
通过 get 命令可以完整的获取到字符串的值,但当我们只想获取字符串的部分子串时,通过 getrange 命令便可以实现。getrange 返回 key 的 value 值从 start 截取到 end 的子字符串。
格式:getrange key start end
strlen 命令
strlen 命令从数据库中获取到 value,返回 value 字符串的长度。
格式:strlen key
mget命令
散列表相关命令
设置命令
3个命令可使用:hset、hmset 和 hsetnx。
格式:
hset key field value
hmset key field value [field value ...]
hsetnx key field value
读取命令
命令有如下5类:
-
hexists:判断 field 域是否存在。
-
hget/hmget:获取单个 field 对应的 value 以及获取批量 field 对应的 value。
-
hkeys/hvals/hgetall:获取全部的 field、value 或者 field-value 对
-
hlen:获取 field 的总个数
-
hscan:遍历 hscan。
hexists命令
hexists 命令用于查看某个 field 是否存在,可以用于标识某个操作之前是否已经执行过。
格式:hexists key field
hget/hmget 命令
hget/hmget 命令用于获取单个 field 或者多个 field 对应的 value 值
格式:
hget key field
hmget key field [field ...]
Hkeys/hvals/hgetall 命令
hkeys 可以获取某个 key 下的所有 field 信息;hvals 可以获取每个 field 对应的 value 信息;hgetall 可以获取所有的 field-value 对。
格式:
hkeys key
hvals key
hgetall key
hlen 命令
hlen 命令可以用于获取散列表中 field 的个数,主要用于数据统计
格式:hlen key
hscan 命令
hscan 命令用于遍历散列表中所有的 field-value 对,需要注意的是,hscan 命令是渐进式遍历(当底层存储为散列表是)。
格式:hscan key cursor [Match pattern] [COUNT count]
删除命令
hdel 命令
hdel 命令直接调用 ziplist 或者散列表的接口将数据删除。
格式:hdel key field [field ...]
自增命令
当散列表 field-value 中的 field 为整数或者浮点型的数据时,有时需要对其中的 value 进行加减法操作,为此,Redis 提供了 hincrby、hincrbyfloat 两个命令。
格式:
hincrby key field increment
hincrbyfloat key field increment
列表相关命令
列表命令
命令名称 | 命令格式 | 命令简介 |
---|---|---|
blpop | blpop key [key ...] timeout | 从列表 key 头部弹出元素并返回客户端,当列表 key 为空时会阻塞客户端,可以通过 timeout 设置最大阻塞时间,单位为秒 |
brpop | brpop key [key ...] timeout | 与 blpop 类似,只是从列表 key 的尾部弹出元素 |
brpoplpush | Brpoplpush source destination timeout | 从列表 source 尾部弹出元素并且插入列表 destination 头部,同时将该元素返回给客户端,当 source 列表为空时会阻塞客户端,timeout 用于设置最大阻塞时间,单位为秒 |
lindex | lindex key index | 返回列表 key 中下标为 index 的元素 |
linsert | linsert key BEFORE/AFTER pivot value | 将值 value 插入到列表 key,且位于值 pivot 之前或之后 |
llen | llen key | 返回列表 key 的长度 |
lpop | lpop key | 从列表 key 头部弹出元素并返回给客户端,与 blpop 不同的是它不会阻塞客户端,当列表 key 为空时返回 null |
lpush | Lpush key value [value ...] | 将一个或多个值 value 插入到列表 key 的头部,当列表 key 不存在时会创建一个空的列表 |
lpushx | lpushx key value | 将值 value 插入到列表key 头部,当列表 key 不存在时该命令什么都不做 |
lrange | lrange key start stop | 返回列表 key 中指定区间内的元素,区间通过索引 start 和 stop 指定 |
lrem | lrem key count value | 移除列表中与参数 value 相等的元素;当 count 大于0,从表头开始向尾部搜索,最大删除 count 个元素;当 count 小于0;从尾部开始向表头搜索,最大删除 count 绝对值个元素;当 count 等于0,删除所有与 value 相等的元素 |
lset | lset key index value | 将列表 key 下标为 index的元素值设为 value |
ltrim | ltrim key start stop | 对一个列表进行修剪,即让列表只保留区间 start 与 st |