Redis丨学习记录

137 阅读10分钟

所用皆鹰腾,破敌过箭疾。

零、前言

本文是笔者从零开始学习Redis的学习记录。

若笔者有任何疏忽纰漏之处,烦请不吝赐教。


一、开门见山

源码:github.com/redis/redis

Redis是什么?

  • 基于内存的多模型数据库,毫秒级的延迟

  • Remote Dictionary Server

  • 是一个由Salvatore Sanfilippo写的key-value存储系统;

  • 跨平台的非关系型数据库

  • 是一个开源的使用 ANSI C 语言编写、遵守 BSD 协议、支持网络、可基于内存、分布式、可选持久性的键值对(Key-Value)存储数据库,并提供多种语言的 API。

Redis有什么特点?

  • Redis 通常被称为数据结构服务器,因为值可以是字符串、哈希、列表、集合和有序集合等类型。
  • Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。
  • Redis支持数据的备份,即master-slave模式的数据备份。

image.png

Redis的优势有哪些?

  • 性能极高
  • 丰富的数据类型,因此你不需要把它塞进一堆表或者JSON文档里
  • 原子 – Redis的所有操作都是原子性的,意思就是要么成功执行要么失败完全不执行。单个操作是原子性的。多个操作也支持事务,即原子性,通过MULTI和EXEC指令包起来。
  • 丰富的特性 – Redis还支持 publish/subscribe, 通知, key 过期等等特性。

Redis的其他补充?

  • 缓存也可以用于存储持久化数据
  • 传统的关系型数据库没办法做到快速把数据传递给终端用户
  • 数据总是会在内存上进行修改和读取,而不是在慢得多的硬盘上,但与此同时,它会把数据存储在硬盘上,这样就可以按需对数据进行重建,因此数据库是完全持久化的
  • Redis完全可以作为主数据库,并且可以显著地降低复杂度
  • 多模型——可以通过扩展模块来支持多种数据库范式,可以按需引用,如下图所示:

image.png


Redis如何安装?

  1. github.com/tporadowski…
  2. 在解压路径下打开cmd并输入redis-server.exe redis.windows.conf,你会看到如下图所示的样子:

image.png

  1. 添加环境变量,地址就是解压地址
  2. 保持上面这个cmd窗口不要关闭的情况下再开启一个cmd,运行redis-cli.exe -h 127.0.0.1 -p <your port num>(好像都是6379?),这里如果报错,你可能需要WIN+R开启cmd而不是用其他的方法

(Redis的配置暂略,有需要更改的话会再补充相关内容)


二、继续向前

Redis命令

可参考网站:

Redis 命令参考 — Redis 命令参考 (redisfans.com)

Commands | Redis

在端口启动的情况下,输入redis-cli即可进入redis客户端,输入PING输出PONG即证明成功启动。

Redis键

Redis键的基本命令:

Redis数据类型

string

特点:

  • 一个key对应一个value
  • string类型是二进制安全的,意思是 redis 的 string 可以包含任何数据例如jpg图片或者序列化的对象
  • string类型是 Redis 最基本的数据类型,string 类型的值最大能存储 512MB

demo:

image.png

string的基本命令:

hash

特点:

  • hash是一个键值对集合
  • hash是一个string类型的field和value的映射表,特别适合存储对象
  • 每个 hash 可以存储 2^32 -1 键值对

demo:

image.png

hash的基本命令:

list

特点:

  • Redis列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部L或者尾部R
  • 列表最多也可存储 2^32 - 1 元素

demo:

image.png

list的基本命令:

set

特点:

  • Redis 的 Set 是 string 类型的无序集合
  • set是通过哈希表实现的,所以R U D的复杂度都是 O(1)
  • 集合的唯一性
  • 集合中最大的成员数为 2^32 - 1

demo:

image.png 可以看到是唯一的且无序的

set的基本命令:

zset

特点:

  • 集合的唯一性
  • 有序集合
  • 每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。
  • zset的成员是唯一的,但分数(score)却可以重复。

demo:

image.png 可以看到是唯一的且有序的,但是score可以重复

zset的基本命令:


Redis-HyperLogLog

简介

Redis HyperLogLog 是用来做基数统计的算法,HyperLogLog 的优点是,在输入元素的数量或者体积非常非常大时,计算基数所需的空间总是固定的、并且是很小的。

但是,因为 HyperLogLog 只会根据输入元素来计算基数,而不会储存输入元素本身,所以 HyperLogLog 不能像集合那样,返回输入的各个元素。

Q:什么是基数?

A:基数就是集合内去重后元素的个数

Q:什么是基数估计?

A:基数估计就是在误差可接受的范围内,快速计算基数。

demo:

image.png

HyperLogLog的基本命令:

Num命令及描述
1[PFADD key element element ...] ——添加指定元素到 HyperLogLog 中。
2[PFCOUNT key key ...] ——返回给定 HyperLogLog 的基数估算值。
3[PFMERGE destkey sourcekey sourcekey ...] ——将多个 HyperLogLog 合并为一个 HyperLogLog

Redis-Pub/Sub-发布订阅

Redis 发布订阅 (pub/sub) 是一种消息通信模式:发送者 (pub) 发送消息,订阅者 (sub) 接收消息。

图解:(图源Runoob)

image.png

注意:如果需要测试,可能会需要开启多个redis-cli客户端

demo:

image.png 其中msg的命令是PUBLISH FallenChat "something"

发布订阅的基本命令:


Redis-Transaction-事务

Redis 事务可以一次执行多个命令, 并且带有以下三个重要的保证:

  • 批量操作在发送 EXEC 命令前被放入队列缓存
  • 收到 EXEC 命令后进入事务执行,事务中任意命令执行失败,其余的命令依然被执行。
  • 在事务执行过程,其他客户端提交的命令请求不会插入到事务执行命令序列中

一个事务从开始到执行会经历以下三个阶段

  • 开始事务
  • 命令入队
  • 执行事务

demo:

image.png

特别地:单个 Redis 命令的执行是原子性的,但 Redis 没有在事务上增加任何维持原子性的机制,所以 Redis 事务的执行并不是原子性的。

事务的基本命令:


Redis-Script-脚本

Redis 脚本使用Lua解释器来执行脚本。 Redis 2.6 版本通过内嵌支持 Lua 环境。

执行脚本的常用命令为 EVAL

Lua简介:

Q:Lua?

A:Lua 是一种轻量小巧的脚本语言,用标准C语言编写并以源代码形式开放, 其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能。

A:其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能。

Lua特性

  • 轻量级: 它用标准C语言编写并以源代码形式开放,编译后仅仅一百余K,可以很方便的嵌入别的程序里。
  • 可扩展: Lua提供了非常易于使用的扩展接口和机制:由宿主语言(通常是C或C++)提供这些功能,Lua可以使用它们,就像是本来就内置的功能一样。
  • 其它特性:
    • 支持面向过程(procedure-oriented)编程和函数式编程(functional programming);
    • 自动内存管理;只提供了一种通用类型的表(table),用它可以实现数组,哈希表,集合,对象;
    • 语言内置模式匹配;闭包(closure);函数也可以看做一个值;提供多线程(协同进程,并非操作系统所支持的线程)支持;
    • 通过闭包和table可以很方便地支持面向对象编程所需要的一些关键机制,比如数据抽象,虚函数,继承和重载等。

Lua应用场景

  • 游戏开发
  • 独立应用脚本
  • Web 应用脚本
  • 扩展和数据库插件如:MySQL Proxy 和 MySQL WorkBench
  • 安全系统,如入侵检测系统

回到Redis

demo:

image.png

脚本的基本命令:


Redis-Connection-连接

Redis 连接命令主要是用于连接 redis 服务

连接的基本命令:


Redis-Server-服务器

Redis 服务器命令主要是用于管理 redis 服务

输入INFO就可以查看,由于内容过多就不一一展示了,下面是一部分

demo:

image.png

服务器的基本命令:


Redis-GEO

Redis GEO 主要用于存储地理位置信息,并对存储的信息进行操作。(After V3.2)

Redis GEO 常用的操作方法:

  • geoadd:添加地理位置的坐标。
  • geopos:获取地理位置的坐标。
  • geodist:计算两个位置之间的距离。
  • georadius:根据用户给定的经纬度坐标来获取指定范围内的地理位置集合。
  • georadiusbymember:根据储存在位置集合里面的某个地点获取指定范围内的地理位置集合。
  • geohash:返回一个或多个位置对象的 geohash 值。

demo待补充


Redis-Stream

(After V5.0)

Redis Stream 主要用于消息队列(MQ,Message Queue),Redis 本身是有一个 Redis 发布订阅 (pub/sub) 来实现消息队列的功能,但它有个缺点就是消息无法持久化,如果出现网络断开、Redis 宕机等,消息就会被丢弃。

而 Redis Stream 提供了消息的持久化主备复制功能,可以让任何客户端访问任何时刻的数据,并且能记住每一个客户端的访问位置,还能保证消息不丢失。

结构示意图:

image.png

  • 有一个消息链表
  • 每个Stream都有唯一的名称,就是key,在首次使用 xadd 指令追加消息时自动创建。
  • Consumer Group :消费组,使用 XGROUP CREATE 命令创建,一个消费组有多个消费者(Consumer)。
  • last_delivered_id :游标,每个消费组会有个游标 last_delivered_id,任意一个消费者读取了消息都会使游标 last_delivered_id 往前移动。
  • pending_ids :消费者(Consumer)的状态变量,作用是维护消费者的未确认的 id。 pending_ids 记录了当前已经被客户端读取的消息,但是还没有 ack (Acknowledge character:确认字符)。

消息队列相关命令:

  • XADD - 添加消息到末尾
  • XTRIM - 对流进行修剪,限制长度
  • XDEL - 删除消息
  • XLEN - 获取流包含的元素数量,即消息长度
  • XRANGE - 获取消息列表,会自动过滤已经删除的消息
  • XREVRANGE - 反向获取消息列表,ID 从大到小
  • XREAD - 以阻塞或非阻塞方式获取消息列表

消费者组相关命令:

  • XGROUP CREATE - 创建消费者组
  • XREADGROUP GROUP - 读取消费者组中的消息
  • XACK - 将消息标记为"已处理"
  • XGROUP SETID - 为消费者组设置新的最后递送消息ID
  • XGROUP DELCONSUMER - 删除消费者
  • XGROUP DESTROY - 删除消费者组
  • XPENDING - 显示待处理消息的相关信息
  • XCLAIM - 转移消息的归属权
  • XINFO - 查看流和消费者组的相关信息;
  • XINFO GROUPS - 打印消费者组的信息;
  • XINFO STREAM - 打印流信息

demo待补充