Redis是一个key-value的数据库,key一般是String类型,不过value的类型多种多样:
Redis为了方便我们学习,将操作不同数据类型的命令也做了分组,在官网(https://redis.io/commands)可以查看到不同的命令:
help @generic
指令通用指令是部分数据类型的,都可以使用的指令,常见的有:
help keys
查询KEYS指令的用法KEYS keyName //查询指定键名所在数据库下的对应的值
KEYS xx* //模糊查询所在数据库下以xx为前缀的所有键名对应的值
KEYS * //查询所在数据库下所有键值对类型的值
借助mset指令演示(后面会进行说明)
DEL keyName //删除当前所在数据库下指定的键名的键值对,删除成功返回删除的键值对个数
help exists
查询EXISTS指令的用法EXISTS keyName //判断所在数据库下keyName对应的键值对是否存在;存在返回1不存在返回0
help expire
查询EXPIRE指令的用法EXPIRE keyName time(s) //将所在数据库下的keyName对应的键值对指定有效期为time秒
TTL keyName //查看所在数据库下keyName的有效期,默认值为-1
help keys
String类型,也就是字符串类型,是Redis中最简单的存储类型。 其value是字符串,不过根据字符串的格式不同,又可以分为3类:
不管是哪种格式,底层都是字节数组形式存储,只不过是编码方式不同。字符串类型的最大空间不能超过512m.
String类型的常见命令有:
SET keyName Value //设置keyName的值为Value 返回操作结果
GET keyName //获取指定keyNAme的Value 返回keyName对应的Value
Hash类型,也叫散列,其value是一个无序字典,类似于Java中的HashMap结构。 String结构是将对象序列化为JSON字符串后存储,当需要修改对象某个字段时很不方便:
Hash结构可以将对象中的每个字段独立存储,可以针对单个字段做CRUD:
Redis中的List类型与Java中的LinkedList类似,可以看做是一个双向链表结构。既可以支持正向检索和也可以支持反向检索。
三个思考问题: 如何利用List结构模拟一个栈? • 入口和出口在同一边 如何利用List结构模拟一个队列? • 入口和出口在不同边 如何利用List结构模拟一个阻塞队列? • 入口和出口在不同边 • 出队时采用BLPOP或BRPOP
Redis的Set结构与Java中的HashSet类似,可以看做是一个value为null的HashMap。因为也是一个hash表
Redis的SortedSet是一个可排序的set集合,与Java中的TreeSet(红黑树)有些类似,但底层数据结构却差别很大。SortedSet中的每一个元素都带有一个score属性,可以基于score属性对元素排序,(添加元素少的时候用的是压缩表ziplist 数据多了就转成跳表skiplist)底层的实现是一个跳表(SkipList)加 hash表。
注意:所有的排名默认都是升序,如果要降序则在命令的Z后面添加REV即可