【数据库】非关系型数据库——Redis(基础)

一、什么是 Redis

        Redis 存储数据的格式都为 key-value 键值对的形式,将数据存储在内存中,以提高快速的读写访问速度,性能高。而在存储对象时,一般不会将其属性拆分为一个一个的键值对去存储,而是将其中的字段组合为一个 json 字符串去存储。

        其结构与普通的 MySQL 关系型数据库有很大的差异,所以被称为 NoSql 数据库(非关系型数据库)。其中还有很多不同结构的如:文档类型(MongoDB)、列类型(HBase)、图(Graph)类型(Neo4j)等。

SQL:

  • 结构化:对于表内的字段进行约束,如非空,长度约束等等。
  • 关联的:表与表之间可以通过外键建立关系。可以减少重复从而存储空间。
  • SQL 查询:查询语句的语法是固定的,不同种类的关系型数据库的语法一致。
  • 事务:所有的关系型数据库都满足 ACID 特性。

NoSQL:

  • 非结构化:对于 key value 的约束较小,字段约束松散。
  • 非关联的:通过 json 文档嵌套的方式实现数据的关联,没有表与表之间的外键关系,所以是非关联的。但数据可能重复。
  • 非SQL:查询的语法相对简单,但是各种数据库的语法不同,需要反复学习。
  • 无事务:无法满足事务的强一致性或只能基本一致,无法全部满足,基本满足(BASE)。

        Redis 的特征:键值型支持多种不同的数据结构;单线程,每个命令都具备原子性;存储在内存中,低延迟,速度快;支持数据持久化,定期将数据持久化到磁盘中;支持主从/分片集群;支持多语言客户端(Java、C 等)。

        启动成功 Redis 后,会显示此界面,这种默认的启动方式为前台启动,想要后台启动,就需要去修改 Redis 的配置文件来实现。

        在配置文件中,bind Redis 监听的地址,默认是 127.0.0.1,表示只能在本地访问,其他 IP 访问则会拒绝。修改成 0.0.0.0 则可以在任意 IP 下访问,在生成环境下不要这样设置。

bind 127.0.0.1

        守护进程,默认值为 no,更改成 yes 后即可后台运行。

daemonize no

        Redis 的密码,在设置之后访问 Redis 就需要输入密码。

requirepass 123456

        Redis 监听的端口号,默认为 6379

port 6379

        工作目录,默认是当前目录日志、持久化的等文件会保存在这个目录中。

dir ./

        数据库的数量,默认为 16 个,编号 0~15。

databases 16

        设置 Redis 能够使用的最大内存。

maxmemory <bytes>

        日志文件,默认为空,即不记录日志。但我们可以指定日志文件名。它会产生在工作目录中。

logfile ""

        操作 Redis 的三种客户端分别为命令行客户端、图形化界面客户端、编程客户端三种方式操作。

● 命令行客户端

        如在命令行客户端中,我们使用 AUTH 密码 进行登录后,可以 ping 通。

 ● 图形化界面客户端

        如我使用的下方的软件 Another Redis Desktop Manager 是一款开源的 Redis 可视化管理工具。


二、Redis 通用命令

2.1 数据结构

        Redis 是一个 key-value 型的数据库,key 一般为 String 类型,但是 value 有多种类型:String、Hash、List、Set、SortedSet、GED、BitMap、HyperLog。其各内容形式如下:

类型内容格式
StringHello World
Hash{name: "jack", age: 21}
List[ A -> B -> C -> C ]
Set{ A, B, C }
SortedSet{ A:1, B:2, C:3 }
GED{ A:(120.3, 30.5) }
BitMap0110110101110101011
HyperLog0110110101110101011

        其中比较常见的就是前五个类型,它们被称为基本类型,后三个被称为特殊类型。想要操作这些不同的数据类型,就要学习不同的操作语句。 

2.2 操作命令

● 通用命令

KEYS pattern

        查看符合模版的所有 key,其中的 pattren 为模版,可以为 * 查找所有;或 a*,查找以 a 为开头的。进行模糊匹配,但这样查询的效率很低,所以在生产环境下不建议使用 KEYS 进行查询。

DEL key [key ...]

        在 DEL 后可跟一个 key 来进行删除,也可指定多个 key 来进行删除,返回的数字表示删除的 key 的数量。

EXISTS key

        判断 key 是否存在。

EXPIRE key seconds

        给一个 key 设置有效期,到期时该 key 会被自动删除,seconds 单位为秒。为了解决内存使用过多的问题,节省内存的使用空间。

TTL key

        查看一个 key 的有效期,单位:

● String 类型操作

        String 类型是 Redis 中最简单的存储类型,但根据字符串格式的不同,又可以分为三类:

  • string:普通字符串。
  • int:整数类型,可以做自增、自减操作。
  • float:浮点类型,可以做自增、自减操作。

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

操作:

① SET key value

② MSET key value [key value ...]

① 添加或修改已经存在的一个 String 类型的键值对。修改就是将原有的键中的值覆盖掉。

② 批量添加多个 String 类型的键值。

③ GET key

④ MGET key [key ...]

根据 key 获取 String 类型的 value

根据多个 key 获取多个 String 类型的 value

⑤ INCR key

⑥ INCRBY key increment

⑦ INCRBYFLOAT key incremet

让一个整形key 自增 1

让一个整形key 自增并指定其步长,如 ... age 2,就是让 age 的值自增 2

让一个浮点类型的 key 自增并指定步长

⑧ SETNX key value  ==  SET key value NX

⑨ SETEX key seconds value

添加一个 String 类型的键值对,前提是该 key 不存在,否则不执行

添加一个 String 类型的键值对,并且指定其有效期

● Redis 中的层级结构

        在 Redis 中,并没有 MySQLTable 的概念,想要区分不同类型的 key,如用户的 ID 和商品的 ID,就需要我们规定层级结构来解决。如:

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

        之间使用 进行分隔。如果要存储一个对象,可以将其序列化为 JSON 字符串后进行存储。

        如执行此命令:set user:1 '{“id" : "1", "name" : "jack", "age": 21}' 后在图形化界面中会产生如下图所展示的效果:

● Hash 类型

        Hash 类型也被称为散列,其 value 是一个无序字典,类似于 Java 中的 HashMap 集合。因 String 结构存储对象序列化的 JSON 字符串是一个整体,想要修改其中单个的字段很不方便,所以就需要 Hash 结构,其将对象中的每个字段独立存储,可以针对单个字段进行操作。

操作:

① HSET key field value

② HMSET key field value [key field value ...]

① 添加或修改已经存在的一个 Hash 类型 key field 的值。

② 批量添加多个 Hash 类型 key field 的值。

③ HGET key field

④ HMGET key field [key field ...]

根据 key 获取 Hash 类型 key field 的值。

根据多个 key 获取多个 Hash 类型 key field 的值。

⑤ HGETALL key

⑥ HKEYS key

⑦ HVALS key

获取一个 hash 类型的 key 中的所有的 field value

 获取一个 hash 类型的 key 中的所有的 field

获取一个 hash 类型的 key 中的所有的 value

⑧ HINCRBY key field incremet

⑨SETNX key value  ==  SET key value NX

让一个 hash 类型 key 的字段的值自增(整型)指定步长

添加一个 hash 类型的 key field 的值,前提是该 field 不存在,否则不执行

● List 类型

        Redis 中的 List 类型与 Java 中的 LinkedList 集合类似,可以看做是一个双向链表结构,既支持正向检索也支持反向检索。有序、元素可重复、插入删除快、查询速度一般

        在保存一些对于顺序有要求的内容可以使用 List 类型来进行保存。

操作:

① LPUSH key element ...

② RPUSH key element ...

向列表的左侧插入一个或多个元素。

向列表的右侧插入一个或多个元素。

③ LPOP key

④ RPOP key

移除并返回列表左侧第一个元素,没有则返回 null

移除并返回列表右侧第一个元素,没有则返回 null

⑤ LRANGE key start stop

⑥ BLPOP/BRPOP key [key ...] timeout

返回一段下标范围内所有元素

⑥ 移除并返回列表左/右侧第一个元素,但在没有元素时等待指定时间,不是直接返回 null

● Set 类型

        Redis 中的 Set 结构与 Java 中的 HashSet 集合类似,可以看做是一个 value nullHashMap。具备与 HashSet 类似的特征。无序、元素不可重复、查找快、支持交集 并集 差集等功能

  • 单个集合操作:

① SADD key member ...

② SREM key member ...

Set 中添加一个或多个元素。

移除 Set 中的指定元素。

③ SCARD key

④ SISMEMBER key member

⑤ SMEMBERS key

返回 Set 中元素的数量。

判断一个元素是否存在 Set 中。

返回一段下标范围内所有元素

  • 多个集合操作:

① SINTER key1 key2 ...

② SDIFF key1 key2 ...

③ SUNION key1 key2 ...

key1 key2 交集,并输出。

key1 key2 差集,并输出。

key1 key2 并集,并输出。

● SortedSet 类型

        Redis 中的 SortedSet 结构是一个可排序的 Set 集合,与 Java 中的 TreeSet 集合类似,当底层数据结构存在差异。其中每一个元素都带有一个 score 属性,可以基于 score 对元素进行排序,底层由跳表 hash 表实现。可排序、元素不重复、查询速度快。 

  • 单个集合操作:

① ZADD key score member ...

② ZREM key member ...

添加一个或多个元素到 sorted set,如果已存在则更新其 score 值。

删除 sorted set 中的一个指定元素。

③ ZSCORE key member

④ ZRANK key member

⑤ ZCARD key

​​​​​​⑥ ZCOUNT key min max

⑦ ZINCRBY key increment

⑧ ZRANDE key min max

⑨ ZRANDEBYSCORE key min max

获取 sorted set 中的指定元素 score 的值。

获取 sorted set 中的指定元素的排名。

获取 sorted set 中的元素个数。

统计 score 值在给定范围内的所有元素的个数。

让 sorted set 中指定元素自增指定步长

按照 score 排序后,获取指定排名范围内的元素。

​​​​⑨ 按照 score 排序后,获取指定 score 范围内的元素

  • 多个集合操作:

① ZDIFF、ZINTER、ZUNION

① 求差集、交集、并集

注:所有的排名默认都是升序排序,想要降序排序,需要在命令的字母 Z 后跟 REV 即可。

如: ZREVRANDE key min max 


【完】

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值