Redis学习之API使用指南

  • Post author:
  • Post category:其他


在本篇博文中,我们将介绍Redis的五种主要数据结构及其对应的常用API操作。Redis是一个功能强大的键值存储系统,提供了丰富的API来操作不同类型的数据。让我们逐个了解这些数据结构以及如何使用相应的API进行操作。



字符串(String)



设置值

// 语法
set key value [ex seconds] [px milliseconds] [nx|xx]
set命令有如下选项:
	- ex seconds:为键设置秒级过期时间 (同命令setex key seconds value)
	- px milliseconds:为键设置毫秒级过期时间
	- nx :键必须不存在才能设置成功,用于添加(同命令 setnx key value)
	- xx :键必须存在才能设置成功,用于更新
	
// 演示	
// 1.set
// 设置键为hello,值为redis的键值对 -> 返回OK设置成功
127.0.0.1:6379> set hello redis
OK

// 2.setex,设置过期时间10s
127.0.0.1:6379> setex hello 10 hello
OK
// ttl key 返回key过期剩余时间 
127.0.0.1:6379> ttl hello
(integer) 4
127.0.0.1:6379> ttl hello
(integer) 2
// ttl key的值为-2,表示key不存在
127.0.0.1:6379> ttl hello
(integer) -2

// 3.setnx,只有key不存在才能设置成功
// 先判断key为hello不存在
127.0.0.1:6379> exists hello
(integer) 0
// 使用setnx设置
127.0.0.1:6379> setnx hello redis
(integer) 1
// 再此使用setnx则返回0失败
127.0.0.1:6379> setnx hello redis
(integer) 0

// 4.set xx,只有key存在才能更新成功
// 先判断key=hello 不存在
127.0.0.1:6379> exists hello
(integer) 0
// 使用set xx 设置失败
127.0.0.1:6379> set hello redis xx
(nil)
// 设置key=hello,value-redis
127.0.0.1:6379> set hello reids
OK
// 使用set xx 设置成功
127.0.0.1:6379> set hello java xx
OK



获取值

// 语法
get key

// 演示
127.0.0.1:6379> get hello
"java"



批量设置值

// 语法
mset key value [key value ...]

// 演示
127.0.0.1:6379> mset a A b B c C d D
OK



批量获取值

// 语法
mget key [key ...]
// 演示
127.0.0.1:6379> mget a b c d
1) "A"
2) "B"
3) "C"
4) "D"
// 若部分key不存在,则返回nil
127.0.0.1:6379> mget a b c d e
1) "A"
2) "B"
3) "C"
4) "D"
5) (nil)

批量操作可以有效提高开发效率,减少网络IO时间.



计数

// 语法
incr key

// 演示
// 1.值不是整数-> 返回错误
127.0.0.1:6379> set hello redis
OK
127.0.0.1:6379> incr hello
(error) ERR value is not an integer or out of range
// 2.键不存在 -> 按照0自增,返回1
127.0.0.1:6379> exists num
(integer) 0
127.0.0.1:6379> incr num
(integer) 1
// 3.值是整数 -> 返回自增后的结果
127.0.0.1:6379> incr num
(integer) 2



哈希(Hash)



设置值

// 语法
hset key filed value
// 演示
127.0.0.1:6379> hset user_001 name ethan
(integer) 1



获取值

// 语法
hget key filed value
// 演示
127.0.0.1:6379> hget user_001 name
"ethan"
// 若key或field不存在->返回nil
127.0.0.1:6379> hget user_002 name
(nil)



删除field

// 语法
hdel key filed value
// 演示
// 返回删除的个数
127.0.0.1:6379> hdel user_001 name
(integer) 1
127.0.0.1:6379> hdel user_001 name
(integer) 0



批量设置/获取filed

// 语法
hmset key field value [field value ...]
hmget key field [field ...]
// 演示
127.0.0.1:6379> hmset user_007 age 27 name zs num 007
OK
127.0.0.1:6379> hmget user_007 age num name
1) "27"
2) "007"
3) "zs"



计算field个数

// 语法
hlen key

// 演示
127.0.0.1:6379> hlen user_007
(integer) 3



判断field是否存在

// 语法
hexists key filed

// 演示
127.0.0.1:6379> hexists user_007 name
(integer) 1
127.0.0.1:6379> hexists user_007 city
(integer) 0



获取所有field

// 语法
hkeys key
// 演示
127.0.0.1:6379> hkeys user_007
1) "age"
2) "name"
3) "num"



获取所有value

// 语法
hvals key
// 演示
127.0.0.1:6379> hvals user_007
1) "27"
2) "zs"
3) "007"



获取所有filed-value

// 语法
hgetall key
// 演示
127.0.0.1:6379> hgetall user_007
1) "age"
2) "27"
3) "name"
4) "zs"
5) "num"
6) "007"



计算value长度

// 语法
hstrlen key field
// 演示
127.0.0.1:6379> hstrlen user_007 name
(integer) 2



列表(list)



添加

// 语法
rpush key value [value ...]
// 演示
// 从右向左插入元素qwer
127.0.0.1:6379> rpush list q w e r
(integer) 4
// 从左向右插入元素qwer
127.0.0.1:6379> lpush list2 q w e r
(integer) 4
// 向某个元素前或后插入元素
linsert key before|after pivot value
linsert list after r t



查找

// 语法
lrange key start end
// 演示
// 获取指定范围内的元素列表,-1代表全部
127.0.0.1:6379> lrange list 0 -1
1) "q"
2) "w"
3) "e"
4) "r"

// 获取列表下标元素
lindex key index
127.0.0.1:6379> lindex list 1
"w"

// 获取列表长度
llen key
127.0.0.1:6379> llen list
(integer) 4



删除

// 语法
lpop key // 从左侧弹出元素 
rpop key // 从右侧弹出元素

// 演示
// 从左侧弹出元素 
127.0.0.1:6379> lpop list
"q"
127.0.0.1:6379> lrange list 0 -1
1) "w"
2) "e"
3) "r"
// 从右侧弹出元素
127.0.0.1:6379> rpop list 
"r"
127.0.0.1:6379> lrange list 0 -1
1) "w"
2) "e"
// 删除指定元素
lrem key count value 
- count > 0,从左到右删除最多count个元素
- count = 0,删除所有
- count < 0,从右到左删除最多|count|个元素
127.0.0.1:6379> lpush ccy cny cny usd usd bgn cny
(integer) 6
127.0.0.1:6379> lrange ccy 0 -1
1) "cny"
2) "bgn"
3) "usd"
4) "usd"
5) "cny"
6) "cny"
127.0.0.1:6379> lrem ccy 0 usd
(integer) 2
127.0.0.1:6379> lrange ccy 0 -1
1) "cny"
2) "bgn"
3) "cny"
4) "cny"

// 按照索引范围修剪
ltrim key start end
// 保留索引1和2的元素
127.0.0.1:6379> ltrim ccy 1 2
OK
127.0.0.1:6379> lrange ccy 0 -1
1) "bgn"
2) "cny"



修改

// 语法
lset key index newValue
// 演示
127.0.0.1:6379> lrange ccy 0 -1
1) "bgn"
2) "cny"
127.0.0.1:6379> lset ccy 0 cny
OK
127.0.0.1:6379> lrange ccy 0 -1
1) "cny"
2) "cny"
127.0.0.1



阻塞

// 语法
blpop key [key ...] timeout
brpop key [key ...] timeout
// 演示
// 1.列表为空
// 需要等待3秒返回
127.0.0.1:6379> brpop list 3
(nil)
(3.09s)
// 0表示一直等待,直到有元素入队
127.0.0.1:6379> brpop list 0
1) "list"
2) "q"
(109.45s)

// 2.列表不为空
// 0表示立即返回
127.0.0.1:6379> brpop list 0
1) "list"
2) "w"

// 注
1.多个key一起获取时,brpop会从左至右遍历,返回最先有元素的key及元素
2.多个客户端一起执行brpop,最先执行的返回弹出的值.



集合(set)



集合内操作

// 1.添加元素
sadd key element [element ...]
127.0.0.1:6379> sadd set q w e r
(integer) 4

// 2.删除元素
srem key element [element ...]
127.0.0.1:6379> srem set r
(integer) 1

// 3.计算元素个数
scard key
127.0.0.1:6379> scard set
(integer) 3

// 4.判断元素是否存在集合中
sismember key element
127.0.0.1:6379> sismember set q
(integer) 1

// 5.随机从集合返回指定个数元素
srandmember key [count]
// [count] 选填,默认1
127.0.0.1:6379> srandmember set 
"e"

// 6.从集合随机弹出元素
spop key
127.0.0.1:6379> spop set
"q"
// 注:srandmember弹出元素不删除,spop弹出会删除元素

// 7.获取所有元素
smembers kehy
127.0.0.1:6379> smembers set
1) "e"
2) "w"



集合间操作

// 准备数据
127.0.0.1:6379> sadd set1 Q W E R A B
(integer) 6
127.0.0.1:6379> sadd set2 A B C D W T
(integer) 6
// 1.求多个集合交集
sinter key [key ...]
127.0.0.1:6379> sinter set1 set2
1) "W"
2) "A"
3) "B"

// 2.求多个集合并集
sunion key [key ...]
127.0.0.1:6379> sunion set1 set2
1) "E"
2) "R"
3) "T"
4) "Q"
5) "B"
6) "A"
7) "C"
8) "D"
9) "W"

// 3.求多个集合差集
sdiff key [key ...]
127.0.0.1:6379> sdiff set1 set2
1) "E"
2) "R"
3) "Q"



有序集合(Zset)



集合内

// 1.添加成员
zadd key score member [score member]
zadd命令有如下选项:
	- nx :member必须不存在,才能设置成功
	- xx :member必须存在,才能设置成功
	- ch :返回此次操作后,有序集合元素和分数发生变化的个数
	- incr :对score做增加,相当于zincrby
127.0.0.1:6379> zadd zset 100 u1 98 u2 96 u3 93 u4
(integer) 4

// 2.计算成员个数
zcard key
127.0.0.1:6379> zcard zset
(integer) 4

// 3.计算某个成员分数
zscore key member
127.0.0.1:6379> zscore zset u3
"96"

// 4.计算成员排名
zrank key member
// zrank计算分数从低到高,0开始
127.0.0.1:6379> zrank zset u1
(integer) 3
// zrank计算分数从高到低
zrevrank key member
127.0.0.1:6379> zrevrank zset u1
(integer) 0

// 5.删除成员
zrem key member [member ...]
127.0.0.1:6379> zrem zset u3
(integer) 1

// 6.增加成员分数
zincrby key increment member
127.0.0.1:6379> zincrby zset 8 u1
"108"

// 7.返回指定排名范围的成员
zrange key start end [withscores]
zrevrange key start end [withscores]
127.0.0.1:6379> zrange zset 0 1 withscores
1) "u4"
2) "93"
3) "u2"
4) "98"

// 8.返回指定分数范围内的成员
zrangebyscore key min max [withscores] [limit offset count]
zrevrangebyscore key min max [withscores] [limit offset count]
127.0.0.1:6379> zrangebyscore zset 95 100 withscores
1) "u2"
2) "98"

// 9.返回指定分数范围内的元素个数
zcount key min max
127.0.0.1:6379> zcount zset 90 100
(integer) 2

// 10.删除指定排名内的生序元素
zremrangebyrank key start end
127.0.0.1:6379> zremrangebyrank zset 0 1
(integer) 2
// 11.删除分数范围的成员
zremrangebyscore key min max
127.0.0.1:6379> zremrangebyscore zset 100 110
(integer) 1



集合间操作

// 准备数据
127.0.0.1:6379> zadd zset1 10 u1 20 u2 30 u3 40 u4 50 u5
(integer) 5
127.0.0.1:6379> zadd zset2 15 u1 25 u2 35 u3 45 u4 55 u5
(integer) 5

// 1.交集
zinterstore destination numkeys key [key ...] [weights weight [weight ...]] [aggregate sum|min|max]
- destination:交集计算结果保存到这个key
- numkeys:需要做交集计算键的个数
- key [key ...]:需要交集的键
- weights weight [weight ...]:每个键的权重,每个键默认1
- aggregate sum|min|max:计算成员交集后,分值聚合运算

// 2.并集
zunionstore destination numkeys key [key ...] [weights weight [weight ...]] [aggregate sum|min|max]



总结

学习一门技术,不能纸上谈兵,所以一定要动手去实操,加深理解.

长路漫漫~

本文API指令参考《Redis 开发与运维》



版权声明:本文为2302_77659577原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。