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
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。