五种数据类型:
- 字符串( String )
- 哈希( hash )
- 字符串列表( list )
- 字符串集合( set )
- 有序字符串集合( sorted set )
字符串( String ):
介绍:
- 二进制安全的,存入和获取的数据相同
- Value最多可以容纳的数据长度是512M。
常用命令:
- 赋值:set key value
例如:set company cc - 取值:get key
例如:get cc - 先取值再赋值:getset key value
例如:getset company baidu:先获取值(cc),在设置为(baidu),再次查看是指为baidu. - 数值递增:incr key
比如:incr num 即先将num初始为0,在加1,获取之后为1,再次incr num,获取之后为2.
如果是字符串,不能累加,否则将会抛出异常 比如:incr company. - 数值递减:decr key
比如:decr num 之前为2,递减之后为1,获取为1。如果没有这个值,则会初始为0,之后递减为-1,获得-1。同样,如果是字符串,不能递减,否则报错。 - 删除:del key
比如:del company ,nil:表示该值不存在
扩展命令:
- incrby key num:可以让指定key的value增加几,如果这个key不存在,设置为0再加,字符不能转成整型,将会抛出异常。
例如: incrby num 5 之前num的值是1,加5之后,获得为6 。incrby xx 5 没有xx这个值,将会初始为0,在加5,获取为5. - decrby key num:可以让指定key的value减少几,如果这个key不存在,设置为0再减,字符不能转成整型,将会抛出异常。
例如:decrby num 3 之前为6,减3之后,获取为3 。decrby num4 5 没有这个值,初始为0,0减5之后,获取为-5. - append key value:拼凑字符串,如果这个key存在,就会在原有的value后,追加这个值。如果不存在,就会创建一个新的key-value.
比如:append num 3,因为之前num为5,会在5的后面追加字符串3,新值为53。如果key原来不存在就会直接创建一个字符value。
哈希( Hash ):
介绍:
- String Key 和 String Value的map容器
- 每一个Hash可以存储4294967295个键值对
常用命令:
- 存储单个:hset 容器名 键 值;
- 存储多个:hmset 容器名 键 值 键 值 …
例如:hmset hash name lisi password hahaha - 单个取值:hget 容器名 键;
- 多个取值:hmget 容器名 键 键 …
- 取全:hgetall 容器名 : 获取map容器中所有使用的key和value
例如:hgetall hash,则会返回:name,lisi,password,hahaha - 删除某一个key以及对应的value:hdel 容器名 键...
- 全删此容器下所有的key和value:del 容器名
- 增指定值:hincrby 容器名 键 [integer](这个integer表示增值,一定是整数)
例如:hincrby hash num 3
- 判断存在:hexists 名称 键
- 键值对数量:hlen 名称
- 取所有键:hkeys 名称
- 取所有值:hvals 名称
字符串列表( List ):
介绍:
- ArrayList使用数组方式:根据索引去查询速度非常快,但是新增与删除元素时需要涉及到位移操作,效率比较低
- LinkedList使用双向链接方式:每个元素都记录了前后元素的指针,插入和删除数据时,只是改变了前后元素指针所指向的元素,速度快。
总览:
- 左推入:lpush list-name (data)+
- 右推入:rpush list-name (date)+
- 当队列存在时左推入:lpushx list-name (data)+
- 当队列存在时右推入:rpushx list-name (data)+
- 显示:lrange list-name begin-indedx end-index
- 左弹出:lpop list-name
- 右弹出:rpop list-name
- 显示长度:llen list-name
- 队列存在时左推入:lpushx list-name (data)+
- 队列存在时右推入:rpushx list-name (data)+
- 删除指定值的元素:lrem list-name count value
- 指定下标设置元素:lset list-name index value
- 在指定元素前插入元素:linsert list-name before exists-value new-value
- 在指定元素后插入元素:linsert list-name after exists-value new-value
- 将一个队列的值弹出并推入另一个队列中:rpoplpush list-name1 list-name2
详细:
- lpush:左侧插入
如:lpush mylist1 a b c 返回3(实际排列:c b a)表示是数量,然后继续 lpush mylist1 1 2 3 返回6
(实际排列:3 2 1 c b a ) - rpush:右侧插入
如:rpush mylist2 a b c (实际排列:a b c),rpush mylist2 1 2 3 (实际排列:a b c 1 2 3 - lrange:查看列表,从哪开始到哪结束(必须是从左到右)
0:表示链表头部(左起)的第一个元素,如:lrange mylist1 0 5,返回:3,2,1,c,b,a.
-1:表示链表的尾部第一个元素,lrange mylist1 0 -1,返回:3,2,1,c,b,a
-2:表示链表的尾部第二个元素,lrange mylist1 0 -2,返回:3,2,1,c,b.
必须是从左到右:lrange mylist1 -2 -1,返回:b,a(即从倒数第二个到倒数第一个)
lrange mylist1 -1 -2,返回:错误(不可以从右往左查看)
-
lpop:左弹出它会返回并弹出指定链表名所关联的那个链表中的第一个元素,不存在返回nil
如:lpop mylist1,弹出3,弹出之后,里面就没有这个元素了,lrange mylist 0 -1,返回的结果中,不在在3这个元素了,返回:2,1,c,b,a。 -
rpop:右弹出
如rpop mylist2,弹出3,弹出之后,lrange mylist2 0 -1,查看,这个元素已经不存在了。 -
llen:获取列表中的元素个数
如果这个列表不存在,则返回0,如:llen mylist1,返回5. -
lpushx: 仅当我们参数中指定的key存在时,可以向关联的list的头部去插入一个值,如果不存在,就不会进行插入,返回0
如:lpushx mylisy1 x,表示将x插入到链表的头部,lrange mylist 0 -1,可以看到新插入的元素。 - rpushx:仅当我们参数中指定的key存在时,可以向关联的list的尾部去插入一个值,如果不存在,就不会进行插入,返回0
如:rpushx mylist2 y ,表示向mylist2列表的尾部插入一个元素y,lrange mylist2 0 -1,查看,可以看到y元素在最后面。 - lrem:先写上具体的一个链表名,后面再跟上一个count,value。它会删除count个值为value的元素。( lrem <listname> <count> <value> )
- 如果count大于0,它就会从头向尾遍历,并删除count个为value的元素,
- 如果count小于0,它会从后面向前面遍历,并删除count个为value的元素。
- 如果count等于0,则删除链表中所有等于value的元素。
如:lrem mylist1 1 3, 表示从头到尾删除列表中的1个3.
lrem mylist2 -1 2,表示从后面向前删除1个2.
lrem mylist2 0 2,表示删除mylist2中的所有2
-
lset: 来设置列表中的某个index的角标的元素的值(下标必须是存在的,不然会下标溢出)
-
0表示第一个元素,
-
-1表示最尾的元素。我们可以操作链表的角标,如果不存在,就抛出异常。如:原来的mylist1中现在是:a,b,c,这时候 lset mylist1 0 ok,表示将链表mylist1的第一个值替换为ok. mylist1中现在是:ok,b,c,如果lset mylist1 3 bad,即设置第四个为bad,但是第四个值是不存在的,所以会报错.
-
- linsert: 在某个元素的前或后插入某个元素( linsert <listname> [before/afert] <value> <new value> )
如:linsert mylist1 before b 11,表示在mylist1链表中的b之前插入11。
linsert mylist1 after b 22,表示在mylist4链表中的b后面插入22 - rpoplpush: 将第一个链表中的尾部元素弹出,并添加第二个链表的头部
( rpoplpush <listname1> <listname2> )
应用场景:
当存在一个消费队列时,可以想象成外卖订单的队列,每一次送餐员都从这个队列中pop一份外卖,但送餐的途中一旦出现问题就需要重做,但是此时外卖订单队列中的值却无法恢复了,所以我们可以再设置一个备份队列,rpoplpush 外卖订单队列 备份队列
此时每一个从外卖订单队列中pop出的外卖都会添加到备份队列中,当送餐员送完餐后,再将这个从备份队列中删除这个值。我们可
外卖订单队列中,由下一个送餐员继续送。
字符串集合( Set ):
介绍:
- 存储Set 和list类型不同 ,set集合中不允许出现重复元素和java hashSet 差不多
- set 可包含的最大元素数量是4294967295
命令:
- 添加:sadd 集合名 [值...]
- 删除:srem 集合名 [值...]
- 查看:smembers 集合名
- 查看是否存在:sismember 集合名 值,1表示存在,0表示不存
- 差集(A与B的差集表示所有属于A且不属于B的元素构成的集合):sdiff 集合名1 集合名2 (与顺序有关)
- 交集:sinter 集合名1 集合名2
- 并集:sunion 集合名1 集合名2
- 查看集合中元素数量:scard 集合名
- 随机查:srandmember 集合名
- 将差集存到新集合中:sdiffstore 新集合名 集合名1 集合名2
- 将交集存到新集合中:sinterstore 新集合名 集合名1 集合名2
- 将并集存到新集合中:sunionstore 新集合名 集合名1 集合名2
有序字符串集合( Sorted-Set ):
介绍:
- 可存储有序但不重复的数据,每个元素都有一个分数与之对应,靠分数来排序。
- 因为元素有序,所以访问高效
命令:
- 存储:zadd 集合名 [分数 值]...
例如:zadd mysort 70 aa 80 bb,此时如果zadd mysort 50 aa,则会覆盖原来aa的分数 - 查分数:zscore 集合名 值
- 查数量:zcard 集合名
- 单点删除(但是值可以写多个):zrem 集合名 值...
- 范围删除:zremrangebyrank 集合名 [begin,end]
例如:zremrangebyrank mysort 0 2,删除下标从0到2的三个元素 - 升序查值:zrange 集合名 [begin,end] <withscores>(两者可为正负数,-1表示最后一个值)(withscores带分数,可选项)
例如:zrange mysort 0 -1 withscores - 降序查值:zrevrange 集合名 [begin,end] <withscores>(两者可为正负数,-1表示最后一个值)(withscores带分数,可选项)
- 分数查值:zrangebyscore 集合名 [begin,end] <withscores>
例如:zrangebyscore mysort 70 80,表示查找分数在70和80之间的值 - 分页查值:zrangebyscore 集合名 [begin,end] <withscores limit [offset count]>
例如:zrangebyscore mysort 0 100 withscores limit 0 2,这里分页指从下标0开始的2个元素
zrangebyscore mysort 0 100 withscores limit 1 2,这里分页指从下标1开始的2个元素 - 为某个元素增加分数:zincrby 集合名 addnum 值
例如:zincrby mysort 3 aa,则aa的分数由原来的50变为53 - 显示分数区间内元素个数:zcount 集合名 [begin,end]
例如:zcount mysort 80 90//显示80到90分的元素个数
使用场景:
- 游戏的排名,每次游戏动作后,更新玩家对应的分数,然后redis会自动排名
- 微博的热点
- 构建索引数据