一、String
场景
session共享、kv缓存、数值计算计数器、fs文件系统(小文件 磁盘IO)、内存
案例
1、字符串
127.0.0.1:6379> set k1 aaa
OK
127.0.0.1:6379> get k1
"aaa"
127.0.0.1:6379> keys *
1) "k1"
127.0.0.1:6379> exit
[root@localhost src]# nc localhost 6379
keys *
*1
$2
k1
^C
[root@localhost src]# exec 9<> /dev/tcp/localhost/6379
[root@localhost src]# echo "keys * " >& 9
[root@localhost src]# cat <& 9
*1
$2
k1
^C
[root@localhost src]#
追加字符串
127.0.0.1:6379> set k1 abc
OK
127.0.0.1:6379> get k1
"abc"
127.0.0.1:6379> append k1 ef
(integer) 5
127.0.0.1:6379> get k1
"abcef"
127.0.0.1:6379>
2、数值
自增自减
127.0.0.1:6379> set k1 10
OK
127.0.0.1:6379> get k1
"10"
127.0.0.1:6379> incr k1
(integer) 11
127.0.0.1:6379> get k1
"11"
127.0.0.1:6379> decr k1
(integer) 10
127.0.0.1:6379> get k1
"10"
127.0.0.1:6379>
3、setbit
场景一
统计用户每天是否登陆。
案例一
用户tom 第4、7、365天登陆了用户,分别在对应位置存1。统计一年总共登陆几天。每个用户仅占用46个字节。
127.0.0.1:6379> setbit tom 3 1
(integer) 0
127.0.0.1:6379> setbit tom 6 1
(integer) 0
127.0.0.1:6379> setbit tom 364 1
(integer) 0
127.0.0.1:6379> bitcount tom
(integer) 3
127.0.0.1:6379> strlen tom
(integer) 46
127.0.0.1:6379>
场景二
存放二值化的图片信息。
setbit k1 1 1 表示保存一个k1,第1个位置上为1。
0000 0000 > 0100 0000
setbit k1 7 1 表示保存一个k1,第7个位置上为1。
0100 0000 > 0100 0001
127.0.0.1:6379> setbit k1 1 1
(integer) 0
127.0.0.1:6379> get k1
"@"
127.0.0.1:6379> setbit k1 7 1
(integer) 0
127.0.0.1:6379> get k1
"A"
按位与、按位或
127.0.0.1:6379> setbit k1 1 1
(integer) 0
127.0.0.1:6379> setbit k1 7 1
(integer) 0
127.0.0.1:6379> get k1
"A"
127.0.0.1:6379> setbit k2 1 1
(integer) 0
127.0.0.1:6379> setbit k2 6 1
(integer) 0
127.0.0.1:6379> get k2
"B"
127.0.0.1:6379> bitop and andkey k1 k2
(integer) 1
127.0.0.1:6379> get andkey
"@"
127.0.0.1:6379> bitop or orkey k1 k2
(integer) 1
127.0.0.1:6379> get orkey
"C"
127.0.0.1:6379>
二、List
场景
评论列表、消息队列、替代 java 容器
让jvm无状态(jvm挂掉后,数据不会丢失。两台服务器可以进行数据共享。)
案例
同向 lpush lpop 栈
异向 lpush rpop 队列
index() 数组
127.0.0.1:6379> lpush k1 a b c d e
(integer) 5
127.0.0.1:6379> LRANGE k1 0 -1
1) "e"
2) "d"
3) "c"
4) "b"
5) "a"
127.0.0.1:6379> rpush k1 x y z
(integer) 8
127.0.0.1:6379> LRANGE k1 0 -1
1) "e"
2) "d"
3) "c"
4) "b"
5) "a"
6) "x"
7) "y"
8) "z"
127.0.0.1:6379> lpop k1
"e"
127.0.0.1:6379> rpop k1
"z"
127.0.0.1:6379> LRANGE k1 0 -1
1) "d"
2) "c"
3) "b"
4) "a"
5) "x"
6) "y"
127.0.0.1:6379> LINDEX k1 2
"b"
127.0.0.1:6379>
清除
LTRIM 清除两端的数据(优化redis内存量)
127.0.0.1:6379> LRANGE k1 0 -1
1) "d"
2) "c"
3) "b"
4) "a"
5) "x"
6) "y"
127.0.0.1:6379> LTRIM k1 0 -1
OK
127.0.0.1:6379> LRANGE k1 0 -1
1) "d"
2) "c"
3) "b"
4) "a"
5) "x"
6) "y"
127.0.0.1:6379> LTRIM k1 0 -2
OK
127.0.0.1:6379> LRANGE k1 0 -1
1) "d"
2) "c"
3) "b"
4) "a"
5) "x"
127.0.0.1:6379>
三、hash
聚集数据
详情页
127.0.0.1:6379> set tom::name tom
OK
127.0.0.1:6379> set tom::age 18
OK
127.0.0.1:6379> keys *
1) "tom::age"
2) "tom::name"
127.0.0.1:6379> get tom::age
"18"
127.0.0.1:6379> hset tom name tom
(integer) 1
127.0.0.1:6379> hset tom age 18
(integer) 1
127.0.0.1:6379> keys *
1) "tom::age"
2) "tom::name"
3) "tom"
127.0.0.1:6379> hgetall tom
1) "name"
2) "tom"
3) "age"
4) "18"
127.0.0.1:6379> hkeys tom
1) "name"
2) "age"
127.0.0.1:6379> hvals tom
1) "tom"
2) "18"
127.0.0.1:6379> HINCRBY tom age -1
(integer) 17
127.0.0.1:6379> hget tom age
"17"
127.0.0.1:6379>
三、set
集合、去重、无序
场景
抽奖
127.0.0.1:6379> sadd k1 ooxx xxoo oxox xoxo xoox oxxo ooxx
(integer) 6
127.0.0.1:6379> SMEMBERS k1
1) "xxoo"
2) "oxox"
3) "xoox"
4) "ooxx"
5) "xoxo"
6) "oxxo"
127.0.0.1:6379> OBJECT encoding k1
"hashtable"
127.0.0.1:6379> type k1
set
127.0.0.1:6379> SRANDMEMBER k1 3 #取值无重复
1) "xxoo"
2) "xoox"
3) "ooxx"
127.0.0.1:6379> SRANDMEMBER k1 -3 #取值有重复
1) "ooxx"
2) "xoox"
3) "ooxx"
127.0.0.1:6379> SRANDMEMBER k1 8 #无重复,只能取出6个
1) "oxox"
2) "xoox"
3) "xxoo"
4) "ooxx"
5) "oxxo"
6) "xoxo"
127.0.0.1:6379> SRANDMEMBER k1 -8 #可以重复,可以取出8个
1) "xoox"
2) "ooxx"
3) "ooxx"
4) "xoox"
5) "ooxx"
6) "xoxo"
7) "ooxx"
8) "oxox"
127.0.0.1:6379>
并集、交集、差集
可以做好友推荐
127.0.0.1:6379> sadd k1 a b c d
(integer) 4
127.0.0.1:6379> sadd k2 c d e f
(integer) 4
127.0.0.1:6379> SUNION k1 k2 #并集
1) "c"
2) "b"
3) "f"
4) "a"
5) "d"
6) "e"
127.0.0.1:6379> SINTER k1 k2 #交集
1) "d"
2) "c"
127.0.0.1:6379> SDIFF k1 k2 #差集
1) "b"
2) "a"
127.0.0.1:6379> SDIFF k2 k1 #差集
1) "e"
2) "f"
127.0.0.1:6379>
sorted_set
场景
分页、排行榜
127.0.0.1:6379> zadd k1 3.2 apple 1.2 banana 4.3 oracle
(integer) 3
127.0.0.1:6379> ZRANGE k1 0 -1
1) "banana"
2) "apple"
3) "oracle"
127.0.0.1:6379> ZRANGE k1 0 -1 withscores
1) "banana"
2) "1.2"
3) "apple"
4) "3.2000000000000002"
5) "oracle"
6) "4.2999999999999998"
127.0.0.1:6379> ZRANGE k1 0 1 #从小到大,取前两名
1) "banana"
2) "apple"
127.0.0.1:6379> ZREVRANGE k1 0 1 #从大到小,取前两名
1) "oracle"
2) "apple"
127.0.0.1:6379> ZRANGEBYSCORE k1 1 4 #根据分值取1-4之前的元素
1) "banana"
2) "apple"
如何实现排序的?
ziplist
元素个数小于 128个
元素小于 64byte
skiplist (跳跃表)
参考:https://blog.csdn.net/qq_25775675/article/details/106034487
127.0.0.1:6379> OBJECT encoding k1
"ziplist"
127.0.0.1:6379> zadd k1 8.8 abcdddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddeeeeeeeeeeeeeeeeeee
(integer) 1
127.0.0.1:6379> OBJECT encoding k1
"skiplist"