Redis的基本操作
应用help查问有哪些命令
help @string # 查问string类型命令help @hash # 查问hash命令help @list # 查问list命令help @set # 查问set命令help @zset # 查问zset命令help @cluster # 查问集群命令help @generic # 查问通用命令......等等其余命令,能够应用Table键提醒
示例所有Key名都为bigkang为示例
# 查问所有Keykeys * # 判断某个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,没有则创立bigkangset <key> <value>set bigkang 123# 追加,给bigkang追加456append <key> <value>append bigkang 456# 查问Key长度,这个key的长度也就是lengthstrlen <key>strlen bigkang# 设置值,如果不存在则设置一个值,如果存在则设置失败setnx <key> <value>setnx bigkang 123# 给Key值减少1,相似于i++操作,如果是字符串将无返回,必须为数据,返回值为批改后的Valueincr <key>incr bigkang# 给Key值缩小1,相似于i--操作,如果是字符串将无返回,必须为数据,返回值为批改后的Valuedecr <key>dect bigkang# 指定Key增加或者缩小肯定的数量,给bigkang这个key的Value增加100,而后再缩小100,返回值为批改后的Valueincrby / decrby <key> <步长>incrby bigkang 100decrby 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为 21hset <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,Falsehexists <key> <field>hexists bigkang name# 列出某个key的所有fieldhkeys <key>hkeys bigkang# 列出某个key的所有Valuehvals <key>hvals bigkang# 为哈希表 key 中的域 field 的值加上增量 incrementhincrby <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.9linsert bigkang AFTER 1 0.9# 在bigkang这个key的值为1的前面插入1.1linsert 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,没有返回0sismember <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 5sunion <key1> <key2>sunion bigkang bigkang2# 返回两个汇合的差集元素,例如bigkang为 1 2 3,bigkang2 为 3 4 5 ,则返回1 2 4 5sdiff <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 和 1zrange <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属于第二个字节,那么咱们当初来测试一下吧
# 删除原来的Keydel bitstr# 新增一个bit位0的值为1setbit bitstr 0 1# 查看长度因为存入了第一个char,那么长度为1strlen bitstr# 再设置bit位为7的数据setbit bitstr 7 1# 查看长度因为存入了第一个char,那么长度还是为1strlen 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 - 7bitcount bitstr 0 0# 返回后果为2# 示意统计char[0] - char[1],bit位 0 - 15bitcount bitstr 0 1# 返回后果为3
函数(BitOp)
Bit次要用来帮忙咱们对不同Bit进行操作,和Set中的并集,并归等相似。
当初咱们来初始化两个bit数据
# 初始化第一个bit,设置 0 和 4setbit bit1 0 1setbit bit1 4 1# 初始化第二个bit,设置 3 和 4setbit bit2 3 1setbit 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,而后将后果返回到newbitbitop 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,而后将后果返回到newbitbitop 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操作,而后将后果返回到newbitbitop 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操作,而后将后果返回到newbitbitop 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 1setbit login-2020-12-1 20 1setbit login-2020-12-1 21 1setbit login-2020-12-1 22 1# 2号有两个用户登录setbit login-2020-12-2 19 1setbit 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