目 录CONTENT

文章目录

Redis 全局命令和五种类型

Sakura
2023-08-05 / 0 评论 / 1 点赞 / 53 阅读 / 18539 字 / 正在检测是否收录...

一: 全局命令

Redis 命令不区分大小写 , 而 key 是区分大小写的

1. 查看所有 key

不建议在生产环境上使用

-- 查看所有ke
KEYS *

-- 查看以s开头的key
KEYS s*

因为底层是模糊匹配机制 , 效率低 , 会阻塞所有请求

在生产环境中可以使用dbsize 查看所有键数量 , 这是 Redis 内置的计数器

-- 查看所有key的数量
dbsize 

3. 检查 key 是否存在

EXIST name

4. 删除 key

-- 删除一个key
del name

-- 删除多个key
del name1 name2

5. 设置 key 过期

  • EXPIRE 给一个KEY设置有效期 ( )

-- 给name设置10秒有效期
EXPIRE name 10
  • PEXPIRE 给一个KEY设置有效期 ( 毫秒 )

-- 给name设置100毫秒有效期
PEXPIRE name 100
  • EXPIREAT给一个 key 设置有效期 ( 时间戳 )

-- 给name设置今天晚上10点过期
EXPIREAT name [时间戳]

细节 :

  • 对一个存在有效期的 key 执行 set key value 会将其改为永久有效

6. 查看 key 剩余 有效期

  • 当一个 key 有效期为 -2 时 , 这个 key 已经过期

  • 当一个 key 有效期为 -1 时 , 这个 key 永久有效

-- 精确到秒
TTL name

-- pttk精确到毫秒
PTTL name

7. key 的数据类型

-- 查看key name的数据类型
TYPE Name

8. 修改 key 名

rename name name1

如果重新命名的 key 存在 , 则会被覆盖

Redis命令的相关手册:

1. https://www.redis.net.cn/order/](https://www.redis.net.cn/order/)

2. hthttp://doc.redisfans.com/text-in)

二: Key 的层级格式

Redis的key允许有多个单词形成层级结构,多个单词之间用':'隔开,格式如下:

例如项目名叫 System , 有 user 和 Agent 两种类型 :

  • user 相关的key : system:user:1

  • prodect 相关的 key : system:agent:1

三: 字符串 String

1. 基本命令

  1. set设置值 , get获取值

# 1.set设置
set key value [option]

# 2.get获取
# 如果要获取的件不存在 , 则返回nil
get key

# 3.mset批量设置
mset key1 v1 key2 v2

# 4.mget批量获取
mget key1 key2
  • ex seconds : 为键设置秒级过期时间等同于 setex key seconds value

  • px milliseconds : 为键设置毫秒级过期时间

  • exat timestamp : 设置以秒为单位的 UNIX 时间戳所对应的时间为过期时间

  • nx : 键必须不存在,才可以设置成功,用于添加(分布式锁常用等同于setnx

  • xx : 键必须存在,才可以设置成功

  • keepttl : 保存设定前指定键的生存时间

  • get : 返回指定键原本的值 , 若键不存在时返回 nil

  • setrange / getrange : 在字符串的第几个位置设置值 / 截取某个范围的字符串 setrange name 8 x getrange name 8 9

单次 get time : n次网络 , n次命令时间

批量 get time : 1次网络 , n次命令时间

# 1.设置10秒过期
set user Sakura ex 10

# 2.当键不存在是在可以设置成功
set user LF nx # 设置失败,因为键已经存在
set name xx # 设置成功,因为键不存在

# 3.keepttl
set age 22 ex 60
set age 23 keepttl # 会续接原来的时间

# 4.设置并返回原来的值
set age 22
set age 30 get # 会返回原来的值 

根据官方文档的描述 , 未来版本中 setex psetex setnx 等命令可能会被淘汰

因为有风险 , 无法同时完成 setexsetnx 这两个操作 , redis 6 可以用set key value nx ex 100 可以同时完成分布式锁和设置时间

  1. getset设置值并返回原来的值

getset name value

因为 value 发生了覆盖 , 所以会返回原来的值

  1. 自增自减

-- 自增
incr age

-- 指定步长自增
incr age 4

-- 自减
decr age

-- 指定步长自减
decr age 3

-- 浮点自增并指定步长
incrbyfloat  score 0.8
  1. append追加

-- 在key的value后面追加value
append key value
  1. strlen字符串长度

strlen name

2. 使用场景

四: 哈希 Hash

1. 基本命令

  1. hset设置 , hget 获取

# 1.hset 设置值
hset user name Sakura
hset user age 15

# 2.hmset 批量设置
hmet user name Sakura age 15

# 3.hget 获取值
hget user name
hget user age

# 4.hmget 批量获取
hmget user name age
  1. hdel删除 field

hdel user age
hdel user name
  1. hlen计算 field 个数 , hstrlen计算 value 字符串长度

hlen user  //2
  1. 获取 field 与 value

-- 1.获取所有field
hkeys user

-- 2.获取所有value
hvals user

-- 3.获取所有field与value
hgetall user

2. 使用场景

  • 使用String类型

set user:1:name lijin;

set user:1:age 18;

set user:2:name msb;

set user:2:age 20;

优点:简单直观,每个键对应一个值

缺点:键数过多,占用内存多,用户信息过于分散,不用于生产环境

  • 将对象序列化存入redis

set user:1 serialize(userInfo);

优点:编程简单,若使用序列化合理内存使用率高

缺点:序列化与反序列化有一定开销,更新属性时需要把userInfo全取出来进行反序列化,更新后再序列化到redis

  • 使用hash类型

hmset user:1 name lijin age 18

hmset user:2 name msb age 20

优点:简单直观,使用合理可减少内存空间消耗

缺点:要控制内部编码格式,不恰当的格式会消耗更多内存

五: 列表 list

1. 基本命令

  1. push插入

# 1.lpush 向左插入
lpush namelist Sakura LF 


# 2.rpush 向右插入
lpush namelist Java Go 
  1. pop弹出

# 1.lpop 从列表左侧弹出
lpop namelist

# 2.rpop 从列表右侧弹出
rpop namelist
  1. lrange 获取指定范围内的元素列表

# 获取name
lrange namelist 0 2

lrange list 0 -1 获取所有元素

  1. linsert在某个元素前或后插入新元素

# 1.在某个元素之后插入新元素
linset list after element newelement

# 2.在某个元素之后插入新元素
linset list before element newelement
  1. lrem对指定元素进行删除

-- 1.删除list列表中两个Sakura
-- lrem  key conunt element 
lrem list 2 Sakura

count>0,从左到右 , 删除最多count个元素。

count<0,从右到左 , 删除最多count绝对值个元素。

count=0,删除所有。

  1. ltrim按照索引范围修剪列表

-- 1.保留 0 - 2三个元素其他删除
ltrim list 0 2
  1. lset 修改执行索引下标的元素

-- 1.list列表中下标位5的元素改为Sakura
lset list 5 Sakurad
  1. llen 获取列表长度

-- 1.获取list列表长度
llen list
  1. lindex 获取指定索引下标的元素

# 1. 获取list表中,下标为3的元素
lindex list 3
  1. rpop lpush 源列表 目的列表

# 弹出源列表右边的一个元素,加入到目的列表左边
rpoplpush list1 list2

2. 阻塞式弹出元素

blpopbrpoplpoprpop的阻塞版本 , 支持设置阻塞时间 , 如果时间为0 , 就一直阻塞下去

-- 1.如果list中没有元素就一直阻塞下去
blpop list 0

-- 2.阻塞5秒
blopo lsit 5

可以实现简单的消息队列( 先进先出 ) 和栈 ( 先进后出 )

六: 集合Set

集合( set)类型也是用来保存多个的字符串元素,但和列表类型不一样的是 :

  • 集合中不允许有重复元素

  • 集合中的元素是无序的

  • 不能通过索引下标获取元素

1. 基本命令

  1. sadd添加元素

-- 1.会返回添加了几个没有重复的数据
sadd newset a b c d a b c d  //返回4
  1. smembers获取所有元素

smembers newset
  1. srem删除元素

  -- 删除元素a b
srem newset a b
  1. sismember判断元素是否集合中

在集合返回 1

不在集合返回 0

-- 判断a是否在结合a中
sismember newset a
  1. srandmember随机从集合返回指定个数

-- 随机返回一个value
srandmemmber 
  1. spop 随机弹出元素

spop newset
  1. scard计算元素个数

scard newset

2. 交 , 并 , 差集操作

  1. sinter多个集合的交集

sadd set1 1 2 3 4
sadd set2 2 3 6 7
-- 求set1和set2之间的交集
sinter set1 set2 //返回 2 3 无序
  1. suion多个集合的并集

sadd set1 1 2 3 4
sadd set2 2 3 4 7
-- 求set1和set2的并集
suion set1 set2 //返回1 2 3 4 7
  1. sdiff多个集合的差集

sadd set1 1 2 3 4
sadd set2 2 3 4 7
-- 求set1和set2的并集
sdiff set1 set2 //返回 1
sdiff set1 set2 //返回 7
  1. 将交集 , 并集 , 差集 ,的结果保存

-- sinterstore 要存的set名 set1 set2
sinterstore newset set1 set2
suionstore destination key [key ...]
sdiffstore destination key [key ...]

七: 有序集合 ZSET

1. 基本命令

  1. zadd添加元素

zadd key [NX|XX] [GT|LT] [CH] [INCR] score member [score member ..

-- 添加元素
zadd zset 100 Sakura
zadd zset 51 LF
zass zset 87 2B
  1. zscore查看某个成员的分数

zscore zset Sakura
  1. zrank计算成员排名

-- 1.zrank 从0开始,并且从小到大
zrank zset Sakura 

-- 2.zrevrank , 从大到小
zrerank zset LF
  1. zrem删除元素

-- 1.根据指定成员
zrem zset Sakura

-- 2.删除指定分数范围的成员
zremrangebyscore key min max

-- 3.按升序删除指定排名内的元素
zremrangebyrank key start end
  1. zincrby增加成员分数

-- 1.给zset中的Sakura加10分
zincrby zset 10 Sakrua
  1. zrange根据范围查询

-- 1. zrange 显示所有排名(0 -1)
zrange zset 0 -1 --从小到大
--查看分数
zrange zset 0 1 withscores --也展示分数

-- 2. zrevrange 根据排名反向查询
zrevrange zset 0 1 --从大到小 
zrevrange zset 0 1 withscores

-- 3.根据分数查询
-- 查询 96 到100分数的key
zrangebyscore zset 96 100

-- 4.根据分数反向查询
-- 查询无穷小 到无穷大
zrangebyscore zset -inf +inf withscores
  1. zcount返回指定分数范围成员个数

-- 返回分数在80 100的成员个数
zcount zset 80 100

2. 交 , 并 , 差集操作

  1. zinterstore交集

zinterstore destination numkeys key [key ...] [WEIGHTS weight [weight ...]] [AGGREGATE SUM|MIN|

--destination : 交集计算结果保存到这个键
--numkeys : 需要做交集计算键的个数
--key [key ...] : 需要做交集计算的键
--weights weight [weight ...]: 每个键的权重,在做交集计算时,每个键中的每个member 会将自己分数乘以这个权重,每个键的权重默认是1
--aggregate sum | min | max : 计算成员交集后,分值可以按照sum(和)、min(最小值)、max(最大值)做汇总,默认值是sum
  • 算平均分案例

-- 1.首先创建两个zset
zadd English 87 Sakura 96 LF
zadd Math 100 Sakura 98 LF

-- 2.
zinterstore avg 2 English Math weights 0.5 0.5 
  1. zunionstore并集

zunionstore

3. 场景

有序集合比较典型的使用场景就是排行榜系统。例如视频网站需要对用户上传的视频做排行榜,榜单的维度可能是多个方面的:按照时间、按照播放数量、按照获得的赞数。

1

评论区