(1)列表list
- push和pop,类似机枪AK47:push,压子弹,pop,射击出子弹。
- lpush(左插入)、rpush(右插入)、lrange(查询集合)
- l:left 自左向右—>添加(类似数据结构栈:从左边开始入栈)
- r:right自右向左<—添加(从右边开始入栈)
127.0.0.1:6379> lpush list1 1 2 3 4 5
(integer) 5
127.0.0.1:6379> lrange list1 0 -1 #查询列表所有元素,0表示开始,-1表示结尾
1) "5"
2) "4"
3) "3"
4) "2"
5) "1"
127.0.0.1:6379> rpush list2 1 2 3 4 5
(integer) 5
127.0.0.1:6379> lrange list2 0 -1
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
127.0.0.1:6379> lrange list2 0 2 #查询列表第一个元素到第三个元素
1) "1"
2) "2"
3) "3"
- lpop(左移出)、rpop(右移出)操作
127.0.0.1:6379> lrange list2 0 -1 #查询list2所有元素
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
127.0.0.1:6379> lpop list2 #从左边移除一个元素,并返回移除元素
"1"
127.0.0.1:6379> rpop list2 #从右边移除一个元素,返回移除元素
"5"
127.0.0.1:6379> lrange list2 0 -1 #查询list2所有元素
1) "2"
2) "3"
3) "4"
-
llen:返回集合长度
127.0.0.1:6379> llen list2 #返回list2的长度 (integer) 3
-
lrem:删除n个value
127.0.0.1:6379> lpush list3 0 1 1 4 4 5 4 4 (integer) 8 127.0.0.1:6379> lrem list3 3 4 #删除list3的3个value的元素 (integer) 3 127.0.0.1:6379> lrange list3 0 -1 1) "5" 2) "4" 3) "1" 4) "1" 5) "0"
-
ltrim:截取指定范围的值,别的全扔掉
- ltrim key begindex endindex
127.0.0.1:6379> lrange list3 0 -1 #list3的所有元素
1) "5"
2) "4"
3) "1"
4) "1"
5) "0"
127.0.0.1:6379> ltrim list3 0 2 #截取第一个到第三个元素的元素
OK
127.0.0.1:6379> lrange list3 0 -1 #查询截取后的元素,list3已经被改变了
1) "5"
2) "4"
3) "1"
- rpoplpush(移除指定集合中最后一个元素(栈底)到一个新的集合中)
127.0.0.1:6379> flushdb #清空数据
OK
127.0.0.1:6379> keys * #数据已经被清空
(empty array)
127.0.0.1:6379> lpush list v1 v2 v3 v4 v5 #添加5个元素到list
(integer) 5
127.0.0.1:6379> lrange list 0 -1 #查询list集合
1) "v5"
2) "v4"
3) "v3"
4) "v2"
5) "v1"
127.0.0.1:6379> rpoplpush list newlist #移除list集合中的最后一个元素到新的集合newlist中,返回值是移除的最后一个元素值
"v1"
127.0.0.1:6379> lrange list 0 -1
1) "v5"
2) "v4"
3) "v3"
4) "v2"
127.0.0.1:6379> lrange newlist 0 -1 #确实存在newlist集合并返回刚刚移除的元素。
1) "v1"
-
lset:改变某个下标的值
- lset key index value
127.0.0.1:6379> lrange list 0 -1 1) "v5" 2) "v4" 3) "v3" 4) "v2" 127.0.0.1:6379> lset list 0 v #将list第1个元素的值改为v OK 127.0.0.1:6379> lrange list 0 -1 1) "v" 2) "v4" 3) "v3" 4) "v2"
-
性能总结:头尾操作效率高,中间操作效率差;
(2)set集合
-
和java中的set特点类似,元素唯一,不运行重复
-
sadd(添加)、smenbers(查看所有元素)、sismenbers(判断是否存在)
127.0.0.1:6379> sadd set1 1 2 2 3 3 3 4 #添加元素(自动排出重复元素) (integer) 4 127.0.0.1:6379> smembers set1 #查看set1集合的所有元素 1) "1" 2) "2" 3) "3" 4) "4" 127.0.0.1:6379> sismember set1 2 #查看set1是否存在元素2 (integer) 1 #1:表示存在0:表示不存在 127.0.0.1:6379> sismember set1 5 (integer) 0
-
scard(查看长度)、srem(移除指定元素)
127.0.0.1:6379> scard set1 #查看set1的元素长度 (integer) 4 127.0.0.1:6379> smembers set1 #set1的所有元素 1) "1" 2) "2" 3) "3" 4) "4" 127.0.0.1:6379> srem set1 2 #删除set1的元素2 (integer) 1 127.0.0.1:6379> smembers set1 #删除成功 1) "1" 2) "3" 3) "4"
-
srandmember:从集合中随机获取几个元素
- srandmember整数(个数)
127.0.0.1:6379> flushdb #清空数据
OK
127.0.0.1:6379> sadd set1 1 2 3 4 5 6 7 8 9 #添加元素到集合set1
(integer) 9
127.0.0.1:6379> smembers set1 #查看set1集合的元素
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
6) "6"
7) "7"
8) "8"
9) "9"
127.0.0.1:6379> srandmember set1 3 #从集合随机获取3个元素
1) "8"
2) "3"
3) "4"
127.0.0.1:6379> srandmember set1 5 #从集合随机获取5个元素
1) "1"
2) "5"
3) "8"
4) "7"
5) "2"
- smove:移除元素:将key1某个值赋值给key2
127.0.0.1:6379> smembers set1 #查询set1的所有元素
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
6) "6"
7) "7"
8) "8"
9) "9"
127.0.0.1:6379> sadd set2 x y z #添加set2集合元素
(integer) 3
127.0.0.1:6379> smove set1 set2 1 #将set1的集合元素1移到set2集合中
(integer) 1
127.0.0.1:6379> smembers set2 #set1的元素1已经被移除到set2集合中
1) "1"
2) "z"
3) "y"
4) "x"
- srem:移除集合key中的一个或多个member元素,不存在的会被忽略
127.0.0.1:6379> srem set1 1
(integer) 1
127.0.0.1:6379> smembers set1
1) "2"
2) "3"
3) "4"
4) "5"
127.0.0.1:6379> smembers set1
1) "2"
2) "3"
3) "4"
4) "5"
127.0.0.1:6379> srem set1 1 2 3
(integer) 2
127.0.0.1:6379> smembers set1
1) "4"
2) "5"
- spop:随机删除元素
127.0.0.1:6379> smembers set2 #查询set2的集合
1) "1"
2) "a"
3) "b"
4) "3"
5) "2"
127.0.0.1:6379> spop set2 #随机删除1个元素
"b"
127.0.0.1:6379> spop set2 2 #随机删除2个元素
1) "3"
2) "2"
127.0.0.1:6379> smembers set2 #查看set2的集合元素
1) "1"
2) "a"
- 数学集合类
- 交集:sinter
- 并集:sunion
- 差集:sdiff
127.0.0.1:6379> flushdb #清空数据
OK
127.0.0.1:6379> sadd set1 1 2 3 4 5 #添加元素到集合set1
(integer) 5
127.0.0.1:6379> sadd set2 2 a 1 b 3 #添加元素到集合set2
(integer) 5
127.0.0.1:6379> sinter set1 set2 #集合set1和set2的交集
1) "1"
2) "2"
3) "3"
127.0.0.1:6379> sunion set1 set2 #集合set1和set2的并集
1) "1"
2) "a"
3) "b"
4) "5"
5) "4"
6) "3"
7) "2"
127.0.0.1:6379> sdiff set1 set2 #集合set1和set2的差集(在集合set1中存在,set2中不存在的元素)
1) "4"
2) "5"
127.0.0.1:6379> sdiff set2 set1 #在集合set2中存在,set1中不存在的元素
1) "a"
2) "b"
-
总结:可实现共同好友、共同关注等需求
(3) 哈希Hash
- 类似java里面的Map<String,Object>
- KV模式不变,但V是一个键值对
- hset:添加
- hget:得到
- hmset:多添加
- hgetall:多得到
- hdel:删除
127.0.0.1:6379> flushdb #清空数据
OK
127.0.0.1:6379> hset user id 001 #添加user对象,属性id=001
(integer) 1
127.0.0.1:6379> hget user #查询user,必须指明具体的字段
(error) ERR wrong number of arguments for 'hget' command
127.0.0.1:6379> hget user id
"001"
127.0.0.1:6379> hmset student id 101 name jackier age 24 #添加student对象,属性有多个。
OK
127.0.0.1:6379> hget student name #查询student对象
"jackier"
127.0.0.1:6379> hmget student id name #查询student对象id、name属性
1) "101"
2) "jackier"
127.0.0.1:6379> hgetall student #查询student所有属性
1) "id"
2) "101"
3) "name"
4) "jackier"
5) "age"
6) "24"
127.0.0.1:6379> hdel student age #删除student对象的age属性
(integer) 1
127.0.0.1:6379> hgetall student #查询student对象的所有属性,age属性已经被移除
1) "id"
2) "101"
3) "name"
4) "jackier"
127.0.0.1:6379>
- hlen:返回元素的属性个数
127.0.0.1:6379> hgetall student #现在student只有属性'id','name'。
1) "id"
2) "101"
3) "name"
4) "jackier"
127.0.0.1:6379> hlen student #返回student属性个数
(integer) 2
- hincrby:自增(整数)
- hincrbyfloat:自增(小数)
127.0.0.1:6379> flushdb #清空数据
OK
127.0.0.1:6379> hmset user id 007 name james age 23 #添加user对象
OK
127.0.0.1:6379> hgetall user #查询user对象
1) "id"
2) "007"
3) "name"
4) "james"
5) "age"
6) "23"
127.0.0.1:6379> hincrby user age 2 #user对象的age增加2
(integer) 25
127.0.0.1:6379> hget user age #查询user对象的age
"25"
127.0.0.1:6379> hmset student id 111 name zhangsan money 100 #添加student对象
OK
127.0.0.1:6379> hincrbyfloat student money 5.5 #为student对象money属性自增5.5
"105.5"
127.0.0.1:6379> hget student money
"105.5"
-
hsetnx:添加的时候,先判断是否存在
127.0.0.1:6379> hgetall user #查询集合user的属性和值 1) "id" 2) "007" 3) "name" 4) "james" 5) "age" 6) "25" 127.0.0.1:6379> hsetnx user age 18 #添加时:判断age是否存在 (integer) 0 #添加失败,因为age已存在 127.0.0.1:6379> hsetnx user sex 男 #添加时,判断sex是否存在 (integer) 1 #添加成功 127.0.0.1:6379> hgetall user #查询user对象的所有属性 1) "id" 2) "007" 3) "name" 4) "james" 5) "age" 6) "25" 7) "sex" 8) "\xe7\x94\xb7" #可以添加中文,但是为unicode编码
-
总结:比String更加适合存对象。
(4)zSet集合(有序集合)
- 真实需求:
充10元可享vip1;
充20元可享vip2;
充30元可享vip3;
以此类推… - zadd/zrange (withscores):添加/查询
- zadd key score member
- 如果某个
member
已经是有序集的成员,那么更新这个member
的score
值,并通过重新插入这个member
元素,来保证该member
在正确的位置上。score
值可以是整数值或双精度浮点数。
127.0.0.1:6379> flushdb #清空数据
OK
127.0.0.1:6379> zadd zet1 10 vip1 20 vip2 30 vip3 40 vip4 50 vip5
(integer) 5
127.0.0.1:6379> zrange zet1 0 -1 #查询所有值
1) "vip1"
2) "vip2"
3) "vip3"
4) "vip4"
5) "vip5"
127.0.0.1:6379> zrange zet1 0 -1 withscores #查询所有zet1的值,包含序号的值
1) "vip1"
2) "10"
3) "vip2"
4) "20"
5) "vip3"
6) "30"
7) "vip4"
8) "40"
9) "vip5"
10) "50"
- number唯一才能插入成功
127.0.0.1:6379> zadd zset 10 v1 20 v2 30 v3 40 v4 50 v5
(integer) 5
127.0.0.1:6379> zrange zset 0 -1 withscores #查询zet所有元素
1) "v1"
2) "10"
3) "v2"
4) "20"
5) "v3"
6) "30"
7) "v4"
8) "40"
9) "v5"
10) "50"
127.0.0.1:6379> zadd zset 10 vv #number不重复
(integer) 1 #插入成功
127.0.0.1:6379> zadd zset 10 vv #number重复
(integer) 0 #插入不成功
127.0.0.1:6379> zrange zset 0 -1 withscores
1) "v1"
2) "10"
3) "vv"
4) "10"
5) "v2"
6) "20"
7) "v3"
8) "30"
9) "v4"
10) "40"
11) "v5"
12) "50"
-
zrangebyscore:模糊查询
- ( :不包含
- limit:跳过几个截取几个。
127.0.0.1:6379> zrangebyscore zet1 20 40 #查询 20<=score<=40 1) "vip2" 2) "vip3" 3) "vip4" 127.0.0.1:6379> zrangebyscore zet1 20 (40 #查询20<=score<40 1) "vip2" 2) "vip3" 127.0.0.1:6379> zrangebyscore zet1 (20 (40 #查询20<score<40 1) "vip3" 127.0.0.1:6379> zrangebyscore zet1 10 40 limit 2 2 #查询zet1集合10<=score<=40,从第三个开始取2个元素。 1) "vip3" 2) "vip4" 127.0.0.1:6379> zrangebyscore zet1 10 40 limit 2 1 #查询zet1集合10<=score<=40,从第三个开始取1个元素。 1) "vip3"
-
zrem :删除元素
127.0.0.1:6379> zrange zet1 0 -1 1) "vip1" 2) "vip2" 3) "vip3" 4) "vip4" 5) "vip5" 127.0.0.1:6379> zrem zet1 vip1 #删除zet1集合的vip元素 (integer) 1 127.0.0.1:6379> zrange zet1 0 -1 1) "vip2" 2) "vip3" 3) "vip4" 4) "vip5" 127.0.0.1:6379>
-
zcard:集合长度
-
zcount:范围内的元素个数
-
zrank:得元素下标
-
zscore:通过值分数
127.0.0.1:6379> zcard zet1 #查询集合zet1的长度 (integer) 4 127.0.0.1:6379> zcount zet1 20 30 #查询分数在20~30的元素个数 (integer) 2 127.0.0.1:6379> zrank zet1 vip5 #查询集合zet1在集合的下标 (integer) 3 127.0.0.1:6379> zscore zet1 vip2 #通过元素获得对应的分数 "20"
-
zrevrank:逆序找下标
-
zrevrange:逆序查询
-
zrevrangebyscore:逆序范围内查找
127.0.0.1:6379> zrange zset 0 -1 withscores 1) "v1" 2) "10" 3) "vv" 4) "10" 5) "v2" 6) "20" 7) "v3" 8) "30" 9) "v4" 10) "40" 11) "v5" 12) "50" 127.0.0.1:6379> zrevrank zset v3 #逆序查找v3的下标 (integer) 2 127.0.0.1:6379> zrevrange zset 0 -1 #逆序查询 1) "v5" 2) "v4" 3) "v3" 4) "v2" 5) "vv" 6) "v1" 127.0.0.1:6379> zrevrangebyscore zset 30 10 #逆序查询范围在30~10的number(注意:先写大值,在写小值) 1) "v3" 2) "v2" 3) "vv" 4) "v1" 127.0.0.1:6379> zrevrangebyscore zset 10 30 #如果小值在前,则查询为空。 (empty array)
-
总结:成绩表排序,工资表排序,年龄排序等需求可以用zset来实现!
-
五大类型的添加说明:
(1)string
sadd:如果
key
已经持有其他值,SET
就覆写旧值, 无视类型。(2)list
lpush和rpush:如果 key
不存在,一个空列表会被创建并执行push操作。当 key
存在但不是列表类型时,返回一个错误。当key是同一个时,元素数据会被插入。
(3)hash
hset:如果给定的哈希表并不存在, 那么一个新的哈希表将被创建并执行 HSET
操作。
如果域 field
已经存在于哈希表中, 那么它的旧值将被新值 value
覆盖。
(4)set
sadd:将一个或多个 member
元素加入到集合 key
当中,已经存在于集合的 member
元素将被忽略。
假如 key
不存在,则创建一个只包含 member
元素作成员的集合。
(5)zset
zadd:如果某个 member
已经是有序集的成员,那么更新这个 member
的 score
值,并通过重新插入这个 member
元素,来保证该 member
在正确的位置上。
score
值可以是整数值或双精度浮点数。
number
唯一才能插入成功
- 执笔自此,redis的五大类型已完成。如果你跟着操作下来,先恭喜你,又进步了不少。最后我想说,不妨来波关注吧!共同学习,共同进步。