Redis 安装与使用
Redis 介绍
Redis 是由 Salvatore Sanfilippo 写的 key-value 存储系统,是一个跨平台的非关系型数据库(NoSQL)。
Redis 是用C语言开发完全开源,基于内存的高性能数据库,理论读速度110000次/s,写速度81000次/s 。
安装
下载
可以从 Redis 官网下载最新版本,或从 https://github.com/redis/redis-hashes/ 选择自己需要的版本下载。
安装
# 1、安装C语言和环境
yum install gcc-c++
# 2、解压Redis安装包
tar -zxvf redis-3.0.0.tar.gz
# 3、进入解压目录并编译
cd redis-3.0.0/
make
# 4、安装到指定目录
make install PREFIX=/usr/local/redis
基本使用
启动和关闭
前端启动
该方法在启动后会占用当前窗口。
在 redis/bin/ 目录下直接运行 redis-server,使用默认配置文件启动
./redis-server
显示如下界面:
![image-20220920111043367](/i/l/?n=22&i=blog/2974682/202209/2974682-20220921180019339-104586807.png)
关闭当前命令窗口会使 redis-server 结束运行,或使用Ctrl + C
命令结束 redis-server 进程。
后端启动
-
进入安装包解压目录中,有一份配置文件 redis.conf,将其拷贝到 redis/bin 目录下
cp redis.conf /usr/local/redis/bin
-
修改 /usr/local/redis/bin 下的 redis.conf,将daemonize由no改为yes
################################ GENERAL ##################################### # By default Redis does not run as a daemon. Use 'yes' if you need it. # Note that Redis will write a pid file in /var/run/redis.pid when daemonized. daemonize yes
-
使用 redis.conf 配置文件启动
./redis-server redis.conf
关闭
在 redis/bin/ 目录下,执行 redis-cli -p [port] shutdown
./redis-cli -p [port] shutdown
基本命令
redis客户端命令 redis-cli 控制连接 redis 服务:
# 直接运行 redis-cli,则默认ip 127.0.0.1,默认端口 6379
[root@localhost bin]# ./redis-cli
127.0.0.1:6379>
redis支持远程访问:
# -h [host] -p [port] -a [password]
[root@localhost bin]# ./redis-cli -h 192.168.233.134 -p 6379
192.168.233.134:6379>
键(Key)命令
-
**keys *** :
查看当前库中所有的 key
-
exists :
检查 key 是否存在,存在返回 1,不存在返回 0
-
expire :
设置 key 的过期时间(s)
-
ttl :
查看 key 的剩余生存时间(s)
-
type :
返回 key 存储的 value 的数据类型
五种数据类型
数据类型 | 赋值 | 取值 | 删除 |
---|---|---|---|
string | set key value |
get key |
del key |
hash | hset key field value |
hget key field |
hdel key field ... |
list | lpush key value ... |
lrange key start stop |
lrem key count value |
set | sadd key value ... |
smembers key |
srem key value ... |
sorted set(zset) | zadd key score value ... |
zrange key start stop [withscores] |
zrem key value ... |
-
string
127.0.0.1:6379> set str 666 OK 127.0.0.1:6379> get str "666"
自增(
incr
)、自减(decr
)# incr 使存储的数字数据自增 127.0.0.1:6379> incr str (integer) 667 # decr 使存储的数字数据自减 127.0.0.1:6379> decr str (integer) 666
-
hash
127.0.0.1:6379> hset user name zhangsan (integer) 1 127.0.0.1:6379> hset user age 35 (integer) 1 # hgetall 获取key的所有字段和值 127.0.0.1:6379> hgetall user 1) "name" 2) "zhangsan" 3) "age" 4) "35" # 一年过去了 127.0.0.1:6379> hset user age 36 (integer) 0 127.0.0.1:6379> hgetall user 1) "name" 2) "zhangsan" 3) "age" 4) "36"
-
list
元素有序,可重复
# lpush 从左(表头)插入元素,rpush 从右(表尾)插入元素 127.0.0.1:6379> lpush list 1 2 (integer) 2 127.0.0.1:6379> rpush list 3 4 (integer) 4 # lrange key 0 -1 遍历所有元素 127.0.0.1:6379> lrange list 0 -1 1) "2" 2) "1" 3) "3" 4) "4"
lrem key count value
删除 key 中 count 个为 value 的元素127.0.0.1:6379> rpush list 3 (integer) 5 127.0.0.1:6379> lrange list 0 -1 1) "2" 2) "1" 3) "3" 4) "4" 5) "3" # count = 0,删除所有值为 3 的元素 127.0.0.1:6379> lrem list 0 3 (integer) 2 127.0.0.1:6379> lrange list 0 -1 1) "2" 2) "1" 3) "4"
-
set
元素无序,不可重复
127.0.0.1:6379> sadd set1 1 2 3 4 (integer) 4 127.0.0.1:6379> sadd set2 1 2 (integer) 2 # 为 set2 添加一个 2 127.0.0.1:6379> smembers set2 1) "1" 2) "2" 127.0.0.1:6379> sadd set2 2 (integer) 0 127.0.0.1:6379> smembers set2 1) "1" 2) "2"
集合间的差值
# set1 - set2 127.0.0.1:6379> sdiff set1 set2 1) "3" 2) "4" # set2 - set1 127.0.0.1:6379> sdiff set2 set1 (empty list or set) # 移除 set1 中的 3、4 127.0.0.1:6379> srem set1 3 4 (integer) 2 127.0.0.1:6379> smembers set1 1) "1" 2) "2" 127.0.0.1:6379> sdiff set1 set2 (empty list or set)
-
sorted set(zset)
元素有序,不可重复
127.0.0.1:6379> zadd student 59 zhangsan 60 lisi 65 wangwu (integer) 3 127.0.0.1:6379> zrange student 0 -1 withscores 1) "zhangsan" 2) "59" 3) "lisi" 4) "60" 5) "wangwu" 6) "65" # 将 "zhangsan" 的分数改为 60 127.0.0.1:6379> zadd student 60 zhangsan (integer) 0 127.0.0.1:6379> zrange student 0 -1 withscores 1) "lisi" 2) "60" 3) "zhangsan" 4) "60" 5) "wangwu" 6) "65"
切换数据库
redis 默认有 16 个数据库(由 redis.conf 文件中的 databases 配置),通过索引标识,不能设置名称。
连接 redis 时,默认会连接到数据库 [0]。
![image-20220921141816586](/i/l/?n=22&i=blog/2974682/202209/2974682-20220921180118599-1832906859.png)
- 使用
select [0-15]
切换数据库。
127.0.0.1:6379> select 1
OK
127.0.0.1:6379[1]> select 2
OK
127.0.0.1:6379[2]>
- 数据库间的数据相互独立,只能访问修改当前数据库下的数据
# 之前在数据库[0]创建有 str :666
# 在数据库[2]获取 str
127.0.0.1:6379[2]> get str
(nil)
# 在数据库[2]设置 str :lisi
127.0.0.1:6379[2]> set str lisi
OK
127.0.0.1:6379[2]> get str
"lisi"
# 回到数据库[0],获取 str 依然为 666
127.0.0.1:6379[2]> select 0
OK
127.0.0.1:6379> get str
"666"
-
清空数据库的数据
FLUSHDB
:清空当前数据库的数据# 数据库[0] 127.0.0.1:6379> keys * 1) "student" 2) "list" 3) "set1" 4) "set2" 5) "str" 6) "user" # 数据库[2] 127.0.0.1:6379[2]> keys * 1) "str" # 在数据库[0]使用 FLUSHDB 命令 127.0.0.1:6379> flushdb OK 127.0.0.1:6379> keys * (empty list or set) # 数据库[2]的数据没有被清除 127.0.0.1:6379> select 2 OK 127.0.0.1:6379[2]> keys * 1) "str"
FLUSHALL
:清空所有数据库的数据# 在数据库[0]、[1]各创建一个数据 127.0.0.1:6379> keys * 1) "db0" 127.0.0.1:6379[1]> keys * 1) "db1" 127.0.0.1:6379[2]> keys * 1) "str" # 在任意数据库运行 FLUSHALL 命令 127.0.0.1:6379[1]> flushall OK 127.0.0.1:6379> keys * (empty list or set) 127.0.0.1:6379[1]> keys * (empty list or set) 127.0.0.1:6379[2]> keys * (empty list or set)
持久化
Redis 的所有数据都存储在内存中,为了使 Redis 在重启之后仍能访问到上次的数据,需要将数据从内存中同步到硬盘中,这一过程就是持久化。
Redis 支持两种持久化方式,RDB和AOF,可以单独使用或结合使用。
RDB持久化
Redis 默认的持久化方案,通过快照(snapshotting)创建 dump.rdb 文件将数据保存到磁盘
![image-20220921145614386](/i/l/?n=22&i=blog/2974682/202209/2974682-20220921180146842-1550404405.png)
RDB配置项:
save 900 1 #900秒内如果超过1个key被修改,则发起快照保存
save 300 10 #300秒内如超过10个key被修改,则发起快照保存
save 60 10000 #60秒内如果超过10000个key被修改,则发起快照保存
stop-writes-on-bgsave-error yes #如果最近一次快照文件创建失败则停止 redis 的数据写入操作
rdbcompression yes #压缩快照文件
dbfilename dump.rdb #文件名
dir ./ #创建文件路径
Redis 启动后会读取RDB快照文件,将数据从硬盘载入到内存。
在操作数据库时,可以使用 SAVE / BGSAVE
和 CONFIG GET dir
命令手动保存或读取RDB快照文件,在读取RDB文件时要使文件名、文件路径与配置文件中保持一致。
一般我们会使用 RDB 的自动持久化策略:
- 优点:减少 IO 操作,确保 redis 的高性能
- 缺点:Redis 一旦发生故障,极易造成数据丢失,无法保证数据完整性
AOF持久化
AOF(Append Only File)仅追加的文件,会将执行过的写指令追加到 AOF 文件,redis 重启后再将所有指令执行一遍。
![image-20220921154313239](/i/l/?n=22&i=blog/2974682/202209/2974682-20220921180307665-1731713858.png)
AOF 默认是关闭的,需要配置 redis.conf 文件的 appendonly yes
开启
appendonly yes #开启 AOF
appendfilename appendonly.aof #文件名,保存路径和 RDB 文件一致
#appendfsync always #每次有数据修改时,写入 AOF 文件。
appendfsync everysec # AOF 默认策略,每秒写入一次。
#appendfsync no #从不写入。
auto-aof-rewrite-percentage 100 #自动重写的增长比例阈值
auto-aof-rewrite-min-size 64mb #自动重写的最小文件大小
重写是指:将指令集压缩到可以恢复数据的最小指令集。
开启 AOF 持久化后,当 AOF 文件的大小大于 64M,且当前大小比上一次重写后的大小增长比例高于阈值,才会进行重写。
- 优点:保证了数据的完整性
- 缺点:大量的 IO 操作,严重影响 redis 性能
主从复制
持久化保证了 Redis 重启后不会丢失数据,但如果硬盘损坏了怎么办。主从复制就可以避免这类问题。
主从复制:将主Redis服务器(master)的数据,复制到从Redis服务器(slave)。
-
只能有一个 master,可以有多个 slave,一主多从。
-
数据只能由 master 复制到 slave。
-
主从数据实时同步,master 写入数据时通过主从复制机制,将数据复制到 slave。
-
主从复制时不会阻塞 master 的服务进程,master 依然可以处理 Client 请求。
-
一个 Redis 可以即是主又是从,(Redis1 是 Redis3/4 的主,是 Redis 的从):
主从复制过程
![image-20220921172421610](/i/l/?n=22&i=blog/2974682/202209/2974682-20220921180444082-1899372969.png)
复制过程:
1、slave 建立和 master 的连接,发送sync 命令。
2、master 启动一个后台进程将数据库保存到 RDB 文件中
3、master 发送RDB文件给 slave
4、slave 接收文件保存到磁盘,然后加载到内存
5、master 把缓存的写命令同步给 slave
- 注意:主如果宕机,从只能读
主从复制的配置
-
主Redis无需额外配置。
-
配置从Redis (slave) 的 redis.conf 中的 slaveof:
slaveof <masterip> <masterport>
,例:slaveof 192.168.233.134 6379
在主Redis中创建一条数据 str 666
,启动从Redis 查看
slave 127.0.0.1:6380> keys *
slave 1) "str"
在主Redis存入数据,查看效果
master 127.0.0.1:6379> set master 123
master OK
# 从Redis同步了数据
slave 127.0.0.1:6380> keys *
slave 1) "str"
slave 2) "master"
slave 127.0.0.1:6380> get master
slave "123"
# 尝试在从Redis存入数据
slave 127.0.0.1:6380> set user zhangsan
slave (error) READONLY You can't write against a read only slave.
关闭主Redis,查看从Redis情况
# 从Redis可以正常读取数据
slave 127.0.0.1:6380> keys *
slave 1) "str"
slave 2) "master"
# 从Redis依然不可写入数据
slave 127.0.0.1:6380> set user zhangsan
slave (error) READONLY You can't write against a read only slave.
标签:127.0,0.1,redis,Redis,6379,key,使用,安装
From: https://www.cnblogs.com/magicmouseblogs/p/16716622.html