05.redis-五大数据类型(2)

(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 已经是有序集的成员,那么更新这个 memberscore 值,并通过重新插入这个 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 已经是有序集的成员,那么更新这个 memberscore 值,并通过重新插入这个 member 元素,来保证该 member 在正确的位置上。

score 值可以是整数值或双精度浮点数。

number唯一才能插入成功

  • 执笔自此,redis的五大类型已完成。如果你跟着操作下来,先恭喜你,又进步了不少。最后我想说,不妨来波关注吧!共同学习,共同进步。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员阿红

你的鼓励是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值