一: 全局命令
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. 基本命令
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
: 返回指定键原本的值 , 若键不存在时返回 nilsetrange / 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
等命令可能会被淘汰因为有风险 , 无法同时完成
setex
和setnx
这两个操作 , redis 6 可以用set key value nx ex 100
可以同时完成分布式锁和设置时间
getset
设置值并返回原来的值
getset name value
因为 value 发生了覆盖 , 所以会返回原来的值
自增自减
-- 自增
incr age
-- 指定步长自增
incr age 4
-- 自减
decr age
-- 指定步长自减
decr age 3
-- 浮点自增并指定步长
incrbyfloat score 0.8
append
追加
-- 在key的value后面追加value
append key value
strlen
字符串长度
strlen name
2. 使用场景
四: 哈希 Hash
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
hdel
删除 field
hdel user age
hdel user name
hlen
计算 field 个数 ,hstrlen
计算 value 字符串长度
hlen user //2
获取 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. 基本命令
push
插入
# 1.lpush 向左插入
lpush namelist Sakura LF
# 2.rpush 向右插入
lpush namelist Java Go
pop
弹出
# 1.lpop 从列表左侧弹出
lpop namelist
# 2.rpop 从列表右侧弹出
rpop namelist
lrange
获取指定范围内的元素列表
# 获取name
lrange namelist 0 2
lrange list 0 -1
获取所有元素
linsert
在某个元素前或后插入新元素
# 1.在某个元素之后插入新元素
linset list after element newelement
# 2.在某个元素之后插入新元素
linset list before element newelement
lrem
对指定元素进行删除
-- 1.删除list列表中两个Sakura
-- lrem key conunt element
lrem list 2 Sakura
count>0,从左到右 , 删除最多count个元素。
count<0,从右到左 , 删除最多count绝对值个元素。
count=0,删除所有。
ltrim
按照索引范围修剪列表
-- 1.保留 0 - 2三个元素其他删除
ltrim list 0 2
lset
修改执行索引下标的元素
-- 1.list列表中下标位5的元素改为Sakura
lset list 5 Sakurad
llen
获取列表长度
-- 1.获取list列表长度
llen list
lindex
获取指定索引下标的元素
# 1. 获取list表中,下标为3的元素
lindex list 3
rpop lpush 源列表 目的列表
# 弹出源列表右边的一个元素,加入到目的列表左边
rpoplpush list1 list2
2. 阻塞式弹出元素
blpop
和brpop
是lpop
和rpop
的阻塞版本 , 支持设置阻塞时间 , 如果时间为0 , 就一直阻塞下去
-- 1.如果list中没有元素就一直阻塞下去
blpop list 0
-- 2.阻塞5秒
blopo lsit 5
可以实现简单的消息队列( 先进先出 ) 和栈 ( 先进后出 )
六: 集合Set
集合( set)类型也是用来保存多个的字符串元素,但和列表类型不一样的是 :
集合中不允许有重复元素
集合中的元素是无序的
不能通过索引下标获取元素
1. 基本命令
sadd
添加元素
-- 1.会返回添加了几个没有重复的数据
sadd newset a b c d a b c d //返回4
smembers
获取所有元素
smembers newset
srem
删除元素
-- 删除元素a b
srem newset a b
sismember
判断元素是否集合中
在集合返回 1
不在集合返回 0
-- 判断a是否在结合a中
sismember newset a
srandmember
随机从集合返回指定个数
-- 随机返回一个value
srandmemmber
spop
随机弹出元素
spop newset
scard
计算元素个数
scard newset
2. 交 , 并 , 差集操作
sinter
多个集合的交集
sadd set1 1 2 3 4
sadd set2 2 3 6 7
-- 求set1和set2之间的交集
sinter set1 set2 //返回 2 3 无序
suion
多个集合的并集
sadd set1 1 2 3 4
sadd set2 2 3 4 7
-- 求set1和set2的并集
suion set1 set2 //返回1 2 3 4 7
sdiff
多个集合的差集
sadd set1 1 2 3 4
sadd set2 2 3 4 7
-- 求set1和set2的并集
sdiff set1 set2 //返回 1
sdiff set1 set2 //返回 7
将交集 , 并集 , 差集 ,的结果保存
-- sinterstore 要存的set名 set1 set2
sinterstore newset set1 set2
suionstore destination key [key ...]
sdiffstore destination key [key ...]
七: 有序集合 ZSET
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
zscore
查看某个成员的分数
zscore zset Sakura
zrank
计算成员排名
-- 1.zrank 从0开始,并且从小到大
zrank zset Sakura
-- 2.zrevrank , 从大到小
zrerank zset LF
zrem
删除元素
-- 1.根据指定成员
zrem zset Sakura
-- 2.删除指定分数范围的成员
zremrangebyscore key min max
-- 3.按升序删除指定排名内的元素
zremrangebyrank key start end
zincrby
增加成员分数
-- 1.给zset中的Sakura加10分
zincrby zset 10 Sakrua
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
zcount
返回指定分数范围成员个数
-- 返回分数在80 100的成员个数
zcount zset 80 100
2. 交 , 并 , 差集操作
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
zunionstore
并集
zunionstore
3. 场景
有序集合比较典型的使用场景就是排行榜系统。例如视频网站需要对用户上传的视频做排行榜,榜单的维度可能是多个方面的:按照时间、按照播放数量、按照获得的赞数。
评论区