Redis快速入门
Remote Dctionary Server
Redis是用C语言开发的一个开源的、基于内存的(高性能)键值对(key-value)结构化NoSql数据库
,每秒内查询次数可以达到100000+的QPS
-
键值型: Redis中存储的数据都是以key、value对的形式存储,而value的形式多种多样(如字符串、数值、甚至json)
-
NoSql(Not Only Sql): 是一种非关系型数据库相对于传统关系型数据库而言有很大差异,是对关系型数据库的补充
Redis应用场景
:数据库, 缓存(基于内存)、消息队列、任务队列、分布式锁
单线程
: 每个命令具备原子性- 低延迟,速度快(基于内存、IO多路复用、良好的编码)
- 支持数据持久化
- 支持主从集群(从节点可以备份主节点的数据)、分片集群
- 支持多语言客户端
Redis常见命令
快速学习
Redis是典型的key-value
数据库,key一般是字符串,而value包含很多不同的数据类型
,操作不同的数据类型对应不同的命令
Redis官网将操作不同数据类型的命令也做了分组,我们可以去官网查看到不同的命令方便学习
help @group类型
: 每一种数据类型对应不同的分组, 查看各种不同group(数据类型)去学习相关的命令
Redis通用命令
通用指令是部分数据类型都可以使用的指令, help [command]
可以查看一个命令的具体用法,tab
键可以自动补全命令并带有参数提示
命令 | 功能 |
---|---|
KEYS 通配符 | 查看符合模板的所有key, 这种方式效率不高生产环境中不建议使用,因为redis是单线程的在查询期间无法执行其他命令 |
DEL [key...] | 删除一个或多个指定的key,返回删除key的数量 |
EXISTS [key...] | 判断指定的key是否存在(0表示不存在,1表示存在) |
EXPIRE key seconds | 给一个key设置有效期,有效期到期时该key会被自动删除(redis是基于内存存储的,定时清理可以节省内存空间) |
TTL key | 查看一个KEY的剩余有效期(默认key的有效期是-1表示永久有效,有效期是-2表示这个key被移除了) |
# 查看keys命令的帮助信息
127.0.0.1:6379> help keys
# 语法格式
KEYS pattern
# 描述信息
summary: Find all keys matching the given pattern
since: 1.0.0
group: generic
String类型(value是字符串)
String字符串类型是Redis中最简单的存储类型, 其中value是字符串,字符串类型的最大空间不能超过512m
根据字符串的格式不同, String类型可以分为3类 ,不管是哪种字符串格式底层都是以字节数组形式存储,只不过是编码方式不同
- string:普通字符串
- int:整数类型,可以做自增、自减操作
- float:浮点类型,可以做自增、自减操作
命令 | 功能 |
---|---|
`SET key value [nx | ex]` |
GET key | 根据key获取String类型的value |
MSET [key value...] | 批量添加多个String类型的键值对 |
MGET [key...] | 根据多个key获取多个String类型的value,返回一个数组 |
INCR key | 每执行一次让一个整型的key自增1 |
INCRBY key 增长的数量 | 让一个整型的key自增并指定步长(负数表示减少),例如incrby num -2 (让num值减少2) |
INCRBYFLOAT key 增长的数量 | 让一个浮点类型的数字自增并指定步长 |
SETNX key value | 添加一个String类型的键值对,前提是这个key不存在否则不执行,SET使用nx选项的效果和其效果一致 |
SETEX key seconds value | 添加一个String类型的键值对并且指定有效期,SET使用ex选项的效果和其效果一致 |
Key结构
当我们需要存储用户信息或商品信息到redis中时,有一个用户id是1,有一个商品id恰好也是1,此时如果使用id作为key就会发生冲突
Redis区分不同类型的key: Redis没有类似MySQL中的Table的概念, 它规定通过给key添加前缀加以区分key的类型
- 添加前缀的规范: Redis的key允许有多个单词形成层级结构,多个单词之间用
:
隔开,项目名:业务名:类型:id
(具体根据自己的需求来删除或添加词条)
需求: 我们的商城项目有user和product两种不同类型的数据, 如果要存储的Value是一个Java对象(将对象序列化为JSON字符串后存储)
KEY | VALUE(存储的Value是一个Java对象) |
---|---|
heima:user:1 | {“id”:1, “name”: “Jack”, “age”: 21} |
heima:product:1 | {“id”:1, “name”: “小米11”, “price”: 4999} |
在Redis的桌面客户端中还会以相同前缀作为层级结构,让数据看起来层次分明,关系清晰
Hash类型(value是HsahMap)
String结构是将对象序列化为JSON字符串后存储,由于字符串是个整体无法单独修改对象中某个字段的值
,此时我们可以使用Hash类型
Hash类型也叫散列,其value是一个无序字典(类似于Java中的HashMap结构),可以将对象中的每个字段独立存储方便针对单个字段做CRUD
命令 | 功能 |
---|---|
HSET key field value | 添加或者修改hash类型key的field的值 |
HGET key field | 获取一个hash类型key的field的值 |
HDEL key field | 删除存储在哈希表中的指定字段 |
HMSET key [field value...] | 批量添加多个hash类型key的field的值 |
HMGET key [field...] | 批量获取多个hash类型key的field的值 |
HGETALL key | 获取一个hash类型的key中的所有的field和value |
HKEYS key | 获取一个hash类型的key中的所有的field |
HVALS | 获取一个hash类型的key中的所有的value |
HINCRBY 步长(正数表示增加,负数表示减少) | 让一个hash类型key的字段值自增并指定步长 |
HSETNX key field value | 添加一个hash类型的key的field值,前提是这个field不存在否则不执行 |
List类型(value是双向链表)
Redis中的List类型与Java中的LinkedList类似,可以看做是一个双向链表结构(左侧是队首右侧是队尾)
特征
: 有序(存取顺序一致), 元素可以重复, 插入和删除快, 查询速度一般,既可以支持正向检索和也可以支持反向检索- List类型常用来存储一个有序数据,例如朋友圈点赞列表,评论列表等
List的常见命令: L表左边,R表示右边,B表示阻塞
, key表示一个LinkedList集合
- 将入口和出口设置在同一边可以模拟一个栈
- 将入口和出口设置在不同边可以模拟一个队列
- 将入口和出口设置在不同边,出队时采用BLPOP或BRPOP可以模拟一个阻塞队列
命令 | 功能 |
---|---|
LLEN key | 获取列表长度 |
LPUSH key [element...] ... | 向某个key列表的左侧按照顺序插入一个或多个元素 |
LPOP key [count] | 移除并返回某个key列表的左侧第一个元素,没有则返回nil表示没有 |
LRANGE key start stop | 获取列表指定范围内的元素,stop的值是-1时表示查询所有元素 |
RPUSH key [element...] | 向某个key列表的右侧按照顺序插入一个或多个元素 |
RPOP key [count] | 移除并返回某个key列表右侧的第一个元素,没有则返回nil表示没有 |
LRANGE key star end | 返回一段角标范围内的所有元素 |
BLPOP和BRPOP key timeout | 与LPOP和RPOP类似,只不过在没有元素时会等待一段时间 ,而不是直接返回nil |
Set类型(HashSet)
Redis的Set类型与Java中的HashSet类似,可以看做是一个value为null的HashMap
特征
:无序(存取顺序不一致),元素不可重复(相同元素会覆盖),查找快支持交集、并集、差集
可以用来统计好友列表的功能
Set的常见命令: key表示HashSet集合
命令 | 功能 |
---|---|
SADD key [member...] | 向set中添加一个或多个元素 |
SREM key [member...] | 移除set中的一个或者多个元素 |
SCARD key | 返回set中元素的个数 |
SISMEMBER key member | 判断一个元素是否存在于set中(0表示不存在,1表示存在) |
SMEMBERS | 获取set中的所有元素 |
SINTER key1 [key2...] | 求key1与key2等多个key的交集 |
SDIFF key1 [key2 ...] | 求key1与key2的差集(key1 - key2) |
SUNION key1 [key2 ...] | 求key1和key2等多个key的并集(合并之后重复元素只会记录一次) |
将下列数据用Redis的Set集合来存储
# 张三的好友有:李四、王五、赵六
127.0.0.1:6379> sadd zhangsan lisi wangwu zhaoliu
# 李四的好友有:王五、麻子、二狗
127.0.0.1:6379> sadd lisi wangwu mazi ergou
# 计算张三的好友有几人
127.0.0.1:6379>scard zhangsan
# 计算张三和李四有哪些共同好友,"wangwu"
127.0.0.1:6379> sinter zhangsan lisi
# 查询哪些人是张三的好友却不是李四的好友,"zhaoliu"和 "lisi"
127.0.0.1:6379> sdiff zhangsan lisi
# 查询张三和李四的好友总共有哪些人, "wangwu","zhaoliu","ergou","lisi", "mazi"
127.0.0.1:6379> sunion zhangsan lisi
# 判断李四是否是张三的好友
127.0.0.1:6379> sismember zhangsan lisi
# 判断张三是否是李四的好友
127.0.0.1:6379> sismember lisi zhangsan
# 将李四从张三的好友列表中移除
127.0.0.1:6379> srem zhangsan lisi
SortedSet类型
Redis的SortedSet是一个可排序的set集合,虽然功能与Java中的TreeSet有些类似但底层数据结构却差别很大, TreeSet底层是通过红黑树实现的
- SortedSet中的每一个元素都携带一个score属性,redis底层基于score属性的值通过一个跳表(SkipList)加hash表实现对元素排序(默认升序)
- 特征: 可排序, 元素不重复, 查询速度快
- 因为SortedSet的可排序特性,经常被用来实现排行榜这样的功能
SortedSet的常见命令:key表示TreeSet集合, 所有的排名默认都是升序,如果要降序则在命令的Z后面添加REV
ZREVRANK key memeber
: 降序获取sortedset中的指定元素的排名
命令 | 功能 |
---|---|
ZADD key score member [score member...] | 添加一个或多个元素到sortedset ,如果已经存在则更新其score值 |
ZREM key member [member...] | 删除sortedset中的一个或多个元素 |
ZSCORE key member | 获取sortedset中的指定元素的score值 |
ZRANK key member | 获取sortedset中的指定元素的排名(从0开始编号) |
ZCARD key | 获取sortedset中的元素个数 |
ZCOUNT key min max | 统计指定score范围内的所有元素的个数 |
ZINCRBY key increment(数值可正可负) member | 让sortedset中的指定元素自增指定的increment值 |
ZRANGE key min max | 按照score排序后,获取指定排名范围内的元素(排名从0开始编号) |
ZRANGEBYSCORE key min max | 按照score排序后,获取指定score范围内的元素 |
ZDIFF、ZINTER、ZUNION | 求差集、交集、并集 |
将班级的下列学生得分存入Redis的SortedSet中,Jack 85, Lucy 89, Rose 82, Tom 95, Jerry 78, Amy 92, Miles 76
# 将班级的下列学生得分存入Redis的SortedSet中
127.0.0.1:6379> zadd stu 85 Jack 89 Lucy 82 Rose 95 Tom 78 Jerry 92 Amy 76 Miles
# 删除Tom同学
127.0.0.1:6379> zrem stu Tom
# 获取Amy同学的分数,"92"
127.0.0.1:6379> zscore stu Amy
# 获取Rose同学的排名
127.0.0.1:6379> zrank stu Rose
# 查询80分以下有几个学生
127.0.0.1:6379> zcount stu 0 80
# 给Amy同学加2分,"94"
127.0.0.1:6379> zincrby stu 2 Amy
# 查出成绩前3名的同学,"Miles","Jerry","Rose"
127.0.0.1:6379> zrange stu 0 2
# 查出成绩80分以下的所有同学,"Miles","Jerry
127.0.0.1:6379> zrangebyscore stu 0 80