一、String
SET key value //存入字符串键值对
MSET key value [key value …] //批量存储字符串键值对
SETNX key value //存入一个不存在的字符串键值对
GET key //获取一个字符串键值
MGET key [key …] //批量获取字符串键值
DEL key [key …] //删除一个键
EXPIRE key seconds //设置一个键的过期时间(秒)
INCR key //将key中储存的数字值加1
DECR key //将key中储存的数字值减1
INCRBY key increment //将key所储存的值加上increment
DECRBY key decrement //将key所储存的值减去decrement
1.set
设置键值对,不设置超时时间默认永久不过期
#set key value,设置成功返回OK,重复设置也会返回OK
set tqz 666
设置过期的键值对,单位为秒
# 设置成功返回OK
set product:10001 100 ex 20 nx
2.expire
# 设置成功返回1,否则返回0
expire tqz 10
3.get
get tqz
4.del
del tqz
5.mset/mget批量存取
一般是把对象转json字符串再存储,例如
# value就是对象转json的字符串
set user:1 value
也可以使用mset命令批量设置该对象的多个属性
# 设置成功返回OK
mset user:1:name tqz user:1:balance 888
批量获取
mget user:1:name user:1:balance
在redis中是这样显示的,这种针对某个对象的某一个字段修改比较合适
6.setnx
将 key 的值设为 value,当且仅当 key 不存在。 若给定的 key 已经存在,则 SETNX 不做任何动作。 SETNX 是SET if Not eXists的简写。
分布式锁的场景可以使用该命令。
# 返回1表示设置成功,返回0表示设置失败,有其他线程设置过或者自身已经设置过了,也就是表示抢锁失败
setnx product:10001 true
#执行完业务后删除该数据,删除成功返回1,删除失败或不存在返回0
del product:10001
7.incr
文章浏览量可以使用incr命令去实现,每执行一次默认会自增1
# 返回自增之后的值
127.0.0.1:6379> incr article:10001
(integer) 1
127.0.0.1:6379> incr article:10001
(integer) 2
127.0.0.1:6379>
指定增加步长
incrby article:10001 10
8.decr
默认每次减1
# 返回减成功之后的值
decr article:10001
指定减少步长
decrby article:10001 5
9.setex
# 将值 value 关联到 key ,并将 key 的过期时间设为 seconds (以秒为单位)。设置成功返回OK
setex person 10 1
10.psetex
# 这个命令和 SETEX 命令相似,但它以毫秒为单位设置 key 的生存时间,而不是像 SETEX 命令那样,以秒为单位。
# 设置成功返回OK
psetex person 10000 tqz
11.strlen
# 返回 key 所储存的字符串值的长度。
strlen user:1:balance
12.setrange
用 value 参数覆写给定 key 所储存的字符串值,从偏移量 offset 开始。
# 返回写成功之后的字符串长度
setrange tqz 1 abc
13.getrange
# 返回 key 中字符串值的子字符
# 例如user:1:name对应的value是tqz,这里返回qz
getrange user:1:name 1 2
14.append
# 如果 key 已经存在并且是一个字符串, APPEND 命令将指定的 value 追加到该 key 原来值(value)的末尾。
# 如果key不存在就会直接设置,返回value的长度。
# 例如user:1:name对应的value是tqz,这里返回6,也就是追加之后的字符串的长度。
append user:1:name 888
应用场景
存储用户token
验证码
二、Hash
HSET key field value //存储一个哈希表key的键值
HSETNX key field value //存储一个不存在的哈希表key的键值
HMSET key field value [field value …] //在一个哈希表key中存储多个键值对
HGET key field //获取哈希表key对应的field键值
HMGET key field [field …] //批量获取哈希表key中多个field键值
HDEL key field [field …] //删除哈希表key中的field键值
HLEN key //返回哈希表key中field的数量
HGETALL key //返回哈希表key中所有的键值
HINCRBY key field increment //为哈希表key中field键的值加上增量increment
1.hmset
在一个哈希表key中存储多个键值对
# hmset key field value field value
# 设置成功返回OK
hmset person:1 id 1 name tqz age 20
2.hmget
批量获取哈希表key中多个field键值
hmget person:1 id
#或者获取多个
hmget person:1 id name age
3.hset
存储一个哈希表一个key的键值
# hset key field value
# 设置成功返回1,失败返回0,已存在也会返回0
hset person:1 id 1
4.hget
获取哈希表key对应的field键值
hget person:1 id
5.hlen
返回哈希表key中field的数量
hlen user
6.hgetall
返回哈希表key中所有的键值
hgetall user
7.hsetnx
存储一个不存在的哈希表key的键值
# 存储成功返回1,已存在或失败返回0
hsetnx user id 1
8.hdel
删除
hdel person:1 name
# 或者删除多个
hdel person:1 name age
9.hincrby
返回增长后的值
hincrby person:1 id 5
10.hkeys
获取哈希表中的所有字段
hkeys user
11.hvals
获取哈希表中所有值
hvals user
hash类型的过期策略只能用在外层的key上,不能用在里面的field上面。
应用场景
电商购物车
1)以固定前缀加用户id为key
2)商品id为field
3)商品数量为value
购物车操作
添加商品 hset cart:1001 10088 1
增加数量 hincrby cart:1001 10088 1
商品总数 hlen cart:1001
删除商品 hdel cart:1001 10088
获取购物车所有商品 hgetall cart:1001
缓存用户比较多的字段,但后续改动字段属性少
三、List
数据结构
- 栈:LPUSH+LPOP=FILO(先进后出)
- 队列:LPUSH+RPOP=FIFO(先进先出)
- 阻塞队列:LPUSH+BRPOP=MQ(先进先出,没有元素阻塞队列或者等待超时)
1.lpush
往左边添加元素
# 往左边添加一个元素
lpush list a
# 往左边添加多个元素
lpush list a b c
2.rpush
往右边添加元素
# 往右边添加一个元素
rpush list b
# 往右边添加多个元素
rpush list a b c
3.lpop
从左边去一个元素
lpop list
4.rpop
从右边取一个元素
rpop list
5.lrange
返回列表指定区间的元素
# 按照索引来算,取索引为0的元素,到索引为2的元素
lrange list 0 2
6.blpop
移出并获取列表最左边的第一个元素, 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。
BLPOP 是阻塞式列表的弹出原语。 它是命令 LPOP 的阻塞版本,这是因为当给定列表内没有任何元素可供弹出的时候, 连接将被 BLPOP 命令阻塞。 当给定多个 key 参数时,按参数 key 的先后顺序依次检查各个列表,弹出第一个非空列表的最左边元素。
当 BLPOP 被调用时,如果给定 key 内至少有一个非空列表,那么弹出遇到的第一个非空列表的最左边元素,并和被弹出元素所属的列表的名字 key 一起,组成结果返回给调用者。
当存在多个给定 key 时, BLPOP 按给定 key 参数排列的先后顺序,依次检查各个列表。
如果所有给定 key 都不存在或包含空列表,那么 BLPOP 命令将阻塞连接, 直到有另一个客户端对给定的这些 key 的任意一个执行 LPUSH 或 RPUSH 命令为止。
一旦有新的数据出现在其中一个列表里,那么这个命令会解除阻塞状态,并且返回 key 和弹出的元素值。
当 BLPOP 命令引起客户端阻塞并且设置了一个非零的超时参数 timeout 的时候, 若经过了指定的 timeout 仍没有出现一个针对某一特定 key 的 push 操作,则客户端会解除阻塞状态并且返回一个 nil 的多组合值(multi-bulk value)。
timeout 参数表示的是一个指定阻塞的最大秒数的整型值。 当 timeout 为 0 是表示阻塞时间无限制。
# 没有数据就阻塞,直到超时
blpop list 5
# 指定多个key,返回第一个有数据的key和value,如果都没有数据,就一直阻塞,直到超时
blpop list list2 list3 5
# 超时时间设置0表示永不过期,不能设置-1,会报错
blpop list3 0
7.brpop
移出并获取列表的最右边元素, 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。
# 没有数据就阻塞,直到超时
brpop list 5
# 指定多个key,返回第一个有数据的key和value,如果都没有数据,就一直阻塞,直到超时
brpop list list2 list3 5
# 超时时间设置0表示永不过期,不能设置-1,会报错
brpop list3 0
8.lindex
通过索引获取列表中的元素
lindex list 2
9.llenkey
获取列表长度
llen list
10.linsert
在列表的元素前或者后插入元素
# 在key为list的列表中,往元素为b的左边位置插入一个a
linsert list before b a
# 在key为list的列表中,往元素为b的右边位置插入一个c
linsert list after b c
11.lpushx
将一个值插入到已存在的列表最左边,如果该key对应的列表不存在,插入失败返回0,插入成功列表中所有元素的个数
lpushx list4 1
12.rpushx
将一个值插入到已存在的列表最右边,如果该key对应的列表不存在,插入失败返回0,插入成功列表中所有元素的个数
lpushx list4 1
13.lset
通过索引设置列表元素的值,设置成功返回OK
lset list 0 abc
14.lrem
删除列表中指定个数、指定的元素,返回删除成功的个数,没有指定元素返回0
lrem list 2 a
15.brpoplpush
从列表中弹出一个值,将弹出的元素插入到另外一个列表中并返回它; 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。返回被添加的元素。注意:原先列表的值会被移除。
# BRPOPLPUSH source destination timeout
brpoplpush list list4 3
16.rpoplpush
移除列表的最后一个元素,并将该元素添加到另一个列表并返回。注意:原先列表的值会被移除。
# RPOPLPUSH source destination
rpoplpush list list4
应用场景
微博消息和微信公号消息
张三关注了李四,王五
1)李四发微博,消息id为10018
LPUSH msg:张三id 10018
2)王五发微博,消息id为10086
LPUSH msg:张三id 10086
3)查看最新微博消息
LRANGE msg:张三id 0 4
四、Set
set类型是无序的。集合成员是唯一的,这就意味着集合中不能出现重复的数据。
1.sadd
添加一个或多个元素。添加成功返回被添加的个数,添加失败或已存在返回0。
sadd act:1001 1
# 添加多个
sadd act:1001 2 3 4
2.smembers
smembers act:1001
3.srandmember
随机获取count个元素。注意:获取完之后并不会被删除。抽奖可以使用该数据结构。
# SRANDMEMBER key [count]
srandmember act:1001 3
4.spop
随机获取count个元素。注意:获取完之后会被删除。抽一等奖、二等奖、三等奖可以使用该数据结构。每次抽完之后从集合删除。
# 不传count默认获取一个并删除
smembers act:1001
# 传count获取指定个数并删除
spop act:1001 2
5.scard
# 获取元素个数
scard act:1001
6.sdiff
返回第一个集合与其他集合之间的差异。注意:只会返回第一个集合在第二个集合中不存在的元素,也就是只看第一个集合在其他集合不存在的元素。
sdiff act:1001 act:1002
7.sinter
返回给定所有集合的交集。微信公众号好友共同关注的人可以使用该数据结构。
sinter act:1001 act:1002
# 也可以支持比较多个key是否有相同的元素,前提是多个key必须都要有相同的元素,有一个key的元素在其他key中没有就会返回空
sinter act:1001 act:1002 act:1003
8.sismember
判断 member 元素是否是集合 key 的成员。存在返回1,不存在返回0。
sismember act:1001 a
9.smove
将 member 元素从 source 集合移动到 destination 集合。移动成功返回1,移动失败或者移动source集合中不存在的元素返回0。
smove act:1001 act:1002 a
10.sunion
返回所有给定集合的并集。也就是返回两个集合所有的数据,会自动去重复的。
sunion act:1001 act:1002
# 可以支持多个集合
sunion act:1001 act:1002 act:1003
11.sdiffstore
返回给定所有集合的差集并存储在 destination 中。
其中,destination 表示差集运算的结果集合;key 表示原始集合的名称,可以指定多个。返回不存在的
# 1.先添加三个集合的元素
sadd act:1004 a b c
sadd act:1005 c d e
sadd act:1006 b e f
# SDIFFSTORE destination key [key …]
sdiffstore diffset act:1004 act:1005 act:1006
# 查看diffset集合中的元素只有a,也就是act:1004的元素在其他集合中不存在的元素
127.0.0.1:6379> smembers diffset
1) "a"
127.0.0.1:6379>
12.sinterstore
返回给定所有集合的交集并存储在 destination 中。指定多个的时候,多个集合中都没有共同元素返回0,有共同元素返回共同元素的个数。
sinterstore interset act:1004 act:1005 act:1006
# 往act:1004的key中再添加一个元素e,使三个key中都有元素e
sadd act:1004 e
# 比较共同的并存入interset集合中
sinterstore interset act:1004 act:1005 act:1006
# 查看interset集合,发现有元素e
127.0.0.1:6379> smembers interset
1) "e"
127.0.0.1:6379>
13.sunionstore
所有给定集合的并集存储在 destination 集合中。会自动去重。
sunionstore unionset act:1004 act:1005 act:1006
# 查看unionset集合中元素
127.0.0.1:6379> smembers unionset
1) "d"
2) "f"
3) "c"
4) "a"
5) "b"
6) "e"
127.0.0.1:6379>
14.srem
移除集合中一个或多个成员。可以用sadd点赞,srem取消点赞。
srem act:1006 g
# 删除多个
srem act:1006 f e
应用场景
点赞、收藏
- 点赞:sadd like:消息id 用户id
- 取消点赞:srem like:消息id 用户id
- 检查用户是否点过赞:sismember like:消息id 用户id
- 获取点赞的用户列表:smembers like:消息id
- 获取点赞用户数:scard like:消息id
微博关注模型
- 张三关注的人:
zhangsanSet-> {wangwu, zhaoliu} - 李四关注的人:
lisiSet–> {zhangsan, wangwu, zhaoliu, xiaoqi} - 王五关注的人:
wangwuSet-> {zhangsan, lisi, zhaoliu, xiaoqi, laoba)
4)张三和李四共同关注:
SINTER zhangsanSet lisiSet–> {wangwu, zhaoliu} - 我关注的人也关注他(李四):
SISMEMBER wangwuSet lisi
SISMEMBER zhaoliuSet lisi - 张三可能认识的人:
SDIFF lisiSet zhangsanSet->(zhangsan, xiaoqi}
五、ZSet
zset相比set是有序的,但是需要给vlaue一个score,redis底层使用score去排序。
1.zadd
向有序集合添加一个或多个成员,或者更新已存在成员的分数
zadd hotNews:20230710 7 gaowen
2.zcard
获取有序集合的成员个数
zcard hotNews:20230710
3.zcount
计算在有序集合中指定区间分数的成员个数
zcount hotNews:20230710 5 7
4.zincrby
每次给vlaue加指定的score
# 每次加1,并返回增加之后的值
zincrby hotNews:20230710 1 gaowen
# 可指定增长的步长
zincrby hotNews:20230710 5 gaowen
# 在执行一次,让其变成11,下面有用
ZINCRBY hotNews:20230710 5 gaowen
# 存完之后,默认按照score升序排列在redis中的
5.zrevrange
倒序排
zincrby hotNews:20230710 3 diwen
zincrby hotNews:20230710 7 xiayu
# 仅显示value字段,取第1条到第10条的数据,倒序拍
127.0.0.1:6379> zrevrange hotNews:20230710 0 9
1) "gaowen"
2) "xiayu"
3) "diwen"
# 带上score字段,根据score倒序排
127.0.0.1:6379> zrevrange hotNews:20230710 0 9 withscores
1) "gaowen"
2) "10"
3) "xiayu"
4) "7"
5) "diwen"
6) "3"
6.zunionstore
整理多个key的并集,然后合并到另外一个key中
127.0.0.1:6379> zincrby hotNews:20230710 6 xiaoyu
"6"
127.0.0.1:6379> zincrby hotNews:20230711 3 11hao
"3"
127.0.0.1:6379> zincrby hotNews:20230712 2 12hao
"2"
127.0.0.1:6379> zincrby hotNews:20230713 5 13hao
"5"
# 合并在一起
127.0.0.1:6379> zunionstore hotNews:20230711-20230713 3 hotNews:20230711 hotNews:20230712 hotNews:20230713
(integer) 3
# 此时可以在使用zrevrange再进行排序,一般使用再近7日排行统计数据使用
127.0.0.1:6379> zrevrange hotNews:20230711-20230713 0 6 withscores
1) "13hao"
2) "5"
3) "11hao"
4) "3"
5) "12hao"
6) "2"
7.zscore
返回有序集中,成员的分数值
zscore hotNews:20230710 gaowen
8.zrank
返回有序集合中指定成员的索引
# 返回升序之后的索引
zrank hotNews:20230710 diwen
9.zrevrank
返回有序集合中指定成员的排名,有序集成员按分数值递减(从大到小)排序
# 返回降序之后的索引
zrevrank hotNews:20230710 xiayu
10.zrem
移除有序集合中一个或多个成员
# 返回被删除的个数
zrem hotNews:20230710 gaowen diwen
11.zremrangebylex
移除有序集合中给定的字典区间的所有成员
# ZREMRANGEBYLEX key min max
# min:字典中排序位置较小的成员,必须以”[“开头,或者以”(“开头,可使用”-“代替
# max:字典中排序位置较大的成员,必须以”[“开头,或者以”(“开头,可使用”+”代替
zremrangebylex hotNews:20230710 [a [b
12.zremrangebyrank
移除有序集合中给定的排名区间的所有成员
zremrangebyrank hotNews:20230710 1 2
13.zremrangebyscore
移除有序集合中给定的分数区间的所有成员
# 相等的min或者max也会删除,也就是5和11的score也会被删除
zremrangebyscore hotNews:20230710 5 11
六、benchmark压测工具
redis提供了一个压测命令,可以执行不同的命令去看每个命令的并发量。
redis-benchmark [参数] [参数值]
参数列表:
参数 – | 描述 | 默认值 |
---|---|---|
-h | 指定服务器主机名 | 127.0.0.1 |
-p | 指定服务器端口 | 6379 |
-s | 指定服务器socket | |
-c | 指定并发连接数 | 50 |
-n | 指定请求数 | 10000 |
-d | 以字节的形式指定 SET/GET 值的数据大小 | 2 |
-k | 1=keep alive 0=reconnect | 1 |
-r | SET/GET/INCR 使用随机 key, SADD 使用随机值 | |
-P | 通过管道传输 请求 | 1 |
-q | 强制退出 redis。仅显示 query/sec 值 | |
–csv | 以 CSV 格式输出 | |
-l | 生成循环,永久执行测试 | |
-t | 仅运行以逗号分隔的测试命令列表。 | |
-I | Idle 模式。仅打开 N 个 idle 连接并等待。 |
-t:表示执行以逗号分隔的命令,执行的是set操作和get操作,如果不指定具体的值,测试的结果较多
执行结果如下:
====== SET ======
100000 requests completed in 1.31 seconds
50 parallel clients
3 bytes payload
keep alive: 1
98.64% <= 1 milliseconds
99.85% <= 2 milliseconds
99.99% <= 3 milliseconds
100.00% <= 3 milliseconds
76335.88 requests per second
====== GET ======
100000 requests completed in 1.26 seconds
50 parallel clients
3 bytes payload
keep alive: 1
99.27% <= 1 milliseconds
100.00% <= 1 milliseconds
79365.08 requests per second
反馈结果:
SET部分和GET部分,只需要关注最后一句输出即可,以GET为例,上述输出:79365.08 requests per second,表示每秒的GET命令处理79365.08个请求,也就是QPS为7.9W个。