String类型
set k1 aaa append k1 "bbb" getrange k1 0 -1 setrange k1 5(不能负数) ccc 替换,不够就补 object help object encoding k1 字符串是 embstr、raw、int incr k2 incrbyfloat k3 0.5 decr k2 msetnx k1 a k2 b nx没值才能设置成功 如果一个失败全部失败 原子性 mget k1 k2 strlen k1 setex k2 10 aa man ascii查看ascii码表
判断海量用户中某个用户是否在线呢
SETBIT 命令 SETBIT <key> <offset> <value> GETBIT 命令 GETBIT <key> <offset> 用户登录: SETBIT login_status 10086 1 查询用户是否登录: GETBIT login_status 10086 推出登录: SETBIT login_status 10086 0
统计编号 89757 的用户在 2021 年 5 月份的打卡情况要如何进行?
key 可以设计成 uid:sign:{userId}:{yyyyMM},月份的每一天的值 - 1 可以作为 offset(因为 offset 从 0 开始,所以 offset = 日期 - 1) 第一步,执行下面指令表示记录用户在 2021 年 5 月 16 号打卡: SETBIT uid:sign:89757:202105 15 1 第二步,判断编号 89757 用户在 2021 年 5 月 16 号是否打卡: GETBIT uid:sign:89757:202105 15 第三步,统计该用户在 5 月份的打卡次数,使用 BITCOUNT 指令。该指令用于统计给定的 bit 数组中,值 = 1 的 bit 位的数量: BITCOUNT uid:sign:89757:202105
统计这个月首次打卡时间
BITPOS uid:sign:89757:202105 1
统计多个bit数组同时存在的模型id
操作 key 模型id 是否存在的状态
setbit aa 1 1
setbit aa 6 1
setbit aa 7 1
setbit bb 1 1
setbit bb 6 1
bitop and andkey aa bb
bitcount andkey 结果:2
bitpos andkey 1 结果:1
setbit andkey 1 0
bitcount andkey 结果:1
bitpos andkey 1 结果:6
setbit andkey 6 0
bitcount andkey 结果:0
bitpos andkey 1 结果:-1
2^35 340亿bit = 4G内存
List类型
help @list 127.0.0.1:6379> lpush list1 a b c d e f (integer) 6 127.0.0.1:6379> lpop list1 "f" 127.0.0.1:6379> rpop list1 "a" 1.同向命令先进后出、类似栈。 2.反向命令先进先出、类似队列。 127.0.0.1:6379> lrange list1 0 -1 1) "c" 2) "1" 3) "2" 4) "3" 5) "4" 取出下标为2的元素 127.0.0.1:6379> lindex list1 2 "2" 取出最后一个元素 127.0.0.1:6379> lindex list1 -1 "4" 类似数组
List移除
127.0.0.1:6379> lpush k1 a 1 a 2 a 3 (integer) 6 127.0.0.1:6379> lrange k1 0 -1 1) "3" 2) "a" 3) "2" 4) "a" 5) "1" 6) "a" 127.0.0.1:6379> lrem k1 2 a (integer) 2 127.0.0.1:6379> lrange k1 0 -1 1) "3" 2) "2" 3) "1" 4) "a" 插入 127.0.0.1:6379> linsert k1 before 1 a (integer) 5 127.0.0.1:6379> lrange k1 0 -1 1) "3" 2) "2" 3) "a" 4) "1" 5) "a" 127.0.0.1:6379> linsert k1 after 1 b (integer) 6 127.0.0.1:6379> lrange k1 0 -1 1) "3" 2) "2" 3) "a" 4) "1" 5) "b" 6) "a"
List阻塞
阻塞队列、单播队列 blpop one 0 先阻塞先拿到 ltrim 删除两端的数据 ltrim key 0 -1 一个不删
Hash类型
当单个字符不使用hash时存储方式 set sean::age 18 set sean::hobby gril keys sean* hset sean age 18 hmset sean age 20 address games hget sean age hmget sean age address hkeys sean hvals sean hgetall sean hincrbyfloat xiaoming age 18.5 hget xiaoming age hincrbyfloat xiaoming age -1
Set类型
127.0.0.1:6379> sadd k1 xiaoke xiaowang xiaoming sean tom xiaoke (integer) 5 127.0.0.1:6379> smembers k1 1) "sean" 2) "xiaoming" 3) "xiaowang" 4) "tom" 5) "xiaoke" 去重xiaoke 删除 127.0.0.1:6379> srem k1 xiaoke xiaowang (integer) 2 127.0.0.1:6379> smembers k1 1) "tom" 2) "xiaoming" 3) "sean"
set集合操作
127.0.0.1:6379> sadd key1 1 2 3 4 (integer) 4 127.0.0.1:6379> sadd key2 3 4 5 6 (integer) 4 取交集 127.0.0.1:6379> sinter key1 key2 1) "3" 2) "4" 取并集 127.0.0.1:6379> sunion key1 key2 1) "1" 2) "2" 3) "3" 4) "4" 5) "5" 6) "6" 取差集 127.0.0.1:6379> sdiff key1 key2 1) "1" 2) "2" 127.0.0.1:6379> sdiff key2 key1 1) "5" 2) "6"
随机事件
srandmember key count 整数: 取出一个去重的结果集(不能超过已有集合) 负数:取出一个带重复的结果集,一定满足你需要的数量 0: 不返回 案例:抽奖 127.0.0.1:6379> sadd name tom xiaoke xiaowang sean jerry (integer) 5 127.0.0.1:6379> srandmember name 4 1) "xiaowang" 2) "tom" 3) "xiaoke" 4) "jerry" 127.0.0.1:6379> srandmember name -4 1) "xiaowang" 2) "tom" 3) "tom" 4) "tom" 127.0.0.1:6379> srandmember name 10 1) "tom" 2) "xiaoke" 3) "sean" 4) "xiaowang" 5) "jerry" 127.0.0.1:6379> srandmember name -10 1) "tom" 2) "sean" 3) "xiaoke" 4) "sean" 5) "tom" 6) "jerry" 7) "xiaowang" 8) "sean" 9) "jerry" 10) "jerry" 从奖品堆中删除 spop key count 127.0.0.1:6379> smembers name 1) "tom" 2) "xiaowang" 3) "sean" 4) "xiaoke" 127.0.0.1:6379> spop name 2 1) "xiaowang" 2) "tom" 127.0.0.1:6379> smembers name 1) "sean" 2) "xiaoke"
Sorted_set有序集合
127.0.0.1:6379> zadd k1 8 apple 2 banana 3 orange (integer) 3 查看所有水果 127.0.0.1:6379> zrange k1 0 -1 1) "banana" 2) "orange" 3) "apple" 查看所有水果带上价格 127.0.0.1:6379> zrange k1 0 -1 withscores 1) "banana" 2) "2" 3) "orange" 4) "3" 5) "apple" 6) "8" 查看所有水果价格在3到8之间 127.0.0.1:6379> zrangebyscore k1 3 8 1) "orange" 2) "apple" 价格由低到高前两名水果 127.0.0.1:6379> zrange k1 0 1 1) "banana" 2) "orange" 价格由高到低前两名水果 127.0.0.1:6379> zrevrange k1 0 1 1) "apple" 2) "orange" 127.0.0.1:6379> zrange k1 -2 -1 1) "orange" 2) "apple" 取出苹果的分数 127.0.0.1:6379> zscore k1 apple "8" 取出苹果的排名 127.0.0.1:6379> zrank k1 apple (integer) 2
集合操作
127.0.0.1:6379> zadd k1 80 tom 60 sean 70 baby (integer) 3 127.0.0.1:6379> zadd k2 60 tom 100 sean 40 jack (integer) 3 取交集(相加) 127.0.0.1:6379> zunionstore unkey 2 k1 k2 (integer) 4 127.0.0.1:6379> zrange unkey 0 -1 withscores 1) "jack" 2) "40" 3) "baby" 4) "70" 5) "tom" 6) "140" 7) "sean" 8) "160" 取交集权重 127.0.0.1:6379> zunionstore unkey1 2 k1 k2 weights 1 0.5 (integer) 4 127.0.0.1:6379> zrange unkey1 0 -1 withscores 1) "jack" 2) "20" 3) "baby" 4) "70" 5) "sean" 6) "110" 7) "tom" 8) "110" 取交集最大 127.0.0.1:6379> zunionstore unkey2 2 k1 k2 aggregate max (integer) 4 127.0.0.1:6379> zrange unkey2 0 -1 withscores 1) "jack" 2) "40" 3) "baby" 4) "70" 5) "tom" 6) "80" 7) "sean" 8) "100" 排序是怎么实现的,增删改查的速度? 跳跃表,平均值(增删改查)最优