目录
2.4 EXPIPE:给一个key设置有效期,有效期到期时该key会被自动删除(key存在)
3.1 SET:添加或修改已经存在的一个String类型的键值对
3.4 MGET:根据多个key获取多个String类型的value
3.7 INCRBYLOAT:让一个浮点类型的数字自增并指定步长
3.8 SETNX: 添加一个String类型的键值对,前提是这个key不存在,否则不执行(真正的新增功能)
3.9 SETEX: 添加一个String类型的键值对,并且指定有效期(合二为一)
5.1 HSET key field value :添加或修改hash类型key的field的值
5.2 HGET key field: 获取一个hash类型key的field的值
5.3 HMSET: 批量添加多个hash类型的key的field的值
5.4 HMGET: 批量获取多个hash类型的key的field的值
5.5 HGETALL: 获取一个hash类型的key中的所有的field和value
5.6 HKEYS: 获取一个hash类型的key中的所有field
5.7 HVALS: 获取一个hash类型的key中的所有value
5.8 HINCRBY: 让一个hash类型key的字段值自增并指定步长
5.9 HSETNX: 添加一个hash类型的key的field值,前提是这个field不存在
6.1 LPUSH key element...:向列表左侧插入一个或多个元素
6.2 LPOP key:移除并返回列表左侧的第一个元素,没有则返回nil
6.3 RPUSH key element...: 向列表右侧插入一个或多个元素
6.5 LRANGE key star end:返回一段角标范围内的所有元素
6.6 BLPOP和BRPOP:与LPOP和RPOP类似,只不过在没有元素时等待指定时间而不是直接返回nil
7.1 SADD key member...:向set中添加一个或多个元素
7.2 SREM key member...:移除set中的指定元素
7.4 SISMEMBER key member:判断一个元素是否存在于set中
7.6 SINTER key1 key2...: 求key1与key2的交集
7.7 SDIFF key1 key2...:求key1与key2的差集
7.8 SUNION key1 key2...:求key1和key2的并集
一、数据结构介绍
二、通用命令
通用命令是任何数据类型都能适用的命令,在我们官方文档中,就是在Keys这一组下
官方网站:Commands | Redis
2.1 KEYS:命令查看符合模板的所有key
在我们生产环境设备商我们不建议使用,
我们用模糊的这种查询效率较慢,会给服务器带来巨大的负担又因为Redis是单线程,在这段时间内Redis又不能去执行其他命令,所以我们不建议使用
但是有Redis集群的话,那没问题,可以在从库上进行查询
我们怎么查看一个命令的用法?
如下图所示 help+命令名称
我们看一下官方文档中的使用:
比如第一个 符合*name*的,我们下面就会进行返回 (*号是通配符,底层会有一种模糊查询的机制,?号代表一个字符)
下面我们这个例子就是匹配所有
2.2 DEL命令:删除一个指定的key
、
例子:我们可以删除一个key
DEL name 然后我们成功删除了一个key=name
例子: 删除多个
将key一个一个在后面排就好了。我们可以看一下我们的删除,我们并没有key=k4的,所有我们最后影响的数据条数是3条
2.3 EXISTS:判断key是否存在
如果返回值是0,就代表不存在
2.4 EXPIRE:给一个key设置有效期,有效期到期时该key会被自动删除(key存在)
这种的使用是在key已经存在的情况下使用
建议:当我们存放一组数据的时候,建议都放一个有效期
为什么会有这个命令?
因为Redis是基于内存存储的,如果我们一直插入而不删除,时间长了内存就可能被沾满,所以便出现了这个命令(比如短信验证码)
给key=value对应的数据设置一个有效期为20秒钟
2.5 TTL:查看一个KEY的剩余有效期
我们查看一下刚刚我们设置的有效期还多少秒:9秒
当我们一会再执行,发现是-2,说明我们最初设置的存在有效期的key已经被移除了
我们重新放一个key=name value=Jack 的数据,但是我们没有设置有效期,那么下面我们来检查一下什么时候过期
如下图所示:-1 其代表的永久有效
三、String类型
String类型,也就是字符串类型,是Redis中最简单的存储类型,使用简单方便
底层会把数字直接转为二进制的形式作为字节进行存储这样一来一个字节就能表示一个很大的数字,节省了空间
而字符只能转化为相应的字节码来进行存储占用的内存更多一点
下面就是String中常见的命令:
3.1 SET:添加或修改已经存在的一个String类型的键值对
如果这个键值对不存在,那就是添加,反之则是修改
当我们再次放一个name的时候,我们就发现之前我们放的“Rose”就被覆盖掉了,变成了Jack
3.2 GET:根据key获取String类型的value
3.3 MSET:批量添加多个String类型的键值对
3.4 MGET:根据多个key获取多个String类型的value
3.5 INCR:让一个整型的key自增1
如下图所示,本来的age的value是18,然后我们使用INCR命令,就做做当了让age的value自增1
每执行一次就加1
3.6 INCRBY:让一个整型的key自增并指定步长
默认情况下自增1,但是我们也可以指定增长多少
当我们把步长指定为负数,那就是自减了
当然我们也有一个专门的指令执行自减:DECR
3.7 INCRBYFLOAT:让一个浮点类型的数字自增并指定步长
注意 要指定步长
3.8 SETNX: 添加一个String类型的键值对,前提是这个key不存在,否则不执行(真正的新增功能)
这个其实是一个组合功能,显示set,再是nx
因为我们在set的时候可以跟很多很多的参数,其中就有一个nx参数
3.9 SETEX: 添加一个String类型的键值对,并且指定有效期(合二为一)
就比如我们下面这个使用setex key second value
四、Key的层级格式
Redis的key允许有多个单词形成层级结构,多个单词之间用‘:’隔开
比如: 项目名:业务名:类型:id
java对象中有多少字段,我们value中有多少字段就可以了,一个用户对应一个一个JSON的value
案例:
我们先存储几个字符串
然后我们就会看到我们可视化工具里面就有了分层的结构
五、Hash类型
Hash类型,也叫散列,其value是一个无序字典,类似Java中的HashMap结构。
与String类型对比一下,在Value中Hash类型比String类型多了一个字段(field)
下面的这些命令我们都很眼熟,在String类型的命令前面加一个H便是Hash命令
5.1 HSET key field value :添加或修改hash类型key的field的值
当我们添加的时候我们其实不用记住key,field,value的顺序,我们只记住命令就可以了,顺序的话会有提示信息引导着我们输入
结构样子:
5.2 HGET key field: 获取一个hash类型key的field的值
5.3 HMSET: 批量添加多个hash类型的key的field的值
5.4 HMGET: 批量获取多个hash类型的key的field的值
5.5 HGETALL: 获取一个hash类型的key中的所有的field和value
当我们输入这条命令后,就会将我们key中的所有field与value依次返回
5.6 HKEYS: 获取一个hash类型的key中的所有field
仅仅是字段名!!!
5.7 HVALS: 获取一个hash类型的key中的所有value
5.8 HINCRBY: 让一个hash类型key的字段值自增并指定步长
5.9 HSETNX: 添加一个hash类型的key的field值,前提是这个field不存在
如果返回值是0的话,就代表着已经有这个字段了,添加失败
六、List类型
保存一些对顺序有要求的业务:比如朋友圈的点赞顺序(先后点赞)、评论
与java中的LinkedList类似,可以看做是一个双向链表结构,既可以支持正向检索也可以支持反向检索
特征也与LinkedList类似:
- 有序
- 元素可以重复
- 插入和删除快
- 查询速度一般
6.1 LPUSH key element...:向列表左侧插入一个或多个元素
因为我们是从左侧开始加入的,所以我们最终的结果是3,2,1是没问题的
6.2 LPOP key:移除并返回列表左侧的第一个元素,没有则返回nil
按照表中的序列依次从左侧取出
6.3 RPUSH key element...: 向列表右侧插入一个或多个元素
此时是从右侧加入的,所以顺序是4,5,6是没问题的
6.4 RPOP key:移除并返回列表右侧的第一个元素
6.5 LRANGE key star end:返回一段角标范围内的所有元素
6.6 BLPOP和BRPOP:与LPOP和RPOP类似,只不过在没有元素时等待指定时间而不是直接返回nil
我们等key为users2的元素100秒,如果没有的话就堵塞
然后我们重新开一个控制台添加一个user2
然后我们再来查看一下我们刚刚的命令,发现已经有响应了,并且告诉了我们多少时间
七、Set类型
Redis的Set结构与Java中的HashSet类似,可以看做是一个value为null的HashMap。因为也是一个hash表因此具备与HashSet类似的特征:
- 无序
- 元素不可重复
- 查找快
- 支持交际、并集、差集等功能
7.1 SADD key member...:向set中添加一个或多个元素
7.2 SREM key member...:移除set中的指定元素
7.3 SCARD key:返回set中元素的个数
7.4 SISMEMBER key member:判断一个元素是否存在于set中
7.5 SMEMBERS:获取set中的所有元素
7.6 SINTER key1 key2...: 求key1与key2的交集
zs和ls有哪些共同好友?
7.7 SDIFF key1 key2...:求key1与key2的差集
查询集合中,zs有而ls没有的朋友
7.8 SUNION key1 key2...:求key1和key2的并集
zs和ls一共有多少好友?
八、SortedSet类型
Redis的SortedSet是一个可排序的set集合,与Java中的TreeSet有些类似,但底层数据结构却差别很大。
SortedSet中的每一个元素都带有一个score属性,可以基于score属性对元素排序,底层的实现是一个跳表(SkipList)加hash表
特性:
- 可排序
- 元素不重复
- 查询速度快
功能业务:排行榜
将学生存入到SortedSet中
这个界面默认就是按照score升序展示的
删除Tom同学
获取Amy同学的分数
获取Rose同学的排名
注意!这个地方的返回值是按照下标为0开始计算的
查询80分以下有几个学生
结果是两个人
给Amy同学加2分
查出成绩前三名的同学
注意这个地方是0到2,因为下标是从0开始的
记得加REV 因为我们排成绩是倒序
我们在统计80分以下有几个同学的时候,使用的是ZCOUNT命令,不要混了