自学数据库-redis


Redis 是一个高性能的非关系 键值对数据库,它因为运行在内存中,所以性能极高,也可以持久化到硬盘。缺点也很明显,即数据量不能大于硬件内存。

Redis 是单线程+异步I/O(多路I/O复用)的,能够提供高速缓存、实时排行榜、消息队列、投票点赞等服务。

现如今绝大多数的网站都使用 Redis 进行高速缓存。
Redis中文网
Redis官网
Redis参考文档
Redis命令手册

准备使用 Redis

基于 linux

使用包管理器安装

linux 可以使用包管理工具进行安装(一般版本会低一些)

如果需要运行一个最小化的分发版本,需要使用 lsb_release:

apt install lsb-release

然后可以直接安装 redis

apt install redis-server

Redis 源码的下载和安装

从官网下载源码进行安装。

redis官网最新版本源码包

在 linux 下使用 wget 命令下载此源码包

wget https://download.redis.io/redis-stable.tar.gz

下载之后是 gz 文件,使用 gunzip 解压此文件

gunzip redis-stable.tar.gz

解压完成后是 tar 的归档文件,可以使用 tar -xvf 进行解归档

tar -xvf redis-stable.tar

解归档后,会产生一个文件夹,名称就是归档文件名。进入此文件夹(所有的源代码在 src 文件夹下),会发现有 Makefile ,可以使用此文件来构建可执行程序并进行安装。此过程如果报错,就说明缺少支持软件包,可以使用包管理工具进行安装。

make && make install

安装完成后,有3个比较重要的程序,可以使用 --version 来查看其版本。如果能看到版本就说名此程序安装好了。

  • redis-server : redis 的服务程序
  • redis-cli : redis 的客户端程序
  • redis-sentinel : redis 哨兵

至此 redis 安装完成。

redis 还有一些其他的工具,可以参考 windows 部分。

Redis 服务的运行

运行 redis-server 就可以启动 redis 的服务了,这样所有的配置是默认的,可以先测试一下。

运行后,会有服务运行界面,会提示一些信息,例如端口号、进程号之类的。

需要注意的是,这样运行此服务是在前台运行的,会占用交互环境,无法进行其他操作,只能使用 ctrl + c 停止。所以启动类似的服务时,尽量使用后台运行。

redis-server &

测试是否运行成功

可以运行 redis-cli,能够进入客户端,以默认配置登录 redis。此时输入 ping ,服务会返回 pong ,这说明数据库运行正常,且连接成功

Redis 的简单配置

在启动 redis 服务的时候,可以使用参数 --requirepass 来设置访问密码,并且可以将输出重定向到日志文件,以及端口号等参数

redis-server --port 6379 --bind 127.0.0.1 --requirepass 123456 > redis.log &

也可以使用配置文件来设置默认配置,使用 apt 安装时默认使用 /etc/redis/redis.conf,源码安装时则使用默认安装目录下的 redis.conf

bind 0.0.0.0
port 6379
requirepass root

因为 redis 登录时只验证密码,所以不需要用户名。设置完了重启服务就可以了。

使用配置登录

做了简单配置后,可以使用这些配置进行登录

redis-cli -h 127.0.0.1 -p 6379

-h 指定了登录 IP ,-p 指定了登录端口

登录上后 ping 会报错,因为没有验证。此时需要进行验证

auth root

验证后会提示 OK,然后 ping 就能返回 pong 了,可以正常使用了。

关闭服务

  • 使用 kill 杀掉服务进程
  • 使用 jobs 、fg 命令转为前台,并只用 ctrl + c 终止服务
  • 使用客户端的 shutdown 命令关闭服务,并可以添加参数 save 保存数据

开机运行

如果是使用源码安装,需要创建文件 /etc/systemd/system/redis-server.service。如果使用包管理器安装,则配置文件在 /usr/lib/systemd/system/redis-server.service。包管理器的配置为:

[Unit]
Description=Advanced key-value store
After=network.target
Documentation=http://redis.io/documentation, man:redis-server(1)

[Service]
Type=notify
ExecStart=/usr/bin/redis-server /etc/redis/redis.conf --supervised systemd --daemonize no
PIDFile=/run/redis/redis-server.pid
TimeoutStopSec=0
Restart=always
User=redis
Group=redis
RuntimeDirectory=redis
RuntimeDirectoryMode=2755

UMask=007
PrivateTmp=yes
LimitNOFILE=65535
PrivateDevices=yes
ProtectHome=yes
ReadOnlyDirectories=/
ReadWritePaths=-/var/lib/redis
ReadWritePaths=-/var/log/redis
ReadWritePaths=-/var/run/redis

NoNewPrivileges=true
CapabilityBoundingSet=CAP_SETGID CAP_SETUID CAP_SYS_RESOURCE
MemoryDenyWriteExecute=true
ProtectKernelModules=true
ProtectKernelTunables=true
ProtectControlGroups=true
RestrictRealtime=true
RestrictNamespaces=true
RestrictAddressFamilies=AF_INET AF_INET6 AF_UNIX

# redis-server can write to its own config file when in cluster mode so we
# permit writing there by default. If you are not using this feature, it is
# recommended that you replace the following lines with "ProtectSystem=full".
ProtectSystem=true
ReadWriteDirectories=-/etc/redis

[Install]
WantedBy=multi-user.target
Alias=redis.service

自定义安装将 ExecStart项目改为安装路径的执行文件即可。完成后启用服务

systemctl daemon-reload
systemctl enable redis-server.service
systemctl start redis-server.service

基于 windows

Redis 的安装

Redis 官方推荐使用的是 linux 系统,所以只有源码,之后有些组织编译成了 windows 能直接使用的程序。所以系统如果是 linux 可以直接官网下载,如果是 windows 需要到 github 下一些组织编译后的程序。这里推荐 tporadowski 编译的redis

linux 编译后和 windows 版是一样的。有一些关键文件:

  • redis-server.exe : 数据库服务程序
  • redis-cli.exe : 数据库使用客户端
  • redis-check-rdb : 检查并恢复 rdb 格式的数据库文件的异常
  • redis-check-aof : 检查并恢复 aof 格式的数据库文件的异常
  • redis-benchmark.exe : 可以进行基准测试
  • redis.windows.conf : windows 可用的配置文件
  • redis.windows-service.conf : windows 安装版可用的配置文件 (安装版直接运行服务是无配置模式)

Redis 服务的运行

使用 redis-server.exe 就可以运行数据库服务,如不指定配置或配置文件,则是无配置模式,所有配置信息都是默认的。所以一般会指定使用的配置文件。

redis-server.exe redis.windows.conf

测试是否运行成功

可以使用默认客户端进行测试,直接执行 redis-cli.exe 就可以以默认配置登录 redis 。此时输入 ping ,服务会返回 pong ,这说明数据库运行正常,且连接成功。

Redis 的简单配置

可以通过编辑 redis.windows.conf 文件来进行简单的配置

bind 127.0.0.1		# 监听的 IP 地址,即必须以此地址进行登录
port 6379		# 监听的端口
requirepass password		# 登录密码,默认没有,启用需添加
maxmemory	<bytes>		# 设置最大缓存容量,默认没有,即不限制,启用需添加
dbfilename dump.rdb			# 设置RDB保存文件,默认是 dump.rdb
databases 16		# 设置数据库数量,默认是16个,使用 2 的次方数量
logfile ""		# 设置日志文件,默认空,即不写日志

# 设置数据保存条件,可以有多个保存条件,满足任意一个条件就会触发持久化保存。
# save 900 1 表示 900 秒内至少有 1 个键发生变化就进行持久化保存。
save 900 1			

rdbcompression yes		# 数据库文件是否进行压缩
rdbchecksum yes		# 写入文件和读取文件时是否开启 RDB 文件检查,检查是否有无损坏,如果在启动是检查发现损坏,则停止启动。
dir ./		# 设置RDB文件目录,默认为当前目录
appendonly no	# 是否开启 AOF 方式持久化保存,默认不开启
appendfilename "appendonly.aof"		# # AOF 默认文件名

# AOF 持久化策略配置
# appendfsync always
appendfsync everysec
# appendfsync no

# AOF 文件重写的大小比例,默认值是 100,表示 100%,也就是只有当前 AOF 文件,比最后一次的 AOF 文件大一倍时,才会启动 AOF 文件重写。
auto-aof-rewrite-percentage 100

# 允许 AOF 重写的最小文件容量
auto-aof-rewrite-min-size 64mb

# 是否开启启动时加载 AOF 文件效验,默认值是 yes,表示尽可能的加载 AOF 文件,忽略错误部分信息,并启动 Redis 服务。
# 如果值为 no,则表示,停止启动 Redis,用户必须手动修复 AOF 文件才能正常启动 Redis 服务。
aof-load-truncated yes

使用配置登录

做了简单配置后,可以使用这些配置进行登录

redis-cli.exe -h 127.0.0.1 -p 6379

-h 指定了登录 IP ,-p 指定了登录端口

登录上后 ping 会报错,因为没有验证。此时需要进行验证

auth password

验证后会提示 OK,然后 ping 就能返回 pong 了,可以正常使用了。

关闭服务

在客户端中数据 shutdown 可以关闭数据库服务,同时可以添加参数 save 保存数据库中的数据到硬盘

作为 windows service 使用

可以使用一些方法将 redis 服务作为 windows service 使用

# 安装服务,并加载配置文件
redis-server --service-install redis.windows.conf
# 启动服务
redis-server --serviec-start
# 关闭服务
redis-server --stop
# 卸载服务
redis-server --uninstall

需注意的是,windows 系统服务加载的配置文件默认是 redis.windows-service.conf,而不是 redis.windows.conf。如果修改过配置,则需要重启服务。

可视化工具

redis 可用的可视化工具有

数据库操作

切换数据库

Redis 的数据库是以编号形式存在的,默认拥有16个数据库,初始默认使用0号数据库。可以使用 select 命令切换数据库

select 8

保存数据(持久化)

因为 Redis 数据是在内存中的,所有操作硬盘中的数据库文件的操作称之为持久化。redis 配置中有保存策略,即多少秒内有多少次数据改变则进行持久化。但是如果没触发保存策略时,redis 服务程序意外终止了(例如断电)则会造成数据丢失。可以使用命令手动进行持久化

# 进行持久化保存,如果数据量大则会进行阻塞
save
# 后台持久化保存,会开启一个新线程进行持久化行为
bgsave

清空数据库

使用 flushdbflushall 可以清空数据库。区别在于 flushall 操作会清除所有数据库里的数据,且会执行持久化操作,即从硬盘的数据库文件中删除数据;而 flushdb 只是清空当前数据库的数据,且是内存中的数据,不执行持久化操作,如果重启服务后又会加载数据库文件里的数据。

数据操作

因为 Redis 是基于 key-value 的数据库,所以存取也是使用键值对的形式。

redis 的数据类型

redis 常用的数据类型有字符串(string)哈希表(hash)列表(list)集合(set)有序集合(zset)

可以使用 type 命令查看键的数据类型

type key

需要注意的是,每种数据类型其实都是二进制字符串的特殊存储形式,即存储元素都是字符串(或字符串型数值),所以并不能进行类型嵌套。例如哈希表中的某个值为列表,或列表的某个元素是集合。另外因为是二进制字符串,中文也是不能直接显示的。

通用操作

redis 是基于 key-value 的数据库,无论其数据类型如何,有些操作命令是通用的,例如对键的操作

# keys 命令可以列出所有符合条件的存在的 key
# 查询所有
keys *
# 使用通配符 ? * 进行匹配
keys n?me
keys n*e
# 匹配特定字符集中的字符
keys n[ace]me

# 判断 key 是否存在,如果存在返回1,否则返回0
exists key
# 查询某个 key 的值的类型
type key

# 更改 key 的名称,如果 key 和 newkey 相同或没有 key 则返回错误
# 如果 newkey 已经存在,则覆盖 newkey 的值
rename key newkey

# 移动数据到目标数据库 db 中
# 如果源数据库和目标数据库有相同的 key 或 key 不存在,则没有效果。成功返回1,失败返回0
move key db

# 删除数据,不存在的 key 会被忽略,返回被操作的数据的数量
del key [key...]

# 设置某个键的生存时间,成功返回1,否则返回0
expire key seconds
# expire 的毫秒版
pexpire key milliseconds
# 移除生存时间,成功返回1,否则返回0
persist key
# 获取某个键的剩余生存时间,返回结果单位为秒,如果值为 -1 则是永久生存,如果值为 -2 则是 key 不存在
ttl key

# 查看当前数据库有多少 key
dbsize

字符串 string

字符串是最简单最常用的数据类型,就是简单的字符串型键值对。

设置键值对(添加、修改数据)

可以使用 set 命令设置键值对,如果没有相应的键则进行添加,如果有相应的键则修改值。

set key value

在设置键值对时,使用 ex 参数设置这个键值对的生存时间,超时则自动销毁,单位是秒。

set key value ex 30
setex key seconds value

参数 px 作用同 ex ,只是单位是毫秒

set key value px 300

只能新建 key ,不能修改现有 key 的值

set key value nx

只能修改现有的 key 的值,不能新建 key

set key value xx

在 key 原有的 value 后追加字符串数据,返回追加后 value 的长度

append key value

同时 set 多个键值对。这两个操作是原子性操作,即要么全成功,要么全失败,不会出现一部分成功一部分失败的情况。成功返回1,失败返回0

# 对于已经存在的 key 会覆盖 value
mset key value [key value ...]
# 只创建新的 key
msetnx key value [key value ...]

查询数据

# 获取已经存在的键的值
get key

# 将 key 的值设为 value ,并返回修改前的 value
getset key value

# 获取 key 的 value 的长度,当 key 不存在返回0
strlen key

# 获取多个 key 的 value
mget key [key ...]

哈希表 hash

如果要存储对象,使用字符串就不方便了,此时可以使用哈希表。

添加、修改数据

使用 hset 来添加、修改数据。哈希表里有个**域(field)**的概念,可以理解为 key 包含了若干个 key-value 中的第二个 key 。如果将 key 理解为一个对象,field 就是次对象中的成员名称。

hset key field value
# 一次设置 key 中的多个 field 和 value
hmset key field value [field value ...]
# 只创建新的 field,如果存在则放弃执行
hsetnx key field value

删除数据

# 删除 key 中的一个或多个 field,不存在的 field 将被忽略
hdel key field [field ...]

查询数据

# 获取目标 key 目标 field 的 value
hget key field
# 获取目标 key 的多个 field 的 value 
hmget key field [field ...]
# 获取 key 中所有的 field 和 value
hgetall key
# 获取 key 中的所有 field
hkeys key
# 获取 key 中所有 field 的 value
hvals key
# 判断 key 中是否有 field
hexists key field
# 返回 key 中 field 的数量
hlen key

列表 list

列表是一个有序可重复的元素集合,其概念类似于 python 的列表。

添加数据

使用 lpushrpush 来往列表中添加数据

# 将一个或多个 value 按照从左到右的顺序依次插入到 key 的头部
# 注意得到的结果和命令输入顺序是相反的,因为是依次插入头部
# 此命令为原子命令,返回执行完成后列表的长度
lpush key value [value ...]

# 将 value 插入到存在的 key 的头部,如果 key 不存在则不执行,返回执行完成后列表 key 的长度
lpushx key value

# 将一个或多个 value 按照从左到右的顺序依次插入到 key 的尾部
# 和 lpush 不同的除了插入地方d不同外,结果顺序也是不同的
# 此命令为原子命令,返回执行完成后列表的长度
rpush key value [value ...]

# 类似于 lpushx,插入到存在的 key 的尾部
rpushx key value

# 将值 value 插入到 key 的值 pivot 之前或之后
# 当 pivot 不存在于 key,或 key 不存在或为空时,不执行操作
# 返回成功操作后列表的长度,不存在 pivot 返回 -1,不存在 key 或为空返回 0
linsert key before|after pivot value

删除数据

# 弹出(移除并返回) key 的头元素
lpop key
# 弹出 key 的尾元素
rpop key

# 根据参数 count 的值,移除列表 key 中与参数 value 相等的元素,返回被移除元素的数量
# count 表示移除与 value 相等的元素,数量为 count 的绝对值个(count 为 0 则不限数量)。
# 当 count 为正数时从头向尾搜索,为负数时搜索方向相反。
lrem key count value

# 对列表 key 进行修剪,只保留 start 到 stop 区间内的元素,其他会被删除
# start 和 stop 是索引(下标),从 0 开始,可以使用负数下标,即最后一个元素为 -1
# 下标超出返回不会出错
ltrim key start stop

修改数据

# 将列表 source 的尾元素弹出并插入到列表 destination 的头部,原子命令
rpoplpush source destination

# 将列表 key 下标为 index 的元素设置为 value
# 当 index 超出范围或空列表(key不存在)时返回错误
lset key index value

查询数据

# 返回列表 key 中指定区间的元素,区间以偏移量 start 和 stop 指定,超出区间可能取不到值,但是不会出错
# start 和 stop 是索引(下标),从 0 开始,可以使用负数下标,即最后一个元素为 -1
# 取值使用左右闭合的原则,和 python 等左闭右开原则是不同的
lrange key start stop

# 返回列表 key 中下标为 index 的元素
lindex key index

# 返回列表 key 的长度
llen key

集合 set

集合是一个无序不重复的元素的集,其概念类似于 python 的集合。

添加数据

# 将若干个元素 member 添加到结合 key 中,已经存在的元素被忽略,返回被添加的元素数量(不含被忽略的元素)
sadd key member [member ...]

删除数据

# 弹出 key 中的一个随机元素
spop key

# 移除 key 的成员 member ,如不存在则会忽略
srem key member [member ...]

修改数据

# 将成员 member 从集合 source 转移到 destination,如果 destination 中已经有了 member ,则只是从 source 中删除
smove source destination member

查询数据

# 判断 member 是否是 key 的成员
sismember key member

# 根据参数 count 获取集合 key 中的若干元素
# 没有 count 参数会随机返回 key 中的一个元素
# count 为正数或0,且小于集合基数,则返回一个包含 count 个元素的数组,且元素各不相同
# count 为正数,且大于等于集合基数,则返回整个集合
# count 为负数,返回一个长度为 count 的绝对值的数组,数组中的元素是 key 的随机元素,但是可能会重复出现多次
srandmember key [count]

# 获取 key 的基数(集合中元素的数量)
scard key
# 获取 key 的所有成员
smembers key

# 获取若干集合交集的所有成员(当只有一个集合则返回此集合所有成员)
sinter key [key ...]
# 获取若干集合并集的所有成员(当只有一个集合则返回此集合所有成员)
sunion key [key ...]
# 获取若干集合差集的所有成员(当只有一个集合则返回此集合所有成员)
sdiff key [key ...]

# 类似于 sinter,但是会将结果保存在集合 destination 中,如果已存在则覆盖
sinterstore destination key [key ...]
# 类似于 sunion,但是会将结果保存在集合 destination 中,如果已存在则覆盖
sunionstore destination key [key ...]
# 类似于 sdiff,但是会将结果保存在集合 destination 中,如果已存在则覆盖
sdiffstore destination key [key ...]

有序集合

有序集合可以根据集合里的内容进行排序,即有序的集合。因为集合是有序的,所以所有成员均有一个**值(score)**以便进行排序

添加数据

# 添加若干成员 member 及其值 score 到有序集合 key 中
# 如果已经有 member 则更新其 score 并更新其位置,score 可以是整数或双精浮点数
zadd key score member [[score member] [score member] ...]

删除数据

# 删除 key 的若干成员 member,不存在的被忽略
zrem key member [member ...]

# 移除 key 中指定排名区间内的所有成员
zremrangebyrank key start stop
# 移除 key 中 score 处于区间内的所有成员
zremrangebyscore key min max

修改数据

# 为有序集 key 的成员 member 的 score 加上增量 increment
zincrby key increment member

查询数据

# 返回有序集合 key 中成员 member 的 score 值
zscore key member

# 返回有序集 key 的基数
zcard key

# 返回有序集 key 中,score 在 min 和 max 之间(可以相等)的成员数量
zcount key min max

# 返回有序集 key 中 score 递增的顺序下标在区间 start 到 stop 间的成员
# 如果带有选项 withscores,则除了成员外还返回其 score
zrange key start stop [WITHSCORES]
# 类似于 zrange 命令,只是排列顺序为递减顺序
zrevrange key start stop [WITHSCORES]

# 返回有序集 key 中 score 介于 min 和 max 之间(可以相等)的成员,并按照 score 递增排序
# 选项 limit 可以指定结果的偏移量 offset 和数量 count,类似于 sql 的分页
zrangebyscore key min max [WITHSCORES] [LIMIT offset count]
# 类似于 zrangebyscore 命令,只是排列顺序为递减
zrevrangebyscore key max min [WITHSCORES] [LIMIT offset count]

# 返回 key 的成员 member 的排名,按照 score 递增排列
zrank key member
# 返回 key 的成员 member 的排名,按照 score 递减排列
zrevrank key member

Redis 主从复制读写分离

redis 支持主从功能,将数据库复制并分离成若干个数据库(一主多从,自动同步),主机负责写,从机负责读,能够大大的提升效率。也可以利用哨兵进行主从切换,做到主机宕机后从机替补。

作为 master 的主机没有改动,修改 slave 从机的配置文件:

# 设置向主机通信,需要启用
replicaof master_ip master_port
# 设置主机验证,需要启动
masterauth master_password

然后运行数据库服务即可。成功后可以使用命令查看具体信息

info replication

主机可以使用这个命令看到从机数量和信息,从机可以看到主机状态等信息。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值