本文主要介绍 Redis 基础,包括什么是 Redis 、Redis 数据结构有那些 以及 各种Redis 数据结构的常用操作命令

SQL
1) 结构化 -—— 例如 MySQL 中的表结构 (不建议修改,初始时就要设计好)
2) 关联的 —— MySQL 中的外键
3) SQL 查询 —— 查询语法是固定的
4)具有事务需求 —— 底层具有事务的实现,满足 ACID
5)磁盘存储
使用场景:数据结构固定;业务对数据安全性、一致性要求较高
NoSQL
1) 非结构化 —— 如 Redis 就是一种键值型数据库 ,除此之外还有文档型数据库(MongoDB)、列类型数据库(HBase)、图数据库( Neo4j — 常用于社交 app)等
2) 无关联 —— 想建立关联,要通过嵌套存储实现
3) 非 SQL —— 没有查询固定的语法格式

4) 不能满足事务需求 —— BASE
5) 内存存储
使用场景:数据结构不固定、对一致性、安全性要求不高、对性能要求高
Redis 全程 Remote Dictionary Server ,远程词典服务器,其是一个基于内存的键值型 NoSQL 数据库。它具有如下特点:
特点:
Redis 详细安装过程请见我这篇文章 : https://blog.csdn.net/liuwanqing233333/category_12100788.html?spm=1001.2014.3001.5482
这里补充几个部分:
bind 0.0.0.0
daemonize yes
logfile "redis.log"
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 键,这样可以快速帮我们定位到要修改的那几个位置
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/
KEYS 返回符合模板的 Key

示例:查询所有的键 | 查询以 n 开头的键

注释: 这种模糊查询是效率非常低的,而且 Redis 是单线程的,容易造成阻塞 —— 主从模式,在从节点上可以用,主节点上不要用
DEL 删除指定的 key

示例:删除指定 key, 返回删除的 个数

EXISTS 判断指定 key 是否存在

示例:判断 name 这个 key 是否存在

EXPIRE 给 key 设置有效期 、 TTL 查看剩余有效期

示例: 给 name 这个 key 设置有效期为 30 s ,通过 TTL 查询有效期

String 类型是 Redis 中最简单的值,按照其格式不同,又分为:
这三种类型底层都用字符数组进行存储,但是数字类型的在存储时底层编码不同,其会转成二进制去存储,更节省空间。字符串类型最大空间不能超过 512 m 。
SET 存
GET 取
MSET 批量新增
MGET 批量获取

INCR 自增

INCRBY 定义自增值

INCRBYFLOAT 为浮点数做加法


SERNX 新增 —— 含有就不增,不会替换

SETEX 添加 key 并设置有效期

扩展: 如果 Value 是一个对象,我们可以将 对象 序列化为 json 字符串进行存储,示例如下:
'{"id":1, "name":"小米11优惠券", "price": 100}'
当我们要存储对象时,将对象序列化为 json 字符串存储很不方便,同时也很难对某个字段单一修改。因此,我们要有 Hash 类型,用 Hash 中的多个键值对的集合表示对象,如下图所示:

HSET: 设置值

HGET: 获取值

MSET:批量设置值

MGET: 批量获取值

HGETALL:得到所有的键值对

HKEYS: 获取指定 key 的所有 field

HVALUE: 获取指定key的所有 field 的所有 value

HINCRBY: 让一个 hash 类型的指定 key 的 指定 field 的 value 自增并指定步长

HSETNX: 新增字段,若该值已经存在不替换

和 Java 中的 LinkedList 类似, List 类型可以看作双向链表结构,支持正向逆向检索。具有下列特点:
其使用场景为: 保存对顺序有要求的数据,如 点赞、评论 等按照时间顺序展示的数据
LPUSH : 从左侧插入LPOP : 从左侧取出RPUSH : 从右侧插入

RPOP : 从右侧取出
5. LRANGE KEY STAR END : 取出一定范围的数据BLPOP BRPOP : 在取元素时,若没有指定元素,等待指定时间,不是直接返回 nil —— 阻塞式获取
利用 List 结构模拟栈、队列、阻塞队列
1) List 模拟栈 —— 先进先出 —— 入口出口在一起
2) List 模拟队列 —— 先进后出 —— 入口出口不在一起
3)阻塞队列 —— 队列:入口出口不同 + BLPOP / BRPOP
Redis 中 Set 结构与 Java 中 HashSet 类似,其具有 HashSet 的特点:
SADD : 添加一个或多个元素

SREM : 移除指定元素

SCARD : 返回 set 中元素个数

SISMEMBER KEY MEMBER : 判断某个成员是否存在

MEMBERS : 返回所有成员

SINTER key1 key2: 返回两个集合的交集


SDIFF key1 key2 : 返回两个集合的差集

SUNION key1 key2 : 返回两个集合的并集

Redis 中的 SortedSet 是一个可排序的 set 集合,与 Java 中的 TreeSet 有点类似,但是底层数据结构差别很大。SortedSet 中的每个元素都带有一个 score 属性,可以基于 score 属性对元素排序,它的底层实现是一个跳表 ( SkipList )加 hash 表。其具有以下特性:
常用场景: 常用来实现 排行榜 功能
ZADD : 添加元素到指定 key 的 SortedSet


ZREM : 删除元素

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 就变为降序查询,示例如下:
