Redis基本数据类型和使用场景

一、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 的任意一个执行 LPUSHRPUSH 命令为止。

一旦有新的数据出现在其中一个列表里,那么这个命令会解除阻塞状态,并且返回 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
微博关注模型
  1. 张三关注的人:
    zhangsanSet-> {wangwu, zhaoliu}
  2. 李四关注的人:
    lisiSet–> {zhangsan, wangwu, zhaoliu, xiaoqi}
  3. 王五关注的人:
    wangwuSet-> {zhangsan, lisi, zhaoliu, xiaoqi, laoba)
    4)张三和李四共同关注:
    SINTER zhangsanSet lisiSet–> {wangwu, zhaoliu}
  4. 我关注的人也关注他(李四):
    SISMEMBER wangwuSet lisi
    SISMEMBER zhaoliuSet lisi
  5. 张三可能认识的人:
    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
-k1=keep alive 0=reconnect1
-rSET/GET/INCR 使用随机 key, SADD 使用随机值
-P通过管道传输 请求1
-q强制退出 redis。仅显示 query/sec 值
–csv以 CSV 格式输出
-l生成循环,永久执行测试
-t仅运行以逗号分隔的测试命令列表。
-IIdle 模式。仅打开 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个。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值