Redis 是一种键值型的 Nosql 的数据库
其中的简键值型,是指 Redis 中存储的数据都是以 key、value 对的形式进行存储。而 value 的形式是多种多样的,可以是字符串、数值甚至是 json。
redis 的作者,叫 Salvatore Sanfilippo,来自意大利的西西里岛,目前供职于 Pivotal 公司。他使用的网名是 antirez。 目前,Vmware 在资助着 redis 项目的开发和维护。
NoSQL 可以翻译成 Not Only SQL (不仅仅是SQL),或者是 No SQL(非SQL)的数据库,是相对于传统关系型数据库而言的,有着很大的差异的一种特殊的数据库,英因此也称为非关系型数据库。
1. 结构化和非机构化
在传统的关系型数据库当中是结构化数据的,每一种表都有着严格的约束信息:字段名、字段数据类型、字段约束等等信息,插入的数据是必须遵守这些约定的。
而 NoSQL 型的数据库结构是没有严格的约束,往往形式松散,自由。可以是:键值型、文档型、图格型。
2. 关系和非关联
传统的数据库的表与表之间往往是存在关系的,例如外键。
而非关系型数据库是不存在关联关系的,要维护关系要么靠代码中的业务逻辑,要么靠数据之间的耦合。
3. 查询方式
传统的关系数据库会基于 SQL 查询,语法有着统一的标准。
而不同的非关系型数据库查询语法差异较大,五花八门,各式各样的。
4. 事务
传统的关系型数据库是能满足书屋 ACID 的原则。
而非关系型数据库往往是不支持事务的,或者不能够保证 ACID 的特性,只能实现基本的一致性。
除了这些以外,两者在存储方式、扩展性、查询性能上也都有着显著的差异。
SQL | NoSQL | |
---|---|---|
数据结构 | 结构化(Structured) | 非结构化 |
数据关联 | 关联的(Relational) | 无关联的 |
查询方式 | SQL 查询 | 非 SQL |
事务特性 | ACID | BASE |
存储方式 | 磁盘 | 内存 |
扩展性 | 垂直 | 水平 |
使用场景 | 1. 数据结构固定 2.相关业务对数据的安全性、一致性要求较高 | 1.数据结构不固定 2.对一致性、安全性要求不高 3.对性能的要求 |
存储方式:
关系型数据库是基于磁盘进行存储的,会有大量的磁盘 IO 对性能有着一定的影响。
非关系型数据库,他们的操作更多的是依赖于内存来进行操作的,内存的读写速度是非常快的,性能自然更优一点的。
扩展性:
关系型数据库集群模式一般是主从、主从数据一致,起到一个数据备份的作用,称为垂直扩展。
非关系型数据库考科一将数据拆分、存储在不同的机器上面。达到可以保存海量数据的作用。解决内存大小有限的问题。就将这种模式称为水平扩展。
关系型数据库因为表与表之间的关系,如果做出水平扩展会给数据查询带来很多的麻烦。
Redis 是诞生于 2009 年的,全称为 Remote Dictionary Server 远程词典服务器,是一个基于内存的键值型的 NoSQL 数据库。
特征:
它是键值(key-value)型的,value 是支持多种不同的数据结构的,功能丰富。
单线程的,每个命令都是基本原子性的。
延迟低,速度快(它是基于内存,IO多路复用的,良好的编码)
支持数据的持久化
支持主从集群,分片集群
支持多语言的客户单。
Redis 官方是并没有提供 Windows 版本的安装包。因此在这我吗就基于Linux 系统来安装 Redis。
我采用的是以虚拟机来实现的,也可以使用云服务器的。
首先在 Redis 官网上下载 Redis 的安装包。
然后我们将安装包放到 linux 系统中的某一个合适的路径下。
先解压缩:
tar -xzf redis-6.2.6.tar.gz
然后进入解压后的 redis 目录中,并且执行编译指令:
cd redis-6.2.6
make && make install
建议将其安装到 如下的路径中,应为因为这样就直接配置好了环境变量的了。
/usr/local/bin
接下来,我们先认识一下其中里面几个比较重要的文件:
启动 Redis
进入 Redis 下的 bin 目录执行
./redis-server redis.conf
就可以启动 Reids了
打开 Redis 客户端
./redis-cli
输入密码
auth 密码
ctrl+c 退出客户端模式
如果要让Redis以后台
方式启动,则必须修改Redis配置文件,在当前目录下,找到打开 redis.conf 包,然后对其中的一些参数进行修改。
# 允许访问的地址,默认是127.0.0.1,会导致只能在本地访问。修改为0.0.0.0则可以在任意IP访问,生产环境不要设置为0.0.0.0
bind 0.0.0.0
# 守护进程,修改为yes后即可后台运行
daemonize yes
# 密码,设置后访问Redis必须输入密码
requirepass 123321
Redis 的其它常见配置:
# 监听的端口
port 6379
# 工作目录,默认是当前目录,也就是运行redis-server时的命令,日志、持久化等文件会保存在这个目录
dir .
# 数据库数量,设置为1,代表只使用1个库,默认有16个库,编号0~15
databases 1
# 设置redis能够使用的最大内存
maxmemory 512mb
# 日志文件,默认为空,不记录日志,可以指定日志文件名
logfile "redis.log"
首先,新建一个系统服务文件:
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
PrivateTmp=true
[Install]
WantedBy=multi-user.target
然后重载系统服务:
systemctl daemon-reload
现在,我们可以用下面这组命令来操作redis了:
# 启动
systemctl start redis
# 停止
systemctl stop redis
# 重启
systemctl restart redis
# 查看状态
systemctl status redis
执行下面的命令,可以让redis开机自启:
systemctl enable redis
GitHub上的大神编写了Redis的图形化桌面客户端,地址: https://github.com/uglide/RedisDesktopManager
不过该仓库提供的是RedisDesktopManager的源码,并未提供windows安装包。
在下面这个仓库可以找到安装包:
https://github.com/lework/RedisDesktopManager-Windows/releases
Redis 是一个 key-value 的数据库,key 一般是字符串,而value 包含有很多不同的数据类型
数据结构 | ||
---|---|---|
基本类型 | String | Hello World |
Hash | {name: "Tom" , age: 18} | |
List | [A -> B -> C -> D] | |
Set | {A , B, C} | |
SortedSet | {A: 1 , B: 2 , C: 3} | |
特殊类型 | GEO | {A: (120.3 , 30.5)} |
BitMap | 0110110101110101011 | |
HyperLog | 0110110101110101011 |
Redis 为了方便我们学习,将操作不同数据类型的命令也做了分组,在官网
https://redis.io/commands
可以查看到不同的命令。
通用指令指的是部分数据类型的,都可以使用的指令,常见的有:
在 Redis 客户端里面可以调用 help[command] 就可以查看一个命令的具体用法
在 Redis 当中是没有类似 MySQL 中的 Table 的概念,所以在这我们就要尝试区分不同类型的 key。
例如,需要存储用户、商品信息到 redis,有一个用户id是1,有一个商品id恰好也是1,此时如果使用 id 作为 key 的话,那就发生了冲突,所在在这我们就要去合理的区分这些 id 的区别。
所以在这我们就可以通过给 key 添加前缀而加以对它们的区分,不过这个前缀也不是随便乱加的,要有一定的格式规范,
项目名:业务名:类型:id
当然这个格式并不是必须按这样的格式写的,这只是一种企业的规约格式,我们可以根据自己的需求来创建层级的,只不过在 Redis 当中,层级之间是用 冒号 进行分隔的。
这样以来,我们就可以把不同类型的数据区分开了。从而避免了key的冲突问题。
打开 Redis 客户端之后 就可以直接输入对 Redis 的命令就可以直接做出执行:
String类型,也就是字符串类型,是Redis中最简单的存储类型。
其中 value 指的是字符串,不过根据字符串的格式不同,又可以分为3类:
● string:普通字符串
● int:整数类型,可以做自增、自减操作
● float:浮点类型,可以做自增、自减操作
不管是哪种格式,底层都是字节数组形式存储,只不过是编码方式不同。字符串类型的最大空间不能超过512m。
String 的常见命令:
Hash 类型,也叫散列,其value是一个无序字典,类似于Java 中的 HashMap 结构。
String 结构是将对象序列化为 JSON 字符串后存储,当需要修改对象某个字段时很不方便
而 Hash 结构可以将对象中的每个字段独立存储,可以针对单个字段做CRUD:
Hash 的常见命令有:
Redis中的List类型与Java中的LinkedList类似,可以看做是一个双向链表结构。既可以支持正向检索和也可以支持反向检索。它的特征与 LinkedList 的结构也是类似的。
(有序、元素可以重复、插入和删除快、查询速度一般)
常常用这个结构来存储一些有序数据,例如:朋友群的点赞、评论表等。
List的常见命令有:
Redis的Set 结构与 Java 中的 HashSet 类似,可以看做是一个value 为 null的 HashMap。因为也是一个 hash 表,因此具备与 HashSet 类似的特征:
(无序、元素不可重复、查找快、支持交集、并集、差集等功能)。
Set的常见命令有:
S1 和 S2 的交集: B、C
S1 和 S2 的差集:A
S1 和 S2 的并集: A、B、C、D
Redis的SortedSet 是一个可排序的 set 集合,与 Java 中的 TreeSet 有些类似,但底层数据结构却差别很大。SortedSet 中的每一个元素都带有一个 score 属性,可以基于 score 属性对元素排序,底层的实现是一个跳表(SkipList)加 hash 表。
SortedSet具备下列特性:可排序、元素不重复、查询速度快
因为SortedSet的可排序特性,经常被用来实现排行榜这样的功能。
SortedSet的常见命令有:
注意:所有的排名默认都是升序,如果要降序则在命令的 Z 后面添加 REV 即可
通过客户端页面进行查看,也会发现它存储的形式和 Hash 形式也是比较类似的。
好了,这篇博客就先大概介绍到这里来了,如有什么问题,期望大家在评论区积极提问、讨论,下篇,介绍 Redis 的 Java 客户端。