初始 Redis(认识Redis以及常见命令)

了解 Redis

Redis 是一种键值型的 Nosql 的数据库

其中的简键值型,是指 Redis 中存储的数据都是以 key、value 对的形式进行存储。而 value 的形式是多种多样的,可以是字符串、数值甚至是 json。

redis 的作者,叫 Salvatore Sanfilippo,来自意大利的西西里岛,目前供职于 Pivotal 公司。他使用的网名是 antirez。 目前,Vmware 在资助着 redis 项目的开发和维护。

认识 NoSQL

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

Redis 是诞生于 2009 年的,全称为 Remote Dictionary Server 远程词典服务器,是一个基于内存的键值型的 NoSQL 数据库。

特征

  1. 它是键值(key-value)型的,value 是支持多种不同的数据结构的,功能丰富。

  2. 单线程的,每个命令都是基本原子性的。

  3. 延迟低,速度快(它是基于内存,IO多路复用的,良好的编码)

  4. 支持数据的持久化

  5. 支持主从集群,分片集群

  6. 支持多语言的客户单。

安装 Redis

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-cli:是redis提供的命令行客户端
  • redis-server:是redis的服务端启动脚本
  • redis-sentinel:是redis的哨兵启动脚本

启动 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 常见命令

Redis 数据结构介绍以及通用命令

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
可以查看到不同的命令。

通用指令指的是部分数据类型的,都可以使用的指令,常见的有:

  • KEYS:查看符合模板的所有key
  • DEL:删除一个指定的key
  • EXISTS:判断key是否存在
  • EXPIRE:给一个key设置有效期,有效期到期时该key会被自动删除
  • TTL:查看一个KEY的剩余有效期

在 Redis 客户端里面可以调用 help[command] 就可以查看一个命令的具体用法

Key 结构

在 Redis 当中是没有类似 MySQL 中的 Table 的概念,所以在这我们就要尝试区分不同类型的 key。

例如,需要存储用户、商品信息到 redis,有一个用户id是1,有一个商品id恰好也是1,此时如果使用 id 作为 key 的话,那就发生了冲突,所在在这我们就要去合理的区分这些 id 的区别。

所以在这我们就可以通过给 key 添加前缀而加以对它们的区分,不过这个前缀也不是随便乱加的,要有一定的格式规范,

项目名:业务名:类型:id

当然这个格式并不是必须按这样的格式写的,这只是一种企业的规约格式,我们可以根据自己的需求来创建层级的,只不过在 Redis 当中,层级之间是用 冒号 进行分隔的。

这样以来,我们就可以把不同类型的数据区分开了。从而避免了key的冲突问题。

在客户端页面就可以看出这样的效果。
在这里插入图片描述

打开 Redis 客户端之后 就可以直接输入对 Redis 的命令就可以直接做出执行:
在这里插入图片描述

String 类型

String类型,也就是字符串类型,是Redis中最简单的存储类型。

其中 value 指的是字符串,不过根据字符串的格式不同,又可以分为3类:
● string:普通字符串
● int:整数类型,可以做自增、自减操作
● float:浮点类型,可以做自增、自减操作

不管是哪种格式,底层都是字节数组形式存储,只不过是编码方式不同。字符串类型的最大空间不能超过512m。

String 的常见命令:

  • SET:添加或者修改已经存在的一个String类型的键值对
  • GET:根据key获取String类型的value
  • MSET:批量添加多个String类型的键值对
  • MGET:根据多个key获取多个String类型的value
  • INCR:让一个整型的key自增1
  • INCRBY:让一个整型的key自增并指定步长,例如:incrby num 2 让num值自增2
  • INCRBYFLOAT:让一个浮点类型的数字自增并指定步长
  • SETNX:添加一个String类型的键值对,前提是这个key不存在,否则不执行
  • SETEX:添加一个String类型的键值对,并且指定有效期

Hash 类型

Hash 类型,也叫散列,其value是一个无序字典,类似于Java 中的 HashMap 结构。

String 结构是将对象序列化为 JSON 字符串后存储,当需要修改对象某个字段时很不方便
而 Hash 结构可以将对象中的每个字段独立存储,可以针对单个字段做CRUD:
在这里插入图片描述

Hash 的常见命令有

  • HSET key field value:添加或者修改hash类型key的field的值
  • HGET key field:获取一个hash类型key的field的值
  • HMSET:批量添加多个hash类型key的field的值
  • HMGET:批量获取多个hash类型key的field的值
  • HGETALL:获取一个hash类型的key中的所有的field和value
  • HKEYS:获取一个hash类型的 key 中的所有的 field
  • HVALS:获取一个hash类型的 key 中的所有的 value
  • HINCRBY:让一个hash类型key的字段值自增并指定步长
  • HSETNX:添加一个hash类型的key的field值,前提是这个field不存在,否则不执行

List 类型

Redis中的List类型与Java中的LinkedList类似,可以看做是一个双向链表结构。既可以支持正向检索和也可以支持反向检索。它的特征与 LinkedList 的结构也是类似的。
(有序、元素可以重复、插入和删除快、查询速度一般)
常常用这个结构来存储一些有序数据,例如:朋友群的点赞、评论表等。

List的常见命令有

  • LPUSH key element … :向列表左侧插入一个或多个元素(就是前面)
  • LPOP key:移除并返回列表左侧的第一个元素,没有则返回nil
  • RPUSH key element … :向列表右侧插入一个或多个元素(就是后面)
  • RPOP key:移除并返回列表右侧的第一个元素
  • LRANGE key star end:返回一段角标范围内的所有元素
  • BLPOP和BRPOP:与LPOP和RPOP类似,只不过在没有元素时等待指定时间,而不是直接返回nil

Set 类型

Redis的Set 结构与 Java 中的 HashSet 类似,可以看做是一个value 为 null的 HashMap。因为也是一个 hash 表,因此具备与 HashSet 类似的特征:
(无序、元素不可重复、查找快、支持交集、并集、差集等功能)。

Set的常见命令有

  • SADD key member … :向set中添加一个或多个元素
  • SREM key member … : 移除set中的指定元素
  • SCARD key: 返回 set 中元素的个数
  • SISMEMBER key member:判断一个元素是否存在于set中
  • SMEMBERS:获取set中的所有元素
  • SINTER key1 key2 … :求 key1 与 key2 的交集
  • SDIFF key1 key2 … :求 key1 与 key2 的差集(就是就求补充集)
  • SUNION key1 key2 …:求 key1和 key2 的并集

看图说明交集、差集、并集的区别
在这里插入图片描述

S1 和 S2 的交集: B、C
S1 和 S2 的差集:A
S1 和 S2 的并集: A、B、C、D

SortedSet 类型

Redis的SortedSet 是一个可排序的 set 集合,与 Java 中的 TreeSet 有些类似,但底层数据结构却差别很大。SortedSet 中的每一个元素都带有一个 score 属性,可以基于 score 属性对元素排序,底层的实现是一个跳表(SkipList)加 hash 表。

SortedSet具备下列特性:可排序、元素不重复、查询速度快

因为SortedSet的可排序特性,经常被用来实现排行榜这样的功能。

SortedSet的常见命令有

  • ZADD key score member:添加一个或多个元素到sorted set ,如果已经存在则更新其 score 值。(score的值就可以理解为分数,对这个进行排名)
  • ZREM key member:删除sorted set中的一个指定元素
  • ZSCORE key member : 获取sorted set中的指定元素的score值
  • ZRANK key member:获取sorted set 中的指定元素的排名
  • ZCARD key:获取sorted set中的元素个数
  • ZCOUNT key min max:统计score值在给定范围内的所有元素的个数
  • ZINCRBY key increment member:让sorted set中的指定元素自增,步长为指定的increment值
  • ZRANGE key min max:按照score排序后,获取指定排名范围内的元素
  • ZRANGEBYSCORE key min max:按照score排序后,获取指定score范围内的元素
  • ZDIFF、ZINTER、ZUNION:求差集、交集、并集

注意:所有的排名默认都是升序,如果要降序则在命令的 Z 后面添加 REV 即可

通过客户端页面进行查看,也会发现它存储的形式和 Hash 形式也是比较类似的。
在这里插入图片描述


好了,这篇博客就先大概介绍到这里来了,如有什么问题,期望大家在评论区积极提问、讨论,下篇,介绍 Redis 的 Java 客户端。

猜你喜欢

转载自blog.csdn.net/weixin_45970271/article/details/125793452