1. 初识 Redis
自行查阅 Redis官方文档 了解 Redis。推荐阅读列表:
注意:本文档只介绍常见用法,一些特殊的用法请参考官方文档。
2. 常见用法
Redis可当成命令行程序使用,也可以使用交互模式,参考 如何使用Redis命令行界面?
注意:本文档所述均基于交互模式。
2.1. 连接管理
2.1.1. 连接Redis
使用默认参数(IP:127.0.0.1;端口:6379)连接Redis:
$ redis-cli
连接指定IP(-h)和端口(-p)的Redis:
$ redis-cli -h redis15.localnet.org -p 6390
如果执行命令时提示(error) NOAUTH Authentication required.
表示需要输入密码。使用 auth 命令认证即可,如下所示(其中 123456
为密码):
> auth 123456
连接成功之后执行 ping
命令即可测试连接是否正常:
> ping
PONG
2.1.2. 断开连接
使用 quit
命令即可断开与服务器的连接:
> quit
2.2. 基础操作
2.2.1. 查看帮助
使用 help
命令查看帮助:
> help
redis-cli 5.0.14.1 (git:ec77f72d)
To get help about Redis commands type:
"help @<group>" to get a list of commands in <group>
"help <command>" for help on <command>
"help <tab>" to get a list of possible help topics
"quit" to exit
To set redis-cli preferences:
":set hints" enable online hints
":set nohints" disable online hints
Set your preferences in ~/.redisclirc
查看指定命令组帮助:
> help @generic
命令组包含:
- @generic
- @string
- @list
- @set
- @sorted_set
- @hash
- @pubsub
- @transactions
- @connection
- @server
- @scripting
- @hyperloglog
- @cluster
- @geo
- @stream
查看指定命令帮助:
> help get
2.2.2. 查看基础信息
使用 info
命令查看基础信息(服务器信息、内存使用情况、客户端统计信息等),可查看所有信息:
> info
也可查看指定部分信息:
> info server
> info keyspace
2.2.3. 清屏
当觉得命令行界面上显示的信息过于杂乱时,可使用 clear
命令执行清屏操作:
> clear
2.2.4. 选择数据库
redis默认创建16个数据库(编号为0-15),可使用 select
命令选择数据库:
> select 0
OK
> select 15
OK
2.2.5. 查看数据库key数量
可使用 dbsize
命令查看当前数据库中 key 总数
> select 0
OK
> dbsize
(integer) 7
> select 15
OK
> dbsize
(integer) 0
2.2.6. 重复执行命令
在命令之前加上一个数字,可以重复执行指定次数命令:
> set mycounter 0
OK
> 3 incr mycounter
(integer) 1
(integer) 2
(integer) 3
> get mycounter
"3"
2.3. key基础操作
2.3.1. key设计
key是二进制安全的,空字符串也是一个有效的key,key最大为512MB。
不建议使用过长的key,key过长时可通过摘要算法(如SHA1)计算后再用作key。
不建议单纯为了节省一点点内存就将key缩写成不易读的格式。
建议采用固定的策略来设计key,使用":“来分割字段,使用”-"来分割单词,例如:comment:4321:reply-to。
2.3.2. 创建key
使用 set
命令来创建 key(string类型):
> set mykey hello
OK
2.3.3. 获取key对应的值
使用 get
命令来获取 key(返回"(nil)"时表示 key 不存在):
> get mykey
hello
2.3.4. 判断key是否存在
使用 exists
命令来判断 key 是否存在,返回 1 时表示存在,返回 0 时表示不存在。
> exists mykey
(integer) 1
2.3.5. 删除key
使用 del
命令来删除key(返回1表示删除成功,返回0表示key不存在):
> exists mykey
(integer) 1
> del mykey
(integer) 1
> exists mykey
(integer) 0
> get mykey
(nil)
2.3.6. 重命名key
可使用 rename
命令来重命名 key:
> set mykey hello
OK
> get mykey
hello
> rename mykey newkey
OK
> get newkey
"hello"
> get mykey
(nil)
2.3.7. 查看key类型
使用 type
命令查看key类型:
> type mykey
none
> set mykey hello
OK
> type mykey
string
> set mykey 123
OK
> type mykey
string
2.3.8. 设置key过期时间
可以在设置key时设置过期时间(ex
指定s
,px
指定ms
),key 过期之后会被自动删除:
> set mykey hello ex 10
OK
也可以在设置key之后再设置过期时间,使用 expire
命令指定key过期时间(单位:s):
> set mykey hello
> expire mykey 10
可以使用 ttl
命令查看 key 剩余时间(单位:s,返回负数时表示不会过期):
> set mykey hello
OK
> ttl mykey
(integer) -1
> expire mykey 10
(integer) 1
> ttl mykey
(integer) 7
如果需要设置过期时间精度为 ms
,使用 pexpire
命令来设置过期时间,使用 pttl
命令来获取剩余过期时间:
> set mykey hello
OK
> pexpire mykey 100000
(integer) 1
> pttl mykey
(integer) 89736
新建 key 时未使用 ex
或 px
选项指定过期时间,默认永不过期,那如果中途使用了 expire
或 pexpire
命令设置了过期时间之后又想重新设置为永不过期该怎么办呢,可以使用 expire
命令指定一个小于等于0的过期时间:
> ttl mykey
(integer) 7
> expire mykey 0
(integer) 1
> ttl mykey
(integer) -2
2.3.9. 浏览key
可以使用 keys
命令来查看所有匹配指定模式的 key 列表(key 数量很大时会导致 redis 服务器阻塞,慎用!):
> select 15
OK
> set key1 1
OK
> set key2 2
OK
> set key3 3
OK
> keys *
1) "key2"
2) "key1"
3) "key3"
匹配模式参考官方文档:
h?llo
匹配hello
,hallo
和hxllo
h*llo
匹配hllo
和heeeello
h[ae]llo
匹配hello
和hallo
, 不匹配hillo
h[^e]llo
匹配hallo
,hbllo
, … 不匹配hello
h[a-b]llo
匹配hallo
和hbllo
可以使用 scan
命令来分页查看所有匹配指定模式的 key 列表(推荐使用):
> scan 0 match * count 2
1) "1"
2) 1) "key2"
2) "key1"
> scan 1 match * count 2
1) "0"
2) 1) "key3"
2.3.10. 清空key
清空指定库中所有key:
> select 2
OK
> dbsize
(integer) 7
> flushdb
OK
> dbsize
(integer) 0
清空所有库中的key:
> flushall
OK
> select 0
OK
> dbsize
(integer) 0
3. 数据结构
3.1. Strings(字符串)
常用于缓存(二进制字符串),也可用于计数器或者执行位运算。
全量命令自行参考 Redis字符串操作命令 。
常用命令:
set
新建字符串。get
获取字符串值。setnx
仅当key不存在时设置字符串值。getset
设置新值后返回旧值。mset
新建多个字符串。mget
获取多个字符串的值。incr
使计数值加1。incrby
增加计数值。decr
使计数值减1。decrby
减少计数值。incrbyfloat
增减浮点数。
使用 set
命令设置值,使用 get
命令获取值:
> set mykey hello ex 1000
OK
> get mykey
"hello"
> ttl mykey
(integer) 995
> set mykey world
OK
> ttl mykey
(integer) -1
set
命令会重新设置 key 对应的值,且会重新设置过期时间。
使用 nx
(key不存在时设置) 和 xx
(key存在时才设置) 参数指定设置时是否检查key是否存在:
> set mykey world nx
OK
> get mykey
"hello"
> set mykey world xx
OK
> get mykey
"world"
setnx
命令效果等同于 set
命令加上 nx
参数。
可以使用 getset
命令来实现在设置新值时获取旧值:
> set mycounter 0
OK
> 3 incr mycounter
(integer) 1
(integer) 2
(integer) 3
> getset mycounter 0
"3"
可使用 mset
和 mget
命令来同时设置多个值或者同时获取多个值:
> mset bike:1 "Deimos" bike:2 "Ares" bike:3 "Vanth"
OK
> mget bike:1 bike:2 bike:3
1) "Deimos"
2) "Ares"
3) "Vanth"
可用作计数器,使用 incr
和 incrby
命令来增加计数,使用 decr
和 decrby
命令来减少计数:
> set mycounter 0
OK
> incr mycounter
(integer) 1
> incrby mycounter 3
(integer) 4
> decr mycounter
(integer) 3
> decrby mycounter 2
(integer) 1
> incrby mycounter -1
(integer) 0
可以使用 incrbyfloat
命令来操作浮点数:
> incrbyfloat mycounter 1.23
"1.22999999999999998"
> incrbyfloat mycounter -0.23
"1"
3.2. Lists(列表)
列表是字符串类型值的链表,常用于实现栈和队列。
常用业务场景:
- 用于多进程交互,生产者进程往列表存入数据,消费者进程从列表取出数据。
- 用于记录最新产生的业务数据。
全量命令自行参考 Redis列表操作命令。
常用命令:
lpush
从左侧插入数据。lpop
从左侧弹出数据。rpush
从右侧插入数据。rpop
从右侧弹出数据。llen
获取列表元素个数。lmove
将一个列表中的元素移动到另一个列表中。lrange
获取列表指定范围内的元素。ltrim
截断列表,删除部分元素。blpop
从左侧弹出数据(无数据时阻塞)。brpop
从右侧弹出数据(无数据时阻塞)。
将列表用作队列(先进先出):
> lpush bikes:repairs bike:1
(integer) 1
> lpush bikes:repairs bike:2
(integer) 2
> rpop bikes:repairs
"bike:1"
> rpop bikes:repairs
"bike:2"
将列表用作栈(后进先出):
> lpush bikes:repairs bike:1
(integer) 1
> lpush bikes:repairs bike:2
(integer) 2
> lpop bikes:repairs
"bike:2"
> lpop bikes:repairs
"bike:1"
获取列表的长度:
> llen bikes:repairs
(integer) 0
从一个列表弹出元素后加入另一个列表中:
> lpush bikes:repairs bike:1
(integer) 1
> lpush bikes:repairs bike:2
(integer) 2
> lmove bikes:repairs bikes:finished LEFT LEFT
"bike:2"
> lrange bikes:repairs 0 -1
1) "bike:1"
> lrange bikes:finished 0 -1
1) "bike:2"
限制列表的长度:
> rpush bikes:repairs bike:1 bike:2 bike:3 bike:4 bike:5
(integer) 5
> ltrim bikes:repairs 0 2
OK
> lrange bikes:repairs 0 -1
1) "bike:1"
2) "bike:2"
3) "bike:3"
可以使用 brpop
或者 blpop
命令来阻塞等待列表:
> rpush bikes:repairs bike:1 bike:2
(integer) 2
> brpop bikes:repairs 1
1) "bikes:repairs"
2) "bike:2"
> brpop bikes:repairs 1
1) "bikes:repairs"
2) "bike:1"
> brpop bikes:repairs 1
(nil)
(2.01s)
3.3. Sets(集合)
用于存储未排序的集合,集合中所有值都是唯一的。
全量命令自行参考 Redis集合操作命令
常用命令有:
sadd
向集合中添加新的元素。srem
从集合移除指定元素。sismember
测试集合中是否存在指定值元素。sinter
获取两个或多个集合的交集。scard
获取集合中元素个数。smembers
获取集合所有元素。
使用示例:
> sadd bikes:racing:france bike:1
(integer) 1
> smembers bikes:racing:france
1) "bike:1"
> sadd bikes:racing:france bike:1
(integer) 0
> sadd bikes:racing:france bike:2 bike:3
(integer) 2
> sadd bikes:racing:usa bike:1 bike:4
(integer) 2
> sismember bikes:racing:usa bike:1
(integer) 1
> sismember bikes:racing:usa bike:2
(integer) 0
> sinter bikes:racing:france bikes:racing:usa
1) "bike:1"
> scard bikes:racing:france
(integer) 3
3.4. Hashes(哈希)
用于存储相关联的一组字段-值。
全量命令自行参考 Redis哈希操作命令。
常用命令有:
hset
设置指定哈希的单个或多个字段值。hget
从指定哈希中获取单个字段值。hmget
从指定哈希中获取单个或多个字段值。hgetall
从指定哈希中获取所有字段值。hincrby
对指定哈希中的字段值执行加减算术操作。
使用示例:
> hset bike:1 model Deimos brand Ergonom type 'Enduro bikes' price 4972
(integer) 4
> hget bike:1 model
"Deimos"
> HMGET bike:1 model price no-such-field
1) "Deimos"
2) "4972"
3) (nil)
> hgetall bike:1
1) "model"
2) "Deimos"
3) "brand"
4) "Ergonom"
5) "type"
6) "Enduro bikes"
7) "price"
8) "4972"
> hincrby bike:1 price 100
(integer) 5072
> hincrby bike:1 price -100
(integer) 4972
3.5. Sorted sets(有序集合)
有序集合将字符串与一个得分关联,常用于实现排行榜功能。
全量命令自行参考 Redis有序集合操作命令。
常用命令有:
zadd
向集合新增元素。zincrby
修改指定元素得分。zrem
从排序集合中删除指定元素。zrange
获取排序集合指定范围的元素。zrank
获取指定元素在排序集合中的排名(升序)。zrevrank
获取指定元素在排序集合中的排名(降序)。zrangebyscore
或者指定得分范围内的元素。
使用示例:
> zadd racer_scores 10 "Norem"
(integer) 1
> zadd racer_scores 8 "Sam-Bodden" 10 "Royce"
(integer) 2
> zrange racer_scores 0 -1
1) "Sam-Bodden"
2) "Norem"
3) "Royce"
> ZREVRANGE racer_scores 0 -1
1) "Royce"
2) "Norem"
3) "Sam-Bodden"
> zrange racer_scores 0 -1 withscores
1) "Sam-Bodden"
2) "8"
3) "Norem"
4) "10"
5) "Royce"
6) "10"
> zrangebyscore racer_scores -inf 9
1) "Sam-Bodden"
> zrank racer_scores Royce
(integer) 2
> zrevrank racer_scores Royce
(integer) 0
> zrem racer_scores Royce
(integer) 1
> zincrby racer_scores 5 Norem
"15"
3.6. Bitmaps(位图)
位图用于实现位操作。
全量命令自行参考 Redis位图操作命令。
常用命令:
setbit
用于将对应位设置为0或1。getbit
用于获取对应位的值。bitcount
用于获取位图中为1的位数。bitop
用于操作单个或多个位图。
使用示例:
> setbit pings:2024-01-01-00:00 123 1
(integer) 0
> getbit pings:2024-01-01-00:00 123
(integer) 1
> getbit pings:2024-01-01-00:00 456
(integer) 0
> bitcount pings:2024-01-01-00:00
(integer) 1
> setbit pings:2024-01-01-00:00 123 0
(integer) 1
> bitcount pings:2024-01-01-00:00
(integer) 0
> bitop NOT destbit pings:2024-01-01-00:00
(integer) 16
> bitcount destbit
(integer) 128
3.7. 其他数据类型
自行参考官方文档学习: