【黑马程序员——Redis入门】

发布于:2024-04-20 ⋅ 阅读:(26) ⋅ 点赞:(0)

1. 初识Redis

1.1 认识NoSQL

NoSQL是指“不仅仅是SQL”(Not Only SQL)的缩写。它是一种数据库管理系统(DBMS)的范畴,用于存储和检索大量结构化或非结构化数据。与传统的关系型数据库管理系统(RDBMS)不同,NoSQL数据库通常采用非关系型的数据存储模型,如文档型、键值对、列族或图形等。

NoSQL数据库的设计旨在解决传统RDBMS在大规模分布式数据处理方面的一些限制,如扩展性、灵活性和性能。它们通常更适合用于处理半结构化或非结构化数据,以及需要高度并发性和水平扩展的场景。

NoSQL数据库的种类有很多,包括文档数据库(如MongoDB)、键值存储(如Redis)、列式存储(如Apache Cassandra)和图形数据库(如Neo4j)等。选择哪种类型的NoSQL数据库取决于应用的需求和数据模型。

1.2 认识Redis

Redis是一个开源的基于内存的数据结构存储系统,可以用作数据库、缓存和消息代理。它支持各种数据结构,包括字符串、哈希表、列表、集合、有序集合等,并提供了丰富的数据操作命令,使得开发者可以轻松地在内存中存储、检索和操作数据。

Redis特点:

  • 内存存储:Redis将数据存储在内存中,因此具有快速的读写速度。它可以通过持久化机制将数据写入磁盘,以保证数据的持久性。
  • 单线程,每个命令具备原子性
  • 丰富的数据结构:Redis支持多种数据结构,包括字符串、哈希表、列表、集合、有序集合等,每种数据结构都有对应的操作命令。
  • 持久化:Redis支持将数据持久化到磁盘,以便在重启后恢复数据。它提供了两种持久化方式:RDB(快照)和AOF(追加式文件)。
  • 高可用性:Redis支持主从复制和Sentinel(哨兵)机制,可以实现高可用性和自动故障转移。
  • 分布式:Redis Cluster是Redis提供的分布式解决方案,可以将数据分布到多个节点上,并实现数据的自动分片和负载均衡。
  • 丰富的功能:除了基本的数据存储和检索功能外,Redis还提供了订阅与发布、事务、Lua脚本执行等功能,可以满足各种复杂的应用场景需求。

1.3 安装Redis

# 下载源码
git clone --branch 6.2.6 --depth 1 https://github.com/redis/redis.git redis-6.2.6
# 进入目录
cd redis-6.2.6
# 编译
make && make install
# 检查是否成功
# 启动redis
redis-server
# 指定配置文件启动
redis-server redis.conf

1.4 后台启动

后台启动,需要修改配置文件/usr/local/src/redis-6.2.6/redis.conf

# 监听的地址,可以在任意IP访问。默认为127.0.0.1,会导致只能在本地访问,生产环境不要设置为0.0.0.0
bind 0.0.0.0
# 守护进程,修改为yes后即可后台运行
daemonize yes
# 密码,设置后访问redis必须输入密码
requirepass 123456
# 其他常见配置
# 监听的端口
port 6378
# 工作目录,默认是当前目录,也就是运行redis-server时的命令、日志、持久化等文件会保存在这个目录
dir .
# 数据库数量,设置为1,代表只使用1个库,默认有16个库,编号为0-15
databases 1
# 设置redis能够使用的最大内存
maxmemory 512mb
# 日志文件,默认为空,不记录日志,可以指定日志文件名
logfile ”redis.log“

如何停止kill -9 PID

1.5 如何实现开机自启

编写一个系统文件 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
# 设置开机自启
systemctl enable redis
# 开启redis
systemctl start redis
# 查看redis状态
systemctl status redis
# 停止redis
systemctl stop redis

2. Redis中常见命令

# 连接redis
redis-cli -h 127.0.0.1 -p 6379 -a 123456

2.1 常见5种数据结构

Redis 支持多种数据结构,以下是其中五种常见的数据结构:

  • 字符串 (String)
  • 哈希表 (Hash/Map)
  • 列表 (List)
  • 集合 (Set)
  • 有序集合 (Sorted Set)

2.2 通用命令

命令 作用 示例 示例作用
KEYS 查看符合模板的所有key,*表示通配符,?表示任意单个字符 KEYS a* 查看a开头的所有key
DEL 删除key,返回成功删除的多个,一次可以删除多个 DEL age 删除key为age的kv键值对
EXIST 判断KEY是否存在,返回存在的个数 EXIST age 查看是否存在age这个key
EXPIRE 设置key的有效期(秒),到期自动删除 EXPIRE name 20 设置name的有效期为20s
TTL 查看key的有效期。-1代表永久有效,-2代表过期了 TTL name 查看name的有效期

2.3 不同数据结构的操作命令

2.3.1 String类型

根据字符串的格式不同,又可以分为3类。底层都是采用字节数组形式存储,只不过编码方式不同。最大空间不能超过512m

  • string:普通字符串
  • int:整数类型,自增、自减
  • float:浮点类型,自增、自减

常见命令

  • SET
    • 添加或修改已经存在的一个String类型的键值对
  • GET
    • 根据key获取String类型的value
  • MSET
    • 批量添加多个String类型的键值对
  • MGET
    • 根据多个key获取多个String类型的value
  • INCR
    • 让一个整型的key自增1
  • INCRBY
    • 让一个整型的key自增按指定步长
  • INCRBYFLOAT
    • 让一个浮点型的key自增按指定步长
  • SETNX
    • 添加一个String的键值对,前提是这个key存在
  • SETEX
    • 添加一个String类型的键值对,并设置过期时间

2.3.2 Hash类型

Hash类型,也叫散列,其valye是一个无序字典,类似于Java中的HashMap。
String结构是将对象序列化为json字符串后存储,当需要修改对象某个字段时不方便。

常用命令:

  • HSET
    • 格式: HSET key field value
    • 功能: 设置或更新指定 key 下的 field 值为 value。如果 field 不存在,则创建;如果已存在,则覆盖其原有值。
    • 返回值: 如果 field 由于此操作被新建,则返回 1;如果 field 已存在且值被更新,则返回 0。
  • HGET
    • 格式: HGET key field
    • 功能: 获取指定 key 下 field 的值。
    • 返回值: 返回 field 的值,如果 field 不存在或 key 不存在,则返回 nil。
  • HMSET
    • 格式: HMSET key field value [field value …]
    • 功能: 一次性为指定 key 设置多个 field-value 对。所有指定的 field 都会被设置或更新其对应的 value。
    • 返回值: 总是返回 OK,表示操作成功。
  • HMGET
    • 格式: HMGET key field [field …]
    • 功能: 一次性获取指定 key 下多个 field 的值。
    • 返回值: 返回一个包含每个 field 值的列表,对应 field 不存在时返回 nil
  • MGETALL
    • 格式: HGETALL key
    • 功能: 返回指定 key 下的所有 field-value 对,以列表形式返回,列表中的元素按 field 和 value 成对出现。
    • 返回值: 返回一个包含所有 field-value 对的列表。
  • HKEYS
    • 格式: HKEYS key
    • 功能: 返回指定 key 下所有 field 的列表。
    • 返回值: 返回包含所有 field 名称的列表。
  • HVALS
    • 格式: HVALS key
    • 功能: 返回指定 key 下所有 field 对应的 value 的列表。
    • 返回值: 返回包含所有 value 的列表。
  • HINCRBY
    • 格式: HINCRBY key field increment 或 HINCRBYFLOAT key field increment
    • 功能: 为指定 key 下 field 的整数值(或浮点数值)增加指定的 increment。
    • 返回值: 返回操作后的 field 值。
  • HSETNX
    • 格式: HSETNX key field value
    • 功能: 只有当 field 在指定 key 下不存在时,才设置其值为 value。如果 field 已存在,则不执行任何操作。
    • 返回值: 如果 field 被设置(即之前不存在),则返回 1;如果 field 已存在且未执行设置操作,则返回 0。

2.3.3 List类型

Redis中的List类型与Java中的LinkedList类似,key看做是一个双向链表结构。

常用命令:

  • LPUSH:
    • 格式: LPUSH key value [value …]
    • 功能: 将一个或多个值 value 插入到指定 key 对应列表的头部(左侧)。
    • 返回值: 返回插入操作后列表的长度。
  • RPUSH:
    • 格式: RPUSH key value [value …]
    • 功能: 将一个或多个值 value 插入到指定 key 对应列表的尾部(右侧)。
    • 返回值: 返回插入操作后列表的长度。
  • LPOP:
    • 格式: LPOP key
    • 功能: 从指定 key 对应列表的头部移除并返回第一个元素。
    • 返回值: 返回被移除的元素,若列表为空,则返回 nil。
  • RPOP:
    • 格式: RPOP key
    • 功能: 从指定 key 对应列表的尾部移除并返回最后一个元素。
    • 返回值: 返回被移除的元素,若列表为空,则返回 nil。
  • LRANGE:
    • 格式: LRANGE key start stop
    • 功能: 返回指定 key 对应列表中从 start 索引开始到 stop 索引结束(包含两端索引)的子列表。
    • 返回值: 返回指定范围内的元素列表,按索引顺序排列。
  • BLPOP 和 BRPOP:
    • 格式: BLPOP key [key …] timeout 或 BRPOP key [key …] timeout
    • 功能: 从指定的一个或多个 key 对应列表的头部(BLPOP)或尾部(BRPOP)阻塞式地移除并返回一个元素。如果没有元素可取且设置了 timeout(秒),则阻塞等待指定时间,超时后返回 nil。
    • 返回值: 成功时返回一个包含两元素的列表,第一个元素是被操作的 key,第二个元素是被移除的元素;超时后返回 nil。

2.3.4 Set类型

Redis 的 Set(集合)类型是一种无序的、不允许重复元素的集合数据结构。它提供了丰富的操作,如添加成员、检查成员是否存在、删除成员、求交集、并集、差集等。

  • SADD:
    • 格式: SADD key member [member …]
    • 功能: 将一个或多个成员 member 添加到指定 key 对应的集合中。如果成员已存在,则不做任何操作。
    • 返回值: 返回实际添加到集合中的新成员数量(即原本不存在于集合中的成员数量)。
  • SREM:
    • 格式: SREM key member [member …]
    • 功能: 从指定 key 对应集合中移除一个或多个成员。如果成员不存在于集合中,则不做任何操作。
    • 返回值: 返回成功移除的成员数量
  • SCARD:
    • 格式: SCARD key
    • 功能: 返回指定 key 对应集合中元素(成员)的数量。
    • 返回值: 返回集合的元素数量,若 key 不存在或不对应集合,则返回 0。
  • SISMEMBER:
    • 格式: SISMEMBER key member
    • 功能: 检查指定 member 是否存在于指定 key 对应的集合中。
    • 返回值: 如果 member 存在于集合中,返回 1;否则返回 0。
  • SMEMBERS:
    • 格式: SMEMBERS key
    • 功能: 返回指定 key 对应集合中的所有成员。
    • 返回值: 返回包含集合所有成员的列表,按无序方式排列。
  • SINTER:
    • 返回所有给定集合之间的交集元素。
  • SDIFF:
    • 返回第一个集合与其他集合之间的差集元素。
  • SUNION:
    • 返回所有给定集合的并集元素。

在这里插入图片描述

# 张三的朋友集合
SADD zhangsan lisi wangwu zhaoliu
# 李四的朋友集合
SADD lisi wangwu mazhi ergou
# 查看张三的朋友集合大小
SCARD zhangsan
# 求交集
SINTER zhangsan lisi
# 求差集
SDIFF zhangsan lisi
# 求并集
SUNION zhangsan lisi
# 判断lisi是否在zhangsan的集合内
SISMEMBER zhangsan lisi
# 判断zhangsan是否在lisi的集合内
SISMEMBER lisi zhangsan
# 从zhangsan朋友圈内移除lisi
SREM zhangsan lisi

2.3.5 SortedSet类型

Redis 的 Sorted Set(有序集合)类型是一种特殊的集合数据结构,它结合了 Set(无重复元素)和排序(每个元素关联一个分数)的特点。底层基于跳表+hash表

常见命令:

  • ZADD key score member
    • 添加一个或多个元素到sorted set,如果已经存在则更新其score值
  • ZREM key member
    • 删除sorted set中的一个指定元素
  • ZSCORE key member
    • 获取sorted set 中指定元素的score值
  • ZRANK key member
    • 获取sorted set中指定元素的排名
  • ACARD 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:求差集、交集、并集
    在这里插入图片描述
# 添加元素到集合中
ZADD stus 85 Jack 89 Lucy 82 Rose 95 Tom 78 Jeery 92 Amy 76 Miles
# 从集合stus删除Tom
ZREM stus Tom
# 查看Amy的分数
ZSCORE stus Amy
# 查看Rose的排名
ZRANK stus Rose
# 查找分数在80分以下的学生的数量
ZCOUNT stus 0 80
# 给Amy+2分
ZINCRBY stus 2 Amy
# 获取排名前三的同学
ZRANGE stus 0 2
# 获取分数小于80的同学
ZRANGEBYSCORE stus 0 80

2.4 key的层级结构

例子:

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