本文主要介绍 Redis 基础,包括什么是 Redis 、Redis 数据结构有那些 以及 各种Redis 数据结构的常用操作命令
1. 初始 Redis
1.1 NoSQL 数据库 —— 非关系型数据库
- SQL
1) 结构化 -—— 例如 MySQL 中的表结构 (不建议修改,初始时就要设计好)
2) 关联的 —— MySQL 中的外键
3) SQL 查询 —— 查询语法是固定的
4)具有事务需求 —— 底层具有事务的实现,满足 ACID
5)磁盘存储
使用场景:数据结构固定;业务对数据安全性、一致性要求较高 - NoSQL
1) 非结构化 —— 如 Redis 就是一种键值型数据库 ,除此之外还有文档型数据库(MongoDB)、列类型数据库(HBase)、图数据库( Neo4j — 常用于社交 app)等
2) 无关联 —— 想建立关联,要通过嵌套存储实现
3) 非 SQL —— 没有查询固定的语法格式 - 4) 不能满足事务需求 —— BASE
5) 内存存储
使用场景:数据结构不固定、对一致性、安全性要求不高、对性能要求高
1.2 认识 Redis
Redis 全程 Remote Dictionary Server ,远程词典服务器,其是一个基于内存的键值型 NoSQL 数据库。它具有如下特点:
特点:
- 键值型
- 单线程 —— 每个命令原子性 (6.0 核心部分也是单线程,只是网络部分进行了多线程的处理)
- 低延迟、速度快 (基于内存 – 快的核心原因、IO多路复用、良好的编码 - C语言)
- 支持数据的持久化 —— 定期将数据持久化到磁盘
- 支持主从集群、分片集群
- 支持多语言客户端 (C、Java 等都能用)
1. 3 安装 Redis
Redis 详细安装过程请见我这篇文章 :
这里补充几个部分:
- 设置任何机器都能访问 , 在 redis.conf 中修改:
bind 0.0.0.0
- 设置 Redis 后台运行
daemonize yes
- 设置 Redis 日志文件
logfile "redis.log"
- 设置 Redis 开机自启动
1) 新建一个系统服务文件
vi /etc/systemd/system/redis.service
在里面输入:
[Unit]
Description=redis-server
After=network.target
[Service]
Type=forking
ExecStart=/usr/local/bin/redis-server /usr/local/src/redis-6.2.6/redis.conf # 这里要改成你自己的 redis 配置文件地址
PrivateTmp=true
[Install]
WantedBy=multi-user.target
2)重载系统服务
systemctl daemon-reload
3)通过如下命令操作 Redis
# 启动
systemctl start redis
# 停止
systemctl stop redis
# 重启
systemctl restart redis
# 查看状态
systemctl status redis
4)设置 Redis 开机自启
systemctl enable redis
补充: vi 编辑器搜索某个特定单词的方法为 : 命令模式输入
/单词拼写
+ enter 键,这样可以快速帮我们定位到要修改的那几个位置
2. Redis 常见命令
Redis 是一个键值型数据库,key 一般为 String 类型,value 的类型可以有很多,具体如下标所示:
类型 | 示例 |
String | hello wanqing |
Hash | {name: “婉晴”} |
List | {A ->B -> C } |
Set | {A, B, C} |
SortedSet | hello wanqing |
上面的五种是基本数据类型 | 下面的三种为特殊类型 |
GEO | {A:{120, 30} } |
BitMap | 010100101 |
HyperLog | 0101001010101 |
Redis 中文命令手册地址:https://www.redis.net.cn/order/
2.1 Redis 通用命令
KEYS
返回符合模板的 Key- 示例:查询所有的键 | 查询以 n 开头的键
注释: 这种模糊查询是效率非常低的,而且 Redis 是单线程的,容易造成阻塞 —— 主从模式,在从节点上可以用,主节点上不要用
DEL
删除指定的 key- 示例:删除指定 key, 返回删除的 个数
EXISTS
判断指定 key 是否存在- 示例:判断 name 这个 key 是否存在
EXPIRE
给 key 设置有效期 、TTL
查看剩余有效期
示例: 给 name 这个 key 设置有效期为 30 s ,通过 TTL 查询有效期
2.2 String 类型
2.2.1 基础概念
String 类型是 Redis 中最简单的值,按照其格式不同,又分为:
- string
- int
- float
这三种类型底层都用字符数组进行存储,但是数字类型的在存储时底层编码不同,其会转成二进制去存储,更节省空间。字符串类型最大空间不能超过 512 m 。
2.2.2 操作命令
SET
存GET
取MSET
批量新增MGET
批量获取INCR
自增INCRBY
定义自增值INCRBYFLOAT
为浮点数做加法SERNX
新增 —— 含有就不增,不会替换SETEX
添加 key 并设置有效期
扩展: 如果 Value 是一个对象,我们可以将 对象 序列化为 json 字符串进行存储,示例如下:
'{"id":1, "name":"小米11优惠券", "price": 100}'
2.3 Hash 类型
2.3.1 基础概念
当我们要存储对象时,将对象序列化为 json 字符串存储很不方便,同时也很难对某个字段单一修改。因此,我们要有 Hash 类型,用 Hash 中的多个键值对的集合表示对象,如下图所示:
2.3.2 操作命令
HSET
: 设置值HGET
: 获取值MSET
:批量设置值MGET
: 批量获取值HGETALL
:得到所有的键值对HKEYS
: 获取指定 key 的所有 fieldHVALUE
: 获取指定key的所有 field 的所有 valueHINCRBY
: 让一个 hash 类型的指定 key 的 指定 field 的 value 自增并指定步长HSETNX
: 新增字段,若该值已经存在不替换
2.4 List 类型
2.4.1 基础概念
和 Java 中的 LinkedList 类似, List 类型可以看作双向链表结构,支持正向逆向检索。具有下列特点:
- 插入快
- 查询速度一般
- 有序
- 元素可以重复
其使用场景为: 保存对顺序有要求的数据,如 点赞、评论 等按照时间顺序展示的数据
2.4.2 操作命令
-
LPUSH
: 从左侧插入 -
LPOP
: 从左侧取出 RPUSH
: 从右侧插入
4.RPOP
: 从右侧取出5.LRANGE KEY STAR END
: 取出一定范围的数据
6.BLPOP BRPOP
: 在取元素时,若没有指定元素,等待指定时间,不是直接返回 nil —— 阻塞式获取
利用 List 结构模拟栈、队列、阻塞队列
1) List 模拟栈 —— 先进先出 —— 入口出口在一起
2) List 模拟队列 —— 先进后出 —— 入口出口不在一起
3)阻塞队列 —— 队列:入口出口不同 + BLPOP / BRPOP
2.5 Set 类型
2.5.1 基础概念
Redis 中 Set 结构与 Java 中 HashSet 类似,其具有 HashSet 的特点:
- 无序
- 元素不可重复
- 查找快
- 支持交集、并集、差集 等—— 与 HashSet 不同的
2.5.2 操作命令
SADD
: 添加一个或多个元素SREM
: 移除指定元素SCARD
: 返回 set 中元素个数SISMEMBER KEY MEMBER
: 判断某个成员是否存在MEMBERS
: 返回所有成员SINTER key1 key2
: 返回两个集合的交集SDIFF key1 key2
: 返回两个集合的差集SUNION key1 key2
: 返回两个集合的并集
2.6 SortedSet 类型
2.6.1 基础概念
Redis 中的 SortedSet 是一个可排序的 set 集合,与 Java 中的 TreeSet 有点类似,但是底层数据结构差别很大。SortedSet 中的每个元素都带有一个 score 属性,可以基于 score 属性对元素排序,它的底层实现是一个跳表 ( SkipList )加 hash 表。其具有以下特性:
- 可排序
- 元素不可以重复
- 查询速度快
常用场景: 常用来实现 排行榜 功能
2.6.2 操作命令
ZADD
: 添加元素到指定 key 的 SortedSetZREM
: 删除元素ZSCORE
: 统计指定元素的分数值ZRANK
: 得到某个元素按 score 排序的排名 ( 默认从 0 开始 )ZCARD
: 得到指定集合中元素个数ZCOUNT KEY MIN MAX
: 得到指定范围的元素个数ZINCRBY
: 对某个元素按指定值自增ZRANGE KEY MIN MAX
: 得到某个范围内的元素值ZRANGEBYSCORE KET MIN MAX
: 获取按照 score 排序后,指定 score 范围的元素ZDIFF ZINTER ZUNION
: 交集 并集 差集操作
其默认排序为升序,在对所有命令 Z 后加 REV 就变为降序查询,示例如下: