Redis入门指南
因redis偏操作,所以本次读书笔记用叙事风格来描述~
以前看过redis相关的网课,在51CTO开着倍速看的,尽管会用了,但总是心里有种走马观花的感觉。所有这个季度选了这本《Redis入门指南(第2版)》,用以巩固一下redis的一些知识。
以前只知道redis很快,是个NoSQL数据库。今年来,NoSQL数据库一直都是高并发和海量数据存储的代名词。(没想到redis是意大利的创业公司出的)。
本次将以macos作为操作平台示例。
一、安装
书中提到了较多平台的安装方式,因为我自己是macos,所以以下就只先介绍OS X的系统安装
OS X中有个非常好用的包管理工具Homebrew(类似于Linux中的,类似于yum、apt等)。如果没安装Homebrew可以看这个文章https://blog.csdn.net/qimowei/article/details/113701988,也是我写的。
1、通过Homebrew安装Redis
- 直接输入以下命令
brew install redis
- 理论上来说,在安装完以后会告诉你,怎么启动,怎么找到配置文件,我安装过了,所以输入以下命令,查看redis的信息
capybara@Capybaras-iMac > brew info redis
redis: stable 6.2.3 (bottled), HEAD
Persistent key-value database, with built-in net interface
https://redis.io/
/usr/local/Cellar/redis/6.2.1 (13 files, 2.0MB) *
Poured from bottle on 2021-04-02 at 12:22:35
From: https://github.com/Homebrew/homebrew-core/blob/HEAD/Formula/redis.rb
License: BSD-3-Clause
==> Dependencies
Required: openssl@1.1 ✔
==> Options
--HEAD
Install HEAD version
==> Caveats
To have launchd start redis now and restart at login:
brew services start redis
Or, if you don't want/need a background service you can just run:
redis-server /usr/local/etc/redis.conf
然后可以发现,redis安装到了/usr/local/Cellar/redis/
下,配置文件在redis-server /usr/local/etc/redis.conf
,并且,启动并开启开机自启。
主要看有一句话的描述:To have launchd start redis now and restart at login: brew services start redis
,翻译为:让launchd现在启动redis,并在登录时重启。
-
直接用
brew services start redis
启动,默认端口为6379 -
当然,这是macos的启动方式,其他平台看如下。
- 先看目录的运行文件下有啥。
capybara@Capybaras-iMac /usr/local/Cellar/redis/6.2.1/bin ls
dump.rdb redis-benchmark redis-check-aof redis-check-rdb redis-cli redis-sentinel redis-server
文件名 | 说明 |
---|---|
redis-server | Redis服务器 |
redis-cli | Redis命令行客户端 |
redis-benchmark | Redis性能测试工具 |
redis-check-aof | AOF 文件修复工具 |
redis-check-dump | RDB 文件检查工具 |
redis-sentinel | Sentinel 服务器(v2.8 后) |
- 最常用的就是redis-server和redis-cli,即redis的服务器端和命令行客户端。
- 所以,其他平台可以这样启动
redis-server --port 6379
- 也可以携带自定义配置文件
redis-server path/to/redis.conf
2、配置文件
- 这里只讲经常用到的几个
daemonize yes #配置为守护进程,后台启动
port 6379 #修改监听端口
#让redis支持远程访问,默认只允许本地访问
#bind 127.0.0.1 #注释掉该行,允许所有主机访问redis
protected mode no #关闭保护模式
requirepass pengcheng #配置redis密码,在客户端redis-cli使用时需要输入:auth pengcheng进行认证,认证后才能操作
3、打开redis-cli命令行客户端
capybara@Capybaras-iMac > redis-cli #默认连接本机的6379端口(redis默认使用的端口号)
127.0.0.1:6379>
或
redis-cli -h IP地址 -p 端口号 #连接指定主机、指定端口的redis,如:
capybara@Capybaras-iMac > redis-cli -h 127.0.0.1 -p 6379
127.0.0.1:6379>
二、Redis的数据类型
redis采用key-value的方式存储数据,key只能是字符串类型,value可以为多种类型,分别为如下五种:
- String类型
- Hash(哈希)类型
- List类型
- Set类型
- Sorted-Sets类型
1、String类型
这个是平时用的最多的并且最为基础的一种数据存储类型。最大数据长度是512MB。
1.1 操作
- 赋值、取值、追加、字符串长度以及删除键
set/get/append/strlen/del
capybara@Capybaras-iMac > redis-cli -h 127.0.0.1 -p 6379
127.0.0.1:6379> select 0 #切换到第1个数据库,默认共有16个数据库,索引从0开始
OK
127.0.0.1:6379> keys * #显示所有的键key
(empty array)
127.0.0.1:6379> set name wupengcheng #设置key为name,value为wupengcheng
OK
127.0.0.1:6379> get name #获取key为name的值
"wupengcheng"
127.0.0.1:6379> EXISTS notkey # 查看key是否存在,不存在返回0,存在返回1
(integer) 0
127.0.0.1:6379> EXISTS name
(integer) 1
127.0.0.1:6379> APPEND notkey "hello" # 追加,如果key不存在,就创建,并且返回当前value的长度
(integer) 5
127.0.0.1:6379> APPEND notkey "world" # 追加,如果key存在,则返回追加后的value的长度
(integer) 10
127.0.0.1:6379> get notkey
"helloworld"
127.0.0.1:6379> STRLEN notkey # 获取指定key的value的长度
(integer) 10
127.0.0.1:6379> del notkey # 删除key
(integer) 1
127.0.0.1:6379> get notkey
(nil)
- 命令不区分大小写,但是key和value区分大小写
- 数字操作(以文本方式存储的数字,因为没有数字数据类型,所以也用字符串存储)
递增、递减、带步长的递增、带步长的递减
incr/decr/incrby/decrby
127.0.0.1:6379> set mykey 20
OK
127.0.0.1:6379> incr mykey #递增1
(integer) 21
127.0.0.1:6379> decr mykey #递减1
(integer) 20
127.0.0.1:6379> del mykey #删除该键
(integer) 1
127.0.0.1:6379> decr mykey # 无key的情况下,递减就会以0为基础先创建一个key,然后递减1,递增同理
(integer) -1
127.0.0.1:6379> del mykey
(integer) 1
127.0.0.1:6379> INCR mykey
(integer) 1
127.0.0.1:6379> set mykey 'hello' #将该键的Value设置为不能转换为整型的普通字符串
OK
127.0.0.1:6379> incr mykey #在该键上再次执行递增操作时,Redis将报告错误信息
(error) ERR value is not an integer or out of range
127.0.0.1:6379> set mykey 10
OK
127.0.0.1:6379> incrby mykey 5 #递增5,即步长
(integer) 15
127.0.0.1:6379> decrby mykey 10 #递减10
(integer) 5
2、Hash(哈希)类型
2.1 操作
- hset/hget/hlen/hexists/hdel
- 大致意思和字符串类型一致
127.0.0.1:6379> hset myhash field1 "wupengcheng" #给键值为myhash的键设置字段为field1,值为wupengcheng
(integer) 1
127.0.0.1:6379> hget myhash field1 #获取键值为myhash,字段为field1的值
"wupengcheng"
127.0.0.1:6379> hget myhash field2 #myhash键中不存在field2字段,因此返回nil
(nil)
127.0.0.1:6379> hset myhash field2 "kowu" #给myhash关联的Hashes值添加一个新的字段field2,其值为kowu
(integer) 1
127.0.0.1:6379> hlen myhash #获取myhash键的字段数量
(integer) 2
#判断myhash键中是否存在字段名为field1的字段,由于存在,返回值为1
127.0.0.1:6379> hexists myhash field1
(integer) 1
#删除myhash键中字段名为field1的字段,删除成功返回1
127.0.0.1:6379> hdel myhash field1
(integer) 1
#再次删除myhash键中字段名为field1的字段,由于上一条命令已经将其删除,因为没有删除,返回0
127.0.0.1:6379> hdel myhash field1
(integer) 0
- hincrby
- 和字符串类似,带步长的递增
127.0.0.1:6379> del myhash
(integer) 1
#准备测试数据
127.0.0.1:6379> hset myhash field 5
(integer) 1
#给myhash的field字段的值加1,返回加后的结果
127.0.0.1:6379> hincrby myhash field 1
(integer) 6
#给myhash的field字段的值加-1,返回加后的结果
127.0.0.1:6379> hincrby myhash field -1
(integer) 5
#给myhash的field字段的值加-10,返回加后的结果
127.0.0.1:6379> hincrby myhash field -10
(integer) -5
- hmset/hmget/hgetall/hkeys/hvals
- 分别对应:批量设置value、批量获取key-value,获取所有,获取所有key,获取所有value
127.0.0.1:6379> del myhash
(integer) 1
#为该键myhash,一次性设置多个字段,分别是field1 = "hello", field2 = "world"
127.0.0.1:6379> hmset myhash field1 "hello" field2 "world"
OK
#获取myhash键的多个字段,其中field3并不存在,因为在返回结果中与该字段对应的值为nil
127.0.0.1:6379> hmget myhash field1 field2 field3
1) "hello"
2) "world"
3) (nil)
#返回myhash键的所有字段及其值,从结果中可以看出,他们是逐对列出的
127.0.0.1:6379> hgetall myhash
1) "field1"
2) "hello"
3) "field2"
4) "world"
#仅获取myhash键中所有字段的名字
127.0.0.1:6379> hkeys myhash
1) "field1"
2) "field2"
#仅获取myhash键中所有字段的值
127.0.0.1:6379> hvals myhash
1) "hello"
2) "world"
3、List类型
在Redis中,List类型是按照插入顺序排序的字符串链表。和数据结构中的普通链表一样,我们可以在其头部 (left)和尾部(right)添加新的元素。在插入时,如果该键并不存在,Redis将为该键创建一个新的链表。与此相反,如 果链表中所有的元素均被移除,那么该键也将会被从数据库中删除。List中可以包含的最大元素数量是 4294967295。
从元素插入和删除的效率视角来看,如果我们是在链表的两头插入或删除元素,这将会是非常高效的操作,即 使链表中已经存储了百万条记录,该操作也可以在常量时间内完成。然而需要说明的是,如果元素插入或删除操作 是作用于链表中间,那将会是非常低效的。
先讲下命令中l代表的是左边,即左边操作,r代表右边,即右边操作
- lpush/lpop/llen/lrange
- 向列表左边增加元素/从列表左侧弹出/获取长度/获取列表片段
#创建键mykey及与其关联的List,然后将参数中的values从左到右依次插入
127.0.0.1:6379> lpush mykey a b c d
(integer) 4
#获取从位置0开始到位置2结束的3个元素
127.0.0.1:6379> lrange mykey 0 2
1) "d"
2) "c"
3) "b"
#获取链表中的全部元素,其中0表示第一个元素,-1表示最后一个元素
127.0.0.1:6379> lrange mykey 0 -1
1) "d"
2) "c"
3) "b"
4) "a"
#获取从倒数第3个到倒数第2个的元素
127.0.0.1:6379> lrange mykey -3 -2
1) "c"
2) "b"
#lpushx表示键存在时才能插入,mykey2键此时并不存在,因此该命令将不会进行任何操作,其返回值
为0
127.0.0.1:6379> lpushx mykey2 e
(integer) 0
#可以看到mykey2没有关联任何List Value
127.0.0.1:6379> lrange mykey2 0 -1
(empty list or set)
#mykey键此时已经存在,所以该命令插入成功,并返回链表中当前元素的数量
127.0.0.1:6379> lpushx mykey e
(integer) 5
#获取该键的List中的第一个元素
127.0.0.1:6379> lrange mykey 0 0
1) "e"
127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> lpush mykey a b c d
(integer) 4
#取出链表头部的元素,该元素在链表中就已经不存在了
127.0.0.1:6379> lpop mykey
"d"
127.0.0.1:6379> lpop mykey
"c"
#在执行lpop命令两次后,链表头部的两个元素已经被弹出,此时链表中元素的数量是2
127.0.0.1:6379> llen mykey
(integer) 2
- rpush/rpushx/rpop/rpoplpush
- 和l左侧类似,这是右边的
127.0.0.1:6379> del mykey
(integer) 1
#从链表的尾部插入参数中给出的values,插入顺序是从左到右依次插入
127.0.0.1:6379> rpush mykey a b c d
(integer) 4
#查看链表中的元素,注意元素的顺序
127.0.0.1:6379> lrange mykey 0 -1
1) "a"
2) "b"
3) "c"
4) "d"
#该键已经存在并且包含4个元素,rpushx命令将执行成功,并将元素e插入到链表的尾部。
127.0.0.1:6379> rpushx mykey e
(integer) 5
#由于mykey2键并不存在,因此该命令不会插入数据,其返回值为0。
127.0.0.1:6379> rpushx mykey2 e
(integer) 0
#查看链表中所有的元素
127.0.0.1:6379> lrange mykey 0 -1
1) "a"
2) "b"
3) "c"
4) "d"
5) "e"
#从尾部(right)弹出元素,即取出元素
127.0.0.1:6379> rpop mykey
"e"
#查看链表中所有的元素
127.0.0.1:6379> lrange mykey 0 -1
1) "a"
2) "b"
3) "c"
4) "d"
#创建mykey2
127.0.0.1:6379> lpush mykey2 m n
(integer) 2
#将mykey的尾部元素弹出,然后插入到mykey2的头部(原子性的完成这两步操作)
127.0.0.1:6379> rpoplpush mykey mykey2
"d"
#通过lrange命令查看mykey在弹出尾部元素后的结果
127.0.0.1:6379> lrange mykey 0 -1
1) "a"
2) "b"
3) "c"
#通过lrange命令查看mykey2在插入元素后的结果
127.0.0.1:6379> lrange mykey2 0 -1
1) "d"
2) "n"
3) "m"
127.0.0.1:6379>
#将source和destination设为同一键,将mykey中的尾部元素移到其头部
127.0.0.1:6379> rpoplpush mykey mykey
"c"
#查看结果
127.0.0.1:6379> lrange mykey 0 -1
1) "c"
2) "a"
3) "b"
4、SET类型
在Redis中,我们可以将Set类型看作为没有排序的字符集合,也可以在该类型的数据值上执行添加、删除或判 断某一元素是否存在等操作。Set可包含的最大元素数量是4294967295。
和List类型不同的是,Set集合中不允许出现重复的元素,这一点和Java中的set容器是完全相同的。换句话 说,如果多次添加相同元素,Set中将仅保留该元素的一份拷贝。和List类型相比,Set类型在功能上还存在着一个 非常重要的特性,即在服务器端完成多个Sets之间的聚合计算操作,如unions并、intersections交和differences 差。由于这些操作均在服务端完成,因此效率极高,而且也节省了大量的网络IO开销。
直接看操作吧
- sadd/smembers/sismember/scard
#由于该键myset之前并不存在,因此参数中的三个成员都被正常插入
127.0.0.1:6379> sadd myset a b c
(integer) 3
#查看集合中的元素,从结果可以,输出的顺序和插入顺序无关(无序的)
127.0.0.1:6379> smembers myset
1) "a"
2) "c"
3) "b"
#由于参数中的a在myset中已经存在,因此本次操作仅仅插入了d和e两个新成员(不允许重复)
127.0.0.1:6379> sadd myset a d e
(integer) 2
#查看插入的结果
127.0.0.1:6379> smembers myset
1) "a"
2) "c"
3) "d"
4) "b"
5) "e"
#判断a是否已经存在,返回值为1表示存在
127.0.0.1:6379> sismember myset a
(integer) 1
#判断f是否已经存在,返回值为0表示不存在
127.0.0.1:6379> sismember myset f
(integer) 0
#获取集合中元素的数量
127.0.0.1:6379> scard myset
(integer) 5
- srandmember/spop/srem/smove
127.0.0.1:6379> del myset
(integer) 1
#准备测试数据
127.0.0.1:6379> sadd myset a b c d
(integer) 4
#查看集合中的元素
127.0.0.1:6379> smembers myset
1) "c"
2) "d"
3) "a"
4) "b"
#随机返回一个成员,成员还在集合中
127.0.0.1:6379> srandmember myset
"c"
#取出一个成员,成员会从集合中删除
127.0.0.1:6379> spop myset
"b"
#查看移出后Set的成员信息
127.0.0.1:6379> smembers myset
1) "c"
2) "d"
3) "a"
#从Set中移出a、d和f三个成员,其中f并不存在,因此只有a和d两个成员被移出,返回为2
127.0.0.1:6379> srem myset a d f
(integer) 2
#查看移出后的输出结果
127.0.0.1:6379> smembers myset
1) "c"
127.0.0.1:6379> del myset
(integer) 1
#为后面的smove命令准备数据
127.0.0.1:6379> sadd myset a b
(integer) 2
127.0.0.1:6379> sadd myset2 c d
(integer) 2
#将a从myset移到myset2,从结果可以看出移动成功
127.0.0.1:6379> smove myset myset2 a
(integer) 1
#再次将a从myset移到myset2,由于此时a已经不是myset的成员了,因此移动失败并返回0。
127.0.0.1:6379> smove myset myset2 a
(integer) 0
#分别查看myset和myset2的成员,确认移动是否真的成功。
127.0.0.1:6379> smembers myset
1) "b"
127.0.0.1:6379> smembers myset2
1) "c"
2) "d"
3) "a"
- sdiff/sdiffstore/sinter/sinterstore/sunion/sunionstore
127.0.0.1:6379> flushdb
OK
#准备测试数据
127.0.0.1:6379> sadd myset a b c d
(integer) 4
127.0.0.1:6379> sadd myset2 c
(integer) 1
127.0.0.1:6379> sadd myset3 a c e
(integer) 3
#获取多个集合之间的不同成员,要注意匹配的规则
#先将myset和myset2进行比较,a、b和d三个成员是两者之间的差异成员,然后再用这个结果继续和
myset3进行差异比较,b和d是myset3不存在的成员
127.0.0.1:6379> sdiff myset myset2 myset3
1) "d"
2) "b"
127.0.0.1:6379> sdiff myset3 myset2 myset
1) "e"
#将3个集合的差异成员存储到与diffkey关联的Set中,并返回插入的成员数量
127.0.0.1:6379> sdiffstore diffkey myset myset2 myset3
(integer) 2
#查看一下sdiffstore的操作结果
127.0.0.1:6379> smembers diffkey
1) "d"
2) "b"
#获取多个集合之间的交集,这三个Set的成员交集只有c
127.0.0.1:6379> sinter myset myset2 myset3
1) "c"
#将3个集合中的交集成员存储到与interkey关联的Set中,并返回交集成员的数量
127.0.0.1:6379> sinterstore interkey myset myset2 myset3
(integer) 1
#查看一下sinterstore的操作结果
127.0.0.1:6379> smembers interkey
1) "c"
#获取多个集合之间的并集
127.0.0.1:6379> sunion myset myset2 myset3
1) "b"
2) "c"
3) "d"
4) "e"
5) "a"
#将3个集合中成员的并集存储到unionkey关联的set中,并返回并集成员的数量
127.0.0.1:6379> sunionstore unionkey myset myset2 myset3
(integer) 5
#查看一下sunionstore的操作结果
127.0.0.1:6379> smembers unionkey
1) "b"
2) "c"
3) "d"
4) "e"
5) "a"
5、Sorted-Sets类型
SortedSets和Sets类型极为相似,也称为Zset,它们都是字符串的集合,都不允许重复的成员出现在一个Set 中。它们之间的主要差别是SortedSets中的每一个成员都会有一个分数(score)与之关联,Redis正是通过分数来为 集合中的成员进行从小到大的排序(默认)。然而需要额外指出的是,尽管SortedSets中的成员必须是唯一的,但是分数(score)却是可以重复的。
在SortedSet中添加、删除或更新一个成员都是非常快速的操作。由于SortedSets中的成员在集合中的位置是 有序的,因此,即便是访问位于集合中部的成员也仍然是非常高效的。事实上,Redis所具有的这一特征在很多其它 类型的数据库中是很难实现的,换句话说,在该点上要想达到和Redis同样的高效,在其它数据库中进行建模是非常 困难的。
- zadd/zrange/zcard/zrank/zcount/zrem/zscore/zincrby
#添加一个分数为1的成员
127.0.0.1:6379> zadd myzset 1 "one"
(integer) 1
#添加两个分数分别是2和3的两个成员
127.0.0.1:6379> zadd myzset 2 "two" 3 "three"
(integer) 2
#通过索引获取元素,0表示第一个成员,-1表示最后一个成员。WITHSCORES选项表示返回的结果中包
含每个成员及其分数,否则只返回成员
127.0.0.1:6379> zrange myzset 0 -1 WITHSCORES
1) "one"
2) "1"
3) "two"
4) "2"
5) "three"
6) "3"
#获取myzset键中成员的数量
127.0.0.1:6379> zcard myzset
(integer) 3
#获取成员one在集合中的索引,0表示第一个位置
127.0.0.1:6379> zrank myzset one
(integer) 0
#成员four并不存在,因此返回nil
127.0.0.1:6379> zrank myzset four
(nil)
#获取符合指定条件的成员数量,分数满足表达式1 <= score <= 2的成员的数量
127.0.0.1:6379> zcount myzset 1 2
(integer) 2
#删除成员one和two,返回实际删除成员的数量
127.0.0.1:6379> zrem myzset one two
(integer) 2
#查看是否删除成功
127.0.0.1:6379> zcard myzset
(integer) 1
#获取成员three的分数。返回值是字符串形式
127.0.0.1:6379> zscore myzset three
"3"
#由于成员two已经被删除,所以该命令返回nil
127.0.0.1:6379> zscore myzset two
(nil)
#将成员three的分数增加2,并返回该成员更新后的分数
127.0.0.1:6379> zincrby myzset 2 three
"5"
#将成员three的分数增加-1,并返回该成员更新后的分数
127.0.0.1:6379> zincrby myzset -1 three
"4"
#查看在更新了成员的分数后是否正确
127.0.0.1:6379> zrange myzset 0 -1 withscores
1) "three"
2) "4"
- zrangebyscore/zremrangebyscore/zremrangebyrank
127.0.0.1:6379> del myzset
(integer) 1
127.0.0.1:6379> zadd myzset 1 one 2 two 3 three 4 four
(integer) 4
#通过分数获取元素,获取分数满足表达式1 <= score <= 2的成员
127.0.0.1:6379> zrangebyscore myzset 1 2
1) "one"
2) "two"
#inf表示第一个成员,+inf表示最后一个成员,limit后面的参数用于限制返回成员的数量,
#2表示从位置索引(0based)等于2的成员开始,取后面3个成员,类似于MySQL中的limit
127.0.0.1:6379> zrangebyscore myzset inf +inf withscores limit 2 3
1) "three"
2) "3"
3) "four"
4) "4"
#根据分数删除成员,删除分数满足表达式1 <= score <= 2的成员,并返回实际删除的数量
127.0.0.1:6379> zremrangebyscore myzset 1 2
(integer) 2
#看出一下上面的删除是否成功
127.0.0.1:6379> zrange myzset 0 1
1) "three"
2) "four"
#根据索引删除成员,删除索引满足表达式0 <= rank <= 1的成员
127.0.0.1:6379> zremrangebyrank myzset 0 1
(integer) 2
#查看上一条命令是否删除成功
127.0.0.1:6379> zcard myzset
(integer) 0
- zrevrange/zrevrangebyscore/zrevrank
127.0.0.1:6379> del myzset
(integer) 0
127.0.0.1:6379> zadd myzset 1 one 2 two 3 three 4 four
(integer) 4
#按索引从高到低的方式获取成员
127.0.0.1:6379> zrevrange myzset 0 1 WITHSCORES
1) "four"
2) "4"
3) "three"
4) "3"
5) "two"
6) "2"
7) "one"
8) "1"
#由于是从高到低的排序,所以位置等于0的是four,1是three,并以此类推
127.0.0.1:6379> zrevrange myzset 1 3
1) "three"
2) "two"
3) "one"
#按索引从高到低的方式根据分数获取成员,分数满足表达式3 >= score >= 0的成员
127.0.0.1:6379> zrevrangebyscore myzset 3 0
1) "three"
2) "two"
3) "one"
#limit选项的含义等同于zrangebyscore中的该选项,只是在计算位置时按照相反的顺序计算和获取
127.0.0.1:6379> zrevrangebyscore myzset 4 0 limit 1 2
1) "three"
2) "two"
#获取成员one在集合中的索引,由于是从高到低的排序,所以one的位置是3
127.0.0.1:6379> zrevrank myzset one
(integer) 3
#由于是从高到低的排序,所以four的位置是0
127.0.0.1:6379> zrevrank myzset four
(integer) 0
三、持久化
1、两种方式
1、RDB
该机制是指在指定的时间间隔内将内存中的数据集快照写入磁盘。
Redis Database:通过单文件的方式来持久化 RDB是默认的持久化方式,默认存储在启动redis服务器时所在当前目录下的dump.rdb文件中,一般都会修改存储在一个固定的目录中。
capybara@Capybaras-iMac > cd /usr/local/etc
capybara@Capybaras-iMac > /usr/local/etc > vi redis.conf
···
# The filename where to dump the DB
dbfilename dump.rdb
#持久化文件的名称
#持久化文件的目录,默认为执行redis-server命令时所在的当前目录,如下:
···
capybara@Capybaras-iMac /usr/local/Cellar/redis/6.2.1/bin ls
dump.rdb 。。。
# 可以修改成其他目录(建议)
dbfilename /opt/data/redis/dump.rdb
- 持久化的时机
- 在数据库关闭时会持久化(需要注意的是在数据库宕机时不会生成,数据可能会丢失)
- 满足特定条件时会持久化,编辑配置文件:
capybara@Capybaras-iMac > /usr/local/etc > vi redis.conf
···
################################ SNAPSHOTTING ################################
#
# Save the DB on disk:
#
# save <seconds> <changes>
#
# Will save the DB if both the given number of seconds and the given
# number of write operations against the DB occurred.
#
# In the example below the behaviour will be to save:
# after 900 sec (15 min) if at least 1 key changed
# after 300 sec (5 min) if at least 10 keys changed
# after 60 sec if at least 10000 keys changed
#
# Note: you can disable saving completely by commenting out all "save" lines.
#
# It is also possible to remove all the previously configured save
# points by adding a save directive with a single empty string argument
# like in the following example:
#
# save ""
save 900 1 #在900秒内,只要有1个key发生变化,就会dump持久化
save 300 10
save 60 10000
···
2、AOF
该机制将以日志的形式记录服务器所处理的每一个写操作,在Redis服务器启动之初会读取该文件来重新 构建数据库,以保证启动后数据库中的数据是完整的。
Append Only File:通过操作日志的方式来持久化
capybara@Capybaras-iMac > /usr/local/etc > vi redis.conf
···
appendonly yes #开启aof模式的持久化
appendfilename "/opt/data/redis/appendonly.aof" #aof的持久化文件,持久化文件的目录,与RDB相同
appendfsync everysec #每一秒进行一次持久化操作,可取值:always、everysec、no
···
四、可视化界面软件推荐
Another-redis-desktop-manager
- macos可以通过brew来安装
brew install another-redis-desktop-manager
-
其他平台自行百度
-
界面展示