String
redis |
---|
字符串 |
数值 |
bitmap位图 |
help @string
String 字符串常用命令
命令 | 作用 |
---|---|
set | 设置value |
get | 获取value |
append | 追加 |
setrange | 可以把一个字符串覆盖到原有的某一个部分 |
getrange | 截取key对应value的某一部分 |
strlen | 查看字符串长度 |
getset | 取回老的值,设置新的值 |
127.0.0.1:6379> set k1 hello
OK
127.0.0.1:6379> get k1
"hello"
127.0.0.1:6379> append k1 " world"
(integer) 11
127.0.0.1:6379> get k1
"hello world"
127.0.0.1:6379> getrange k1 6 10
"world"
127.0.0.1:6379> getrange k1 6 -1
"world"
127.0.0.1:6379> setrange k1 6 mashibing
(integer) 15
127.0.0.1:6379> get k1
"hello mashibing"
127.0.0.1:6379> strlen k1
(integer) 15
127.0.0.1:6379> type k1
string
redis正反向索引,正向索引0,1,2,反向索引,-1,-2,-3
NX
127.0.0.1:6380> set k1 hello
OK
127.0.0.1:6380> get k1
"hello"
127.0.0.1:6380> set k1 ooxx nx ## nx不存在的时候设置
(nil)
127.0.0.1:6380> get k1
"hello"
127.0.0.1:6380>
nx不存在的时候设置
应用场景,比如分布式锁的时候,一堆人都想通过redis删除一个文件,谁去删呢,一堆人拿很多链接对一个单线程的redis发起set k1 nx ,那么谁成功了,谁就拿到锁了,剩下的人都失败了。
XX
127.0.0.1:6380> set k2 hello xx
(nil)
127.0.0.1:6380> get k2
(nil)
127.0.0.1:6380>
xx,只有存在的时候才可以操作,他只能跟新
[nx] 只能新建
[xx] 只能更新
mset,mget,设置多条,取出多条
127.0.0.1:6380> mset k3 a k4 b
OK
127.0.0.1:6380> mget k3 k4
1) "a"
2) "b"
127.0.0.1:6380>
getset取出老的值,设置新的值,减少一次IO通信
127.0.0.1:6379> getset k1 mashibing
"99.5"
127.0.0.1:6379>
msetnx 设置多个值,只有都成功了,所有的才会成功
127.0.0.1:6379> msetnx k1 a k2 b
(integer) 1
127.0.0.1:6379> mget k1 k2
1) "a"
2) "b"
127.0.0.1:6379> msetnx k2 c k3 d
(integer) 0
127.0.0.1:6379> mget k1 k2
1) "a"
2) "b"
127.0.0.1:6379>
String 底层存储的是byte字节流,数据不会被破坏,所以redis是二进制安全的
127.0.0.1:6379> set k3 a
OK
127.0.0.1:6379> strlen k3
(integer) 1
127.0.0.1:6379> append k3 中
(integer) 4
127.0.0.1:6379> strlen k3
(integer) 4
127.0.0.1:6379> get k3
"a\xe4\xb8\xad"
127.0.0.1:6379>
bitmap字节
一个字节8位 ====》 00000000
正序为12345678
127.0.0.1:6379> setbit k1 1 1
(integer) 0
127.0.0.1:6379> strlen k1
(integer) 1
127.0.0.1:6379> get k1
"@"
127.0.0.1:6379> setbit k1 7 1
(integer) 0
127.0.0.1:6379> strlen k1
(integer) 1
127.0.0.1:6379> get k1
"A"
127.0.0.1:6379> setbit k1 9 1
(integer) 0
127.0.0.1:6379> strlen k1
(integer) 2
127.0.0.1:6379> get k1
"A@"
这波操作,
第一步setbit k1 1 1 00000000==》01000000
第二步setbit k1 7 1 01000000==》 01000001
验证:
man ascii
ASCII(7) Linux Programmer's Manual ASCII(7)
NAME
ascii - ASCII character set encoded in octal, decimal, and hexadecimal
DESCRIPTION
ASCII is the American Standard Code for Information Interchange. It is a 7-bit code.
Many 8-bit codes (e.g., ISO 8859-1) contain ASCII as their lower half. The international
counterpart of ASCII is known as ISO 646-IRV.
The following table contains the 128 ASCII characters.
C program '\X' escapes are noted.
Oct Dec Hex Char Oct Dec Hex Char
────────────────────────────────────────────────────────────────────────
000 0 00 NUL '\0' (null character) 100 64 40 @
001 1 01 SOH (start of heading) 101 65 41 A
002 2 02 STX (start of text) 102 66 42 B
003 3 03 ETX (end of text) 103 67 43 C
004 4 04 EOT (end of transmission) 104 68 44 D
005 5 05 ENQ (enquiry) 105 69 45 E
006 6 06 ACK (acknowledge) 106 70 46 F
007 7 07 BEL '\a' (bell) 107 71 47 G
010 8 08 BS '\b' (backspace) 110 72 48 H
011 9 09 HT '\t' (horizontal tab) 111 73 49 I
012 10 0A LF '\n' (new line) 112 74 4A J
013 11 0B VT '\v' (vertical tab) 113 75 4B K
Hex 40 @
40十六进制前4位是0100,后四位是0000
Hex 41 @
41十六进制前4位是0100,后四位是0001
十进制65是A
扩展:
字符集 ascii其他一般叫做扩展字符集扩展:
其他字符集不在对ascii重编码
0xxxxxxx你自己写一个程序,
字节流读取,
每字节判断
命令 | 作用 |
---|---|
bitpos | 作用寻找第一个二进制位的位置 |
bitcount | 统计1出现了几次 |
bitop or destkey k1 k2 | k1和k2进行或运算,值为destkey |
bitop and destkey k1 k2 | k1和k2进行与运算,值为destkey |
0 1
k1 01000001 01000000
127.0.0.1:6379> bitpos k1 1 0 0
(integer) 1
127.0.0.1:6379> bitpos k1 1 1 1
(integer) 9
127.0.0.1:6379> bitcount k1 0 1
(integer) 3
127.0.0.1:6379>
位图应用场景
1,有用户系统,统计用户登录天数,且窗口随机
setbit sean 1 1
setbit sean 7 1
setbit sean 364 1
STRLEN sean
BITCOUNT sean -2 -1
01 02 03 04
sean 0 1 0 1 010101
json 0 1 0 1 011111
每用户46B * 用户数 10000000 =460 000 000
2,京东就是你们的,618做活动:送礼物
大库备货多少礼物
假设京东有2E用户
僵尸用户冷热用户/忠诚用户活跃用户统计!
随即窗口
比如说 1号~3号
连续登录要 去重
setbit 20190101 1 1
setbit 20190102 1 1
setbit 20190102 7 1
bitop or destkey 20190101 20190102
BITCOUNT destkey 0 -1