共计 7004 个字符,预计需要花费 18 分钟才能阅读完成。
Redis 的基本操作
应用 help 查问有哪些命令
help @string # 查问 string 类型命令
help @hash # 查问 hash 命令
help @list # 查问 list 命令
help @set # 查问 set 命令
help @zset # 查问 zset 命令
help @cluster # 查问集群命令
help @generic # 查问通用命令
...... 等等其余命令,能够应用 Table 键提醒
示例所有 Key 名都为 bigkang 为示例
# 查问所有 Key
keys *
# 判断某个 Key 是否存在
exists <key>
exists bigkang
# 查问某个 Key 的类型
type <key>
type bigkang
# 删除某个 Key,返回一条影响行数,1 示意 true,删除胜利
del <key>
del bigkang
# 给 Key 设置超时工夫,单位秒,返回一示意 true,设置胜利
expire <key> <seconds>
expire bigkang 30
# 查问 Key 过期工夫,返回秒数负数为超时工夫,,- 1 示意永不过期,- 2 示意已过期
ttl <key>
ttl bigkang
# 查看以后数据库的 key 的数量(单个库)dbsize
# 清空以后库
Flushdb
# 清空所有库
Flushall
字符串(String)的操作
help @string # 查问 string 类型命令
# 查问 Key 对应键值
get <key>
get bigkang
# 设置值,增加键值对,给 bigkang 赋值为 123,没有则创立 bigkang
set <key> <value>
set bigkang 123
# 追加,给 bigkang 追加 456
append <key> <value>
append bigkang 456
# 查问 Key 长度,这个 key 的长度也就是 length
strlen <key>
strlen bigkang
# 设置值,如果不存在则设置一个值,如果存在则设置失败
setnx <key> <value>
setnx bigkang 123
# 给 Key 值减少 1,相似于 i ++ 操作,如果是字符串将无返回,必须为数据, 返回值为批改后的 Value
incr <key>
incr bigkang
# 给 Key 值缩小 1,相似于 i -- 操作,如果是字符串将无返回,必须为数据, 返回值为批改后的 Value
decr <key>
dect bigkang
# 指定 Key 增加或者缩小肯定的数量,给 bigkang 这个 key 的 Value 增加 100,而后再缩小 100, 返回值为批改后的 Value
incrby / decrby <key> < 步长 >
incrby bigkang 100
decrby bigkang 100
# 批量设置键值对
mset <key1> <value1> <key2> <value2>
mset bigkang1 1 bigkang2 2 bigkang3 3
# 同时设置一个或多个 key-value 对, 如果不存在则设置, 如果其中一个条件不满足则都失败
msetnx <key1> <value1> <key2> <value2>
msetnx bigkang4 1 bigkang5 2 bigkang6 3
# 截取范畴,取得值的范畴,相似 java 中的 substring, 起始下标为 0,只返回到结尾,超出失常返回
getrange <key> < 起始地位 > < 完结地位 >
getrange bigkang 0 10
# 插入值,从指定地位插入字符串, 返回字符串长度
setrange <key> < 起始地位 > <value>
setrange bigkang 0 big
# 设置键值的同时,设置过期工夫,单位秒
setex <key> < 过期工夫 > <value>
# 获取以前的值写入新的值
getset <key> <value>
getset bigkang 123
哈希(Hash)的操作
help @hash # 查问 hash 类型命令
# 设置 Hash 值,Hash 相似以 Java 中的 Map,Hash 的 Key 存在返回 0,不存在返回 1,如果是 String 则报错,设置 name 为 bigkang,age 为 21
hset <key> <field> <value>
hset bigkang name bigkang age 21
# 从 Hash 中取出某个属性的 Value 值
hget <key> <field>
hget bigkang name
# 批量设置 Hash 的值
hmset <key> <field1> <value1> <field2> <value2>
hmset bigkang name bigkang1 age 2000
# 批量获取值
hmset <key> <field1> <field2>
hmget bigkang name age
# 判断 field 是否存在,返回 0 OR 1,对应 True,False
hexists <key> <field>
hexists bigkang name
# 列出某个 key 的所有 field
hkeys <key>
hkeys bigkang
# 列出某个 key 的所有 Value
hvals <key>
hvals bigkang
# 为哈希表 key 中的域 field 的值加上增量 increment
hincrby <key> <field> <increment>
hincrby bigkang age 1
# 将哈希表 key 中的域 field 的值设置为 value,不存在时进行设置,存在不设置
hsetnx <key> <field> <value>
hsetnx bigkang name bigkang
字符串链表(list)的操作
help @list # 查问 list 类型命令
# 从右边 / 左边插入一个或多个值
lpush/rpush <key> <value1> <value2> <value3>
# 右边插入
lpush bigkang 1 2 3
# 左边插入
rpush bigkang 4 5 6
# 从右边 / 左边吐出一个值
lpop/rpop key
# 从右边吐出
lpop bigkang
# 从左边吐出
rpop bigkang
# 从一个列表左边吐出一个值,插到另一个列表右边
rpoplpush <key1> <key2>
rpoplpush bigkang bigkang1
# 依照索引下标取得元素(从左到右), 索引从 0 开始
lindex <key> <index>
lindex bigkang 2
# 依照起始地位完结地位范畴取得元素(从左到右), 索引从 0 开始
lrange <key> <start> <stop>
lrang bigkang 0 3
# 取得列表长度
llen <key>
llen bigkang
# 依据 Key 找到某个值,并且在他后面 / 前面插入一个值
linsert <key> AFTER/BEFORE <value> <newvalue>
# 在 bigkang 这个 key 的值为 1 的后面插入 0.9
linsert bigkang AFTER 1 0.9
# 在 bigkang 这个 key 的值为 1 的前面插入 1.1
linsert bigkang BEFORE 1 1.1
# 从依据某个 Key,找到 Value, 删除这个 Value 几个个数
lrem <key> <n> <value>
# 在 bigkang 中,从右边开始查问,删除 1 这个元素,删除两个(可能元素 List 中有多个 1)lrem bigkang 2 1
字符串汇合(set)的操作
help @set # 查问 set 类型命令
# 将一个或多个 member 元素退出到汇合 key 当中,曾经存在于汇合的 member 元素将被疏忽, 插入胜利返回 1,插入失败示意 0 曾经存在
sadd <key> <value1> <value2> .....
sadd bigkang 1 2 3
# 取出该汇合的所有值
smembers <key>
smembers bigkang
# 返回该汇合的元素个数
scard <key>
scard bigkang
# 判断汇合 <key> 是否为含有该 <value> 值,有返回 1,没有返回 0
sismember <key> <value>
sismember bigkang 1
# 删除汇合中的某个元素
srem <key> <value1> <value2> ....
srem bigkang 1 2 3
# 随机从该汇合中吐出一个值, 会将原来的值删除
spop <key>
spop bigkang
# 随机从该汇合中取出 n 个值。不会从汇合中删除
srandmember <key> <n>
srandmember bigkang 3
# 返回两个汇合的交加元素, 如 bigkang 有 1,bigkang2 也有 1,则返回 1,所有雷同的都会返回
sinter <key1> <key2>
sinter bigkang bigkang2
# 返回两个汇合的并集元素,例如 bigkang 为 1 2 3,bigkang2 为 3 4 5,则返回 1 2 3 4 5
sunion <key1> <key2>
sunion bigkang bigkang2
# 返回两个汇合的差集元素,例如 bigkang 为 1 2 3,bigkang2 为 3 4 5,则返回 1 2 4 5
sdiff <key1> <key2>
sdiff bigkang bigkang2
有序字符串汇合(zset)的操作
help @sorted_set # 查问 zset 类型命令
# 将一个或多个 member 元素及其 score 值退出到有序集 key 当中,zset 会依据 score 排序
zadd <key> <score1> <value1> <score2> <value2>...
zadd bigkang 1 A 2 B 3 C
# 返回有序集 key 中,下标在 <start> <stop> 之间的元素, 带 WITHSCORES,能够让分数一起和值返回到后果集, 索引从 0 开始,0 1 会蕴含 0 和 1
zrange <key> <start> <stop> [WITHSCORES]
# 带分数返回 0 到 2 三个值,并且返回分数,从小到大
zrange bigkang 0 2 WITHSCORES
# 不返回分数
zrange bigkang 0 2
# 同上,程序相同,从大到小
zrevrange bigkang 0 2
# - 1 示意返回所有
zrevrange bigkang 0 -1
# 返回有序集 key 中,分数在 min 到 max 中的值(蕴含),有序集成员按 score 值递增 (从小到大) 秩序排列
zrangebyscore key min max [withscores][limit offset count]
zrangebyscore bigkang 1 2.5 WITHSCORES
# 同上,改为从大到小排列,max min 相同
zrevrangebyscore key max min [withscores][limit offset count]
zrevrangebyscore bigkang 2.5 1 WITHSCORES
# 为元素的 score 加上增量
zincrby <key> <increment> <value>
zincrby bigkang 3 A
# 删除该汇合下,指定值的元素
zrem <key> <value>
zrem bigkang A
# 统计该汇合,分数区间内的元素个数
zcount <key> <min> <max>
zcount bigkang 1 20
# 返回该值在汇合中的排名,从 0 开始, 返回索引下标,从小到大
zrank <key> <value>
zrank bigkang B
Bit 操作
设置(Bit)
首先咱们须要理解什么是 Bit,其实所有的 Bit 操作都是在操作字符串类型,咱们设置了 bit 当前能够发现他的类型其实是一个 String
# 设置 Bit 语法 setbit ${Key 名称} ${Bit 位} ${Bit 位的值 只能是 0 或者 1}
setbit newbit 1 1
而后咱们来获取这个 bit 的类型
# 获取 Key 的类型
type newbit
# 咱们发现返回了
"string"
那么咱们就会发现其实存储的数据是一个字符串,那么字符串和 bit 有什么关系呢,咱们晓得 Redis 中的字符串底层采纳的 SDS,实际上它存储的一个 char 数组,那么这个 char 数组,那么 C 语言中一个 char 等于 1 个 byte,一个 byte 等于 8 个 bit,咱们能够晓得一个 char 可能存储 8 个 bit,那么 Redis 的 String 可能存储 512MB,那么咱们再来看一下最大可能存储多少个 bit 位:
最大存储数量
512 1024 1024 * 8 = 42 9496 7296(大概 43 亿)
MB KB Byte BIit
咱们就可能存储大概 43 亿 bit,每个 bit 的值只能是 0 或者 1
咱们上访的操作 setbit newbit 1 1 就是将 bit 位为 1,也就是第二个 bit 设置为 1,bit 为数组
大略的流程图如下:
这样咱们就能够晓得 bit 位在 0 – 7 的属于第一个字节,8 – 15 属于第二个字节,那么咱们当初来测试一下吧
# 删除原来的 Key
del bitstr
# 新增一个 bit 位 0 的值为 1
setbit bitstr 0 1
# 查看长度因为存入了第一个 char,那么长度为 1
strlen bitstr
# 再设置 bit 位为 7 的数据
setbit bitstr 7 1
# 查看长度因为存入了第一个 char,那么长度还是为 1
strlen bitstr
# 咱们这次设置的话咱们设置一下 8,那么这个时候长度就会变成 2 了
setbit bitstr 8 1
# 查看长度因为存入了第二个 char,那么长度就会扩容为 2 了
strlen bitstr
例如咱们想要获取某个 bit 位的值,咱们应用 getbit
# 获取第一个 bit 位的数据
getbit bitstr 0
统计(BitCount)
BitCount 能够统计咱们的 Bit 数组中的值为 1 的数据,例如我想要统计 bit 位的值的后果有多少。(!留神是依据一个 char,也就是一个 byte=8bit 进行统计,每个值示意相应的 8 个 bit)
如下
# 统计整个字节数组数据 Bit 位为 1 的数量
bitcount bitstr
或者依据范畴进行统计
# 留神此范畴不是统计 bit 范畴,而是统计 char 中的 bit,一个 char = 8bit
# 示意统计第一个 char 也就是 0 - 8 到 0 - 8,那么就是 1 到 1,第一个 char,对应 bit 位 0 - 7
# 示意统计 char[0] - char[0],bit 位 0 - 7
bitcount bitstr 0 0
# 返回后果为 2
# 示意统计 char[0] - char[1],bit 位 0 - 15
bitcount bitstr 0 1
# 返回后果为 3
函数(BitOp)
Bit 次要用来帮忙咱们对不同 Bit 进行操作,和 Set 中的并集,并归等相似。
当初咱们来初始化两个 bit 数据
# 初始化第一个 bit,设置 0 和 4
setbit bit1 0 1
setbit bit1 4 1
# 初始化第二个 bit,设置 3 和 4
setbit bit2 3 1
setbit bit2 4 1
目前两个 Bit 中的构造如下
#Bit 位 0 1 2 3 4 5 6 7
bit1 1 0 0 0 1 0 0 0
bit2 0 0 0 1 1 0 0 0
那么咱们晓得既然是二进制,那么必定是有运算的,例如与,或等等
Redis 提供了如下几种
- AND
- OR
- NOT
- XOR
语法如下:
bitop ${操作} ${新的 Key}。。。。(其余 bit 位)# 返回后果为新的 Bit 的字节位数量,例如 bit 1 -20,那么对应 char[0] - char[2], 返回的数据为字符串长度,也就是 strlen
AND
# 应用 AND,将 bit1 bit2 进行 AND,而后将后果返回到 newbit
bitop and newbit bit1 bit2
# and 的操作如下
#Bit 位 0 1 2 3 4 5 6 7
bit1 1 0 0 0 1 0 0 0
bit2 0 0 0 1 1 0 0 0
newbit 0 0 0 0 1 0 0 0
# 与操作,必须 1 与 1 = 1,否则都为 0
# 返回后果只有 bit 位为 4 的为 1,所以应用 bit 统计进去则为 1
OR
# 应用 OR,将 bit1 bit2 进行 OR,而后将后果返回到 newbit
bitop or newbit bit1 bit2
# or 的操作如下
#Bit 位 0 1 2 3 4 5 6 7
bit1 1 0 0 0 1 0 0 0
bit2 0 0 0 1 1 0 0 0
newbit 1 0 0 1 1 0 0 0
# 或操作,能够 1 或 0 , 0 或 1,只有有一个 1,则返回 1
# 返回后果有 bit 位为 0,3,4 的为 1,所以应用 bit 统计进去则为 3
NOT
# 应用 NOT,将 bit1 进行 NOT 操作,而后将后果返回到 newbit
bitop not newbit bit1
# NOT 的操作如下
#Bit 位 0 1 2 3 4 5 6 7
bit1 1 0 0 0 1 0 0 0
newbit 0 1 1 1 0 1 1 1
# 取反操作,0 变成 1,1 变成 0
# 统计返回后果则为 6
XOR
# 应用 XOR,将 bit1,bit2 进行 XOR 操作,而后将后果返回到 newbit
bitop xor newbit bit1 bit2
# NOT 的操作如下
#Bit 位 0 1 2 3 4 5 6 7
bit1 1 0 0 0 1 0 0 0
bit2 0 0 0 1 1 0 0 0
newbit 1 0 0 1 0 0 0 0
# XOR 操作 必须蕴含 0 和 1
# 统计返回后果则为 6
Bit 操作能够帮忙咱们存储大量的数据,以及状态,咱们能够在多个场景下应用, 例如用户的间断登录,以及沉闷用户统计。
例如如下操作,咱们的 Key 采纳 login- 年 - 月 - 日,bit 位 应用用户 ID,状态为 1
# 咱们设置用户登录,1 号有 4 个用户登录
setbit login-2020-12-1 19 1
setbit login-2020-12-1 20 1
setbit login-2020-12-1 21 1
setbit login-2020-12-1 22 1
# 2 号有两个用户登录
setbit login-2020-12-2 19 1
setbit login-2020-12-2 21 1
# 性能操作
# 统计出最近两天登录过的用户
bitop or login-2020-12{1-2} login-2020-12-1 login-2020-12-2
# 统计最近的间断登录两天的用户
bitop and login-2020-12{1-2} login-2020-12-1 login-2020-12-2