1

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

诗人总诉梦
1 声望2 粉丝