Redis基础
常见非关系型(NoSQL)数据库类型
- key-value型
- document:JSON型
- Graph型:node+edge
数据结构
redis的key一般是String类型,但是value有很多类型
帮助文档:
- 官网的“COMMAND”目录下包含所有命令,可以分组查询相关命令
- 在
redis-cli客户端,通过help命令进行相关查询
通用命令
-
KEYS:查看符合模板的所有key,“模板”类似于正则表达式由于Redis是单线程的,而生产环境中key的数量非常多,使用该查找命令会阻塞线程。因此不建议在生产环境设备上使用
-
DEL:删除指定的key,可以一次接受多个key批量删除- 如果没有对应的key,则无事发生
- 返回值为成功删除的key的个数
-
EXISTS:判断指定key是否存在,可以一次接受多个key批量判断返回值代表给出的key列表中,存在的个数
-
EXPIRE:给一个key设置有效期(单位是秒),有效期到期时,该key会被自动删除用法:
expire key seconds -
TTL:查看一个key的有效期- 查询结果的单位为秒
- 返回值为-1,代表永久有效
- 返回值为-2,代表该key不存在或已被删除
key的层级结构
Redis允许多个单词形成层级结构,多个单词间用
:隔开
好处:
- 允许不同类别中有相同id的存在
:使得名称有天然的层级结构,用可视化工具打开的时候会自动分包- 是Redis命名的一种最佳实践
1. String
- 底层都是以字节数组的形式存储,只不过根据格式,有不同的编码方式
- string
- int
- float
- 字符串类型最大空间不能超过512M
String类型常用命令
SET:添加或修改String类型的键值对GET:根据key获取String类型的valueMSET:批量添加多个String类型的键值对MGET:根据多个key获取多个String类型的valueINCR:如果某个value是整型,可以用INCR key语句使其对应的value自增1,返回自增后的结果值INCRBY:如果某个value是整型,可以用INCRBY key num语句使其对应的value自增num,返回自增后的结果值INCRBYFLOAT:如果某个value是浮点数,可以用INCRBYFLOAT key num语句使其对应的value自增num,返回自增后的结果值
虽然有DECR和DECRBY自减指令,但是可以用自增+负数的写法实现自减
浮点数的自增必须指定步长,浮点数也没有自减指令
-
SETNX:添加一个String类型的键值对,只有当key不存在时才会执行。即这是一个纯用来“新增”的指令,无法修改存在的键值对这其实是一个组合命令,与
SET key value NX指令效果一样 -
SETEX:添加一个String类型的键值对,并指定有效期,语法为:SETEX key seconds value这也是一个组合命令,与
SET key value EX seconds指令效果一样
2. Hash
又叫散列,是一个无序字典,与Java中的HashMap类似
Hash类型常用命令
-
HSET:添加或修改Hash类型的数据可以针对一个key,一次性批量添加或修改多个field(哈希字段名),因此
HMSET已被弃用 -
HGET:根据key和field获取对应的字段值 -
HMGET:根据key和多个field获取多个对应字段值 -
HGETALL:根据key获取所有的field以及对应的字段值 -
HKEYS:根据key获取所有字段名 -
HVALS:根据key获取所有字段值 -
HINCRBY:根据key和field使对应的整型值自增指定步长,语法:HINCRBY key field num -
HSETNX:只有当field不存在时,才能执行set操作。即只能添加不能修改字段值。
3. List
简单理解:可以看作一个双向链表,既可以正向检索,也可以反向检索
特征
常用来实现评论、留言等功能
- 有序
- 元素可重复
- 插入和删除快
- 查询速度一般
List类型常用命令
-
LPUSH:向列表左侧插入一个或多个元素 -
LPOP:移除并返回列表左侧的一个或多个元素,没有则返回nil。语法:LPOP key count -
RPUSH:向列表右侧插入一个或多个元素 -
RPOP:移除并返回列表右侧的一个或多个元素,没有则返回nil。语法:RPOP key count -
LRANGE:返回一段角标范围内的所有元素(左闭右闭)。语法:LRANGE key start endList的角标从0开始
-
BLPOP和BRPOP:与LPOP和RPOP类似,只不过在没有元素时,等待指定时间,而不是直接返回nil该指令只能取一个元素,不能批量获取(防止count和timeout两个数字产生歧义)
用List结构模拟栈和队列
- 栈:入口和出口在同一边
- 队列:入口和出口不在同一边
- 阻塞队列:
- 入口和出口不在同一边
- 出队时采用
BLPOP或BRPOP
4. Set
与Java中的HashSet类似,可以看作一个value为null的HashMap
特征
常用来实现共同好友等功能
- 无序
- 元素不可重复
- 查找快
- 支持交集、并集、差集等功能
Set类型常用命令
单个Set:
SADD:向Set中添加一个或多个元素SREM:移除Set中一个或多个元素SCARD:返回Set中元素的个数SISMEMBER:判断一个元素是否存在于Set中SMEMBERS:根据key获取Set中的所有元素
多个Set:
SINTER:求两个集合的交集SDIFF:求两个集合的差集SUNION:求两个集合的并集
5. SortedSet
SortedSet是一个可排序的Set集合,与Java的TreeSet有些类似,但底层数据结构差别很大
Java的TreeSet底层使用红黑树;但是Redis的SortedSet中,每个元素带一个score属性,Redis基于score对元素排序,底层实现是一个跳表+hash表
特征
常用来实现排行榜等功能
- 可排序
- 元素不重复
- 查询速度快
SortedSet常用命令
ZADD:添加一个或多个元素到SortedSet中,如果已经存在则更新score。语法:ZADD key score memberZREM:根据key删除指定的一个或多个元素ZSCORE:获取指定元素的scoreZRANK:获取指定元素在SortedSet中的排名ZCARD:根据key获取元素个数ZCOUNT:统计指定score范围内(左闭右闭)的所有元素个数。语法:ZCOUNT key min maxZRANGE:返回指定rank范围内(左闭右闭)的元素。语法:ZRANGE key min maxZRANGEBYSCORE:返回指定score范围内(左闭右闭)的元素。语法:ZRANGEBYSCORE key min maxZINCRBY:将指定元素的score自增指定步长。语法:ZINCRBY key increment memberZINTER、ZDIFF、ZUNION:求交集、差集、并集
注意:所有排名都是默认根据score升序,排名序号从0开始,如果要降序则在命令的Z后面加上REV,相应的范围也应该变成max min