一、基本概念

Redis:Remote Dictionary server 远程词典(键值对形式)服务器。是一种 NoSQL 数据库。

和 SQL 比较

342.jpg

Redis 特点

343.jpg

数据类型

Redis 的 Key 都是字符串类型,Value 则支持五种基本类型和其他类型。

基本类型:string(字符串),hash(哈希),list(列表),set(集合)、sorted set(有序集合)

一个 Key 的 Value 只能有一个数据类型。

Redis 安装

1. 安装 GCC 依赖

Redis 使用 C 语言编写,所以需要安装其代码所依赖的 GCC 编译器。

1
yum install -y gcc tcl

2. 下载 Redis 解压

我们将目录定位到 usr/local/src 中,并下载解压

1
2
wget https://download.redis.io/releases/redis-6.2.7.tar.gz
tar -zxvf redis-6.2.7.tar.gz

3. 编译 Redis

1
2
cd redis-6.2.7
make && make install

编译完成之后,会在 /usr/local/bin 中出现编译结果,这个目录 /usr/local/bin 已经被添加到了默认的环境变量中,任意地方都可以运行里面的结果。

redis-cli Redis 命令执行客户端启动脚本

redis-server Redis 服务端启动脚本

redis-sentinel Redis 哨兵启动脚本

二、Redis 控制

1. 启动

前台启动

在任意地方输入 redis-server 即可前台启动 Redis,此时无法退出,只能看着监控面板

1
redis-server

344.jpg

后台启动

如果要让 Redis以 后台 方式启动,则必须修改 Redis 配置文件,就在我们之前解压的 Redis 安装包下( /usr/local/src/redis-6.2.6 ),名字叫 Redis.conf:

345.jpg

我们先将这个配置文件备份一份:

1
cp redis.conf redis.conf.bck

然后修改 redis.conf 文件中的一些配置:

1
2
3
4
5
6
# 允许访问的地址,默认是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 的其它常见配置:

1
2
3
4
5
6
7
8
9
10
# 监听的端口
port 6379
# 工作目录,默认是当前目录,也就是运行redis-server时的命令,日志、持久化等文件会保存在这个目录
dir .
# 数据库数量,设置为1,代表只使用1个库,默认有16个库,编号0~15
databases 1
# 设置redis能够使用的最大内存
maxmemory 512mb
# 日志文件,默认为空,不记录日志,可以指定日志文件名
logfile "redis.log"

启动 Redis:

1
2
3
4
# 进入redis安装目录,作为启动 redis 的工作目录 
cd /usr/local/src/redis-6.2.6
# 启动
redis-server redis.conf

停止服务:

1
2
3
# 利用redis-cli来执行 shutdown 命令,即可停止 Redis 服务,
# 因为之前配置了密码,因此需要通过 -u 来指定密码
redis-cli -u 123321 shutdown

后台开机自启

我们也可以通过配置来实现开机自启。

首先,新建一个系统服务文件:

1
vi /etc/systemd/system/redis.service

内容如下:

1
2
3
4
5
6
7
8
9
10
11
[Unit]
Description=redis-server
After=network.target

[Service]
Type=forking
ExecStart=/usr/local/bin/redis-server /usr/local/src/redis-6.2.7/redis.conf
PrivateTmp=true

[Install]
WantedBy=multi-user.target

然后重载系统服务:

1
systemctl daemon-reload

现在,我们可以用下面这组命令来操作redis了:

1
2
3
4
5
6
7
8
# 启动
systemctl start redis
# 停止
systemctl stop redis
# 重启
systemctl restart redis
# 查看状态
systemctl status redis

执行下面的命令,可以让 redis 开机自启:

1
systemctl enable redis

2. 链接 Redis

命令行客户端

Redis安装完成后就自带了命令行客户端:redis-cli,使用方式如下:

1
redis-cli [options]

其中常见的options有:

  • -h 127.0.0.1:指定要连接的redis节点的IP地址,默认是127.0.0.1
  • -p 6379:指定要连接的redis节点的端口,默认是6379
  • -a xxxxxx:指定redis的访问密码

推荐先进行 redis 链接,不输入密码。链接成功之后

1
auth [username] password

来验证账号密码(没有用户名可以不填)

图形化客户端

在这里下载:https://github.com/lework/RedisDesktopManager-Windows/releases

然后链接就可以使用了

三、Redis 命令

推荐在官方的文档里面去学习 Redis 的命令:https://redis.io/commands/

也可以在 Redis 命令行中使用 help [command] 来查看命令用法.

346.jpg

1. 通用命令

347.jpg

Expire /ɪkˈspaɪər/ 到期死亡,设置的 key 有效期是以秒计算。

TTL TimeToLive 生存时间,返回 key 有效期,-1 为永久有效,-2 表示不存在。

Key 的分类

为了规范 Key 的命名,一般采用 项目名:业务名:类型:id 的形式命名 Key,然后将数据对象序列化为 Json 字符串作为存储值。

KEY VALUE
xorex:blog:user:233 {“id”:233, “name”: “Xorex”, “age”: 21}
xorex:video:dance:123 {“id”:123, “name”: “newLand”, “time”: 4539}

用这样的形式分类,会被 RDM 自动分层处理。

348.jpg

2. String

类型信息

349.jpg

虽说三种调用的时候都是字符串,但是存储的时候格式不同,int 和 float 会使用对应的编码来增大存储范围。

操作命令

  • SET:添加或者修改已经存在的一个String类型的键值对
  • GET:根据key获取String类型的value
  • MSET:批量添加多个String类型的键值对(Multiple)
  • MGET:根据多个key获取多个String类型的value(Multiple)
  • INCR:让一个整型的key自增1(Increase)
  • INCRBY:让一个整型的key自增并指定步长,例如:incrby num 2 让num值自增2(可以通过它实现负增长)
  • INCRBYFLOAT:让一个浮点类型的数字自增并指定步长(浮点数没有默认自增长度)
  • SETNX:添加一个String类型的键值对,前提是这个key不存在,否则不执行 (SET if Not eXists)
  • SETEX:添加一个String类型的键值对,并且指定有效期 (Set+Expire)

3. Hash 类型

类型信息

对 Json 类的 String 进行的改进,Json 部分使用 Hash 存储,可以单独定位修改里面的某个元素。

350.jpg

操作命令

都是在一个 Key 下面,对不同的 field 进行 value 的修改。

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不存在,否则不执行

4. List 类型

类型信息

List 是有序的双向链表结构,插入删除快,查询速度慢。只能从左边或者右边插入,不支持插入中间。所以说是有序的,能保留插入顺序的数据结构。

操作命令

前缀 L 和 R 用来区分链表的 左边 和 右边,也就是 头 和 尾 。

List 的操作都是针对一个 Key,一个 Key 里面存着一个 List。

List的常见命令有:

  • LPush key element … :向列表左侧插入一个或多个元素
  • LPop key:移除并返回列表左侧的第一个元素,没有则返回nil
  • RPush key element … :向列表右侧插入一个或多个元素
  • RPop key:移除并返回列表右侧的第一个元素
  • LRange key star end:返回一段角标范围内的所有元素
  • BLPop 和 BRPop:与 LPOP 和RPOP 类似,只不过在没有元素时等待指定时间,而不是直接返回 nil(在等待过程中只是该操作进入阻塞状态,仍可以完成其他操作命令)

5. Set 类型

Redis 的 Set 结构与 Java 中的 HashSet 类似,满足以下特性:无序,元素不可重复,查找快,支持交集、并集、差集等功能。

常见命令:

  • SAdd key member … :向set中添加一个或多个元素
  • SRem key member … : 移除set中的指定元素
  • SCard key: 返回set中元素的个数
  • SIsNumber key member:判断一个元素是否存在于set中 isMember
  • SMembers:获取set中的所有元素 members
  • SInter key1 key2 … :求 key1 与 key2 的交集 inter
  • SDiff key1 key2 … :求key1与key2的差集
  • SUnion key1 key2 ..:求key1和key2的并集

6. SortedSet(ZSet) 类型

一个经过排序的 Set 集合(SortedSet 又名 ZSet),底层是通过跳表实现排序,Hash 实现唯一性。而排序是根据 score 属性的值进行排序的。

因为引入了排序功能,所以操作也多了关于位置和范围的操作:

  • ZAdd key score member:添加一个或多个元素到sorted set ,如果已经存在则更新其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:求差集、交集、并集