一、概念

        Redis:(全称:REmote DIctionary Server)是使用ANSI C语言编写的、开源的、遵守BSD协议、支持网络、既可基于内存又可持久化的Key-Value存储系统。通常又被称为数据结构服务器,因为Value值可以是:字符串(string)、哈希(hash)、列表(list)、集合(set)和有序集合(sorted set)类型。Redis有以下特点:

        1、Redis中的数据支持持久化,即可以保存到磁盘,重启时加载保存到磁盘的数据进行使用;

        2、支持string、hash、list、set和sorted set 这5种数据结构;

        3、支持master-slave模式的数据备份;

二、启动和停止

        1、使用默认方式启动,此方式在关闭命令窗口时会关闭redis服务:

redis-server

        2、指定配置文件启动:

redis-server /etc/redis.conf

        可将配置项:daemonize设置为yes,以后台运行方式启动。

        3、停止redis服务:

redis-cli -h IP -p 端口 shutdown //无密码
redis-cli -h IP -p 端口 -a 密码 shutdown //有密码
redis-cli --raw //显示中文

三、配置:

        redis-server启动时如果不指定配置文件,则使用默认配置,否则使用指定文件的配置启动。一般该配置文件为redis.conf。登录redis客户端之后,常用的操作有:

        1、获取系统配置,*表示全部配置,也可以指定配置名:

config get 配置名

        2、设置系统配置为指定的值: 

config set 配置名 值

        常用配置如下:

配置项说明
daemonize设置是否以守护进程的方式运行,默认为no
pidfile以守护进程方式运行时,设置 pid 写入的文件
port设置redis监听的端口,默认为6379
bind设置要绑定的本机网卡对应的IP地址,默认为127.0.0.1,此时只能从本机访问redis服务;也可设置为0.0.0.0,此时不需指定-h也可以访问本机redis服务;还可以指定具体的IP,此时其他机器也可以访问本机redis服务。
timeout设置客户端闲置多长时间时关闭连接,0表示永不断开
loglevel设置日志级别,可以是debug、verbose、notice、warning,默认为notice
logfile设置日志记录方式
databases设置数据库数量,默认为16
save设置在多长时间内,有多少次更新操作,就以RDB方式将数据同步到数据文件,可以写多个
rdbcompression设置RDB方式存储到本地数据库时是否压缩数据,默认为 yes。Redis 采用 LZF 压缩,如果为了节省 CPU 时间,可以关闭该选项,但会导致数据库文件变的巨大
dbfilename设置RDB方式本地数据库文件名,默认值为 dump.rdb
dir指定本地数据库存放目录,即redis安装目录
slaveof设置当本机为 slave 服务时,设置 master 服务的 IP 地址及端口,在 Redis 启动时,它会自动从 master 进行数据同步
masterauth当 master 服务设置了密码保护时,设置 slave 服务连接 master 的密码
requirepass设置 Redis 连接密码,如果配置了连接密码,客户端在连接 Redis 时需要通过 AUTH <password> 命令提供密码,默认关闭
maxclients设置同一时间最大客户端连接数,默认无限制。Redis 可以同时打开的客户端连接数为 Redis 进程可以打开的最大文件描述符数,如果设置 maxclients 0,表示不作限制。当客户端连接数到达限制时,Redis 会关闭新的连接并向客户端返回 max number of clients reached 错误信息
maxmemory设置Redis 最大内存限制,Redis 在启动时会把数据加载到内存中,达到最大内存后,Redis 会先尝试清除已到期或即将到期的 Key,当此方法处理后,仍然到达最大内存设置,将无法再进行写入操作,但仍然可以进行读取操作。Redis 新的 vm 机制,会把 Key 存放内存,Value 会存放在 swap 区
appendonly设置是否以AOF方式备份数据,默认为 no。Redis 在默认情况下是根据 save 配置异步的把数据写入磁盘,如果不开启,可能会在断电时导致一段时间内的数据丢失。
appendfilename设置以AOF方式备份数据的日志文件名,默认为 appendonly.aof
appendfsync

设置AOF方式备份数据的策略,共有 3 个可选值:

1、no:根据操作系统性能同步

2、always:每有变动就同步

3、everysec:每秒同步,默认

aof-rewrite-incremental-fsyncAOF方式备份数据时从缓存写入磁盘时每次写入的数据量,默认为32MB
auto-aof-rewrite-min-sizeAOF方式备份数据时文件最小体积,默认为64MB,超过该值则会触发AOF的rewrite机制
auto-aof-rewrite-percentageAOF方式相比上次备份增加的百分比的最大值,超过该值则会触发AOF的rewrite机制
vm-enabled设置是否启用虚拟内存机制,默认值为 no。VM 机制将数据分页存放,将访问量较少的页即冷数据 swap 到磁盘上,访问多的页面由磁盘自动换出到内存中
vm-swap-file虚拟内存文件路径,默认值为 /tmp/redis.swap,多个 Redis 实例不可共享
vm-max-memory将所有大于 vm-max-memory 的 value 数据存入虚拟内存,即存入磁盘,默认值为 0。但所有 key 数据都存储在内存
vm-page-size设置 swap 文件的 page 大小。如果存储很多小对象,page 大小最好设置为 32 或者 64 byte;如果存储大对象,则可以设置更大的 page;如果不确定,就使用默认值
vm-pages设置 swap 文件中的 page 数量,在磁盘上每8个 pages 将消耗 1byte 的内存
vm-max-threads设置访问 swap 文件的线程数,最好不要超过机器的核数,默认值为4。如果设置为0,那么所有对 swap 文件的操作都是同步的,可能会造成比较长时间的延迟
glueoutputbuf设置在向客户端应答时,是否把较小的包合并为一个包发送,默认为开启

hash-max-zipmap-entries

设置在超过一定数量或者临界值时,采用一种特殊的哈希算法
hash-max-zipmap-value设置在超过一定数量或者临界值时,采用一种特殊的哈希算法
activerehashing设置是否激活重置哈希,默认为开启
include设置包含其它的配置文件,可以在同一主机上多个Redis实例之间使用同一份配置文件,而同时各个实例又拥有自己的特定配置文件
protected-mode

设置是否开启安全模式,此模式下只能本机访问 redis 服务,但需要其他条件同时满足才能起作用:

1、protected-mode设置为 yes

2、不设置 bind

3、不设置 requirepass

四、用法:

常用的操作有:

        1、连接redis服务:

redis-cli //连接到默认redis服务
redis-cli -h IP -p 端口 //连接到指定的redis服务
redis-cli -h IP -p 端口 -a 密码 //连接到指定的redis服务并输入密码
redis-cli -h IP -p 端口 --raw  //出现乱码时加--raw参数解决

        2、检测redis服务是否已启动:

ping

        3、redis根据配置项 databases 会生成指定数量的数据库,数据库名以数字0-N命令且不能修改,默认进入的是0数据库。可以使用如下命令进行切换:

select 1

        4、使用认证密码:

auth 密码

        5、通用命令:

命令说明
KEYS pattern查找所有符合给定模式pattern的 key
DEL key删除指定的 key
DUMP key序列化指定 key ,并返回序列化后的值
EXISTS key检查指定 key 是否存在
EXPIRE key seconds给指定的 key 设置过期时长,时间单位是秒
PEXPIRE key milliseconds给指定的 key 设置过期时长,时间单位是毫秒
EXPIREAT key timestamp给指定的 key 设置过期时长,时间是格林尼治时间(秒数)
PEXPIREAT key milliseconds-timestamp给指定的 key 设置过期时长,时间是格林尼治时间(毫秒数)
MOVE key db将当前数据库的 key 移动到指定的数据库中
PERSIST key移除 key 的过期时间,使 key 持久保持
TTL key返回给定 key 的剩余生存时间,时间单位是秒(TTL:time to live)
PTTL key返回给定 key 的剩余生存时间,时间单位是毫秒
RANDOMKEY返回一个随机key
RENAME key newkey修改 key 的名称,如果newkey已存在则覆盖
RENAMENX key newkey修改 key 的名称,如果newkey已存在则不进行更名
TYPE key返回 key 所储存的值的类型
SCAN cursor MATCH pattern COUNT limit返回从cursor开始,在limit个字典槽位中与pattern匹配的数据,注意limit并不是返回的记录条数。cursor的初始位置为0,如果返回的cursor为0,表示数据都已遍历完

        6、string:

        string 是 redis 最基本的类型,可以理解成与 Memcached 一样的类型,一个 key 对应一个 value,是二进制安全的,最大能存储 512MB。常用命令有:

命令说明
SET key value设置指定 key 的值,如果 key 存在,则更新 key 的值。Redis 2.6.12版本起支持参数EX、PX、NX和XX参数,用于替换SETNX和DEL结合起来使用的弊端
SETNX key value只有在 key 不存在时才设置 key 的值
SETEX key seconds value设置指定 key 的值,并设置过期时长,时间单位是秒
PSETEX key milliseconds value设置指定 key 的值,并设置过期时长,时间单位是毫秒
GET key获取指定 key 的值
SETRANGE key offset value设置 key 对应的值中从偏移量 offset 开始的内容
GETRANGE key start end返回 key 对应的值在start和end之间的子串
GETSET key value返回 key 的旧值,并给key设置新值
SETBIT key offset value对 key 所储存的字符串值,设置或清除指定偏移量offset上的位(bit)
GETBIT key offset返回 key 对应的值在指定偏移offset上的位返回 key 对应的值在指定偏移量offset上的位(bit)
STRLEN key返回 key 所储存的字符串值的长度
MSET key1 value1  key2 value2设置多个key-value值,当 key 值存在时则覆盖
MSETNX key1 value1  key2 value2设置多个key-value值,当所有 key 值都不存在时才设置所有的 key 的值
MGET key1 key2 key3返回多个key的值
INCR key将 key 中储存的数值加一
INCRBY key increment将 key 中储存的数值加increment,increment是整型
INCRBYFLOAT key increment将 key 中储存的数值加increment,increment是浮点型
DECR key将 key 中储存的数值减一
DECRBY key decrement将 key 中储存的数值减decrement,decrement是整型
APPEND key value向 key 中储存的内容末属追加 value

        7、hash:

        hash 是一个键值对集合,特别适合存储对象。

命令说明
HMSET key field1 value1 field2 value2将多个field-value设置到key中
HSET key field value将一个field-value设置到key中,当field存在时用value将原来的值覆盖
HSETNX key field value当field不存在时,将一个field-value设置到key中
HMGET key field1 field2 field3 从key中获取多个field的值
HGET key field从key中获取一个field的值
HGETALL key获取key中所有field的值
HKEYS key获取key中所有field
HVALS key获取key中所有field的值
HLEN key获取key中field的数量
HEXISTS key fieldkey中是否存在field
HINCRBY key field increment将key中field上储存的数值加increment,increment是整型
HINCRBYFLOAT key field increment将key中field上储存的数值加increment,increment是浮点型
HDEL key field1 field2删除key中的field1、field2
HSCAN key cursor MATCH pattern COUNT limit返回在key中从cursor开始,在limit个字典槽位中与pattern匹配的数据,注意limit并不是返回的记录条数。cursor的初始位置为0,如果返回的cursor为0,表示数据都已遍历完

        8、list:

        list 可以添加一个元素到列表的头部(左边)或者尾部(右边),是一个双向链表。

命令说明
LPUSH key value1 value2 value3将多个值插入到列表头部(栈顶)
LPUSHX key value将一个值插入到已存在的列表头部(栈顶)
RPUSH key value1 value2 value3将多个值插入到列表尾部(栈底)
RPUSHX key value将一个值插入到已存在的列表尾部(栈底)
LSET key index value通过索引设置列表元素的值
LTRIM key start end对一个列表进行修剪,只保留指定区间内的元素,不在指定区间之内的元素都将被删除
LPOP key移出并获取列表的第一个元素(栈顶)
RPOP key移出并获取列表的最后一个元素(栈底)
BLPOP key1 key2 timeout移出并获取列表的第一个元素, 如果列表没有元素会阻塞列表直到超时或发现可弹出元素为止
BRPOP key1 key2 timeout移出并获取列表的最后一个元素, 如果列表没有元素会阻塞列表直到超时或发现可弹出元素为止
RPOPLPUSH source destination移除列表source的最后一个元素,并将该元素添加到列表destination并返回
BRPOPLPUSH source destination timeout移除列表source中最后一个元素,并将该元素添加到列表destination中并返回; 如果列表source没有元素会阻塞列表直到等时或发现可弹出元素为止
LREM key count value移除列表中与value相等的count个元素,count>0时从列表头部开始移除,count<0时从列表尾部开始移除,count=0时移除所有与value相等的元素
LINSERT key BEFORE/AFTER value在列表的指定元素前或者后插入元素
LINDEX key index通过索引获取列表中的元素
LRANGE key start end获取列表指定范围内的元素
LLEN key获取列表长度

        9、set:

        set 是 string 类型的无序集合。

命令说明
SADD key value1 value2 value3向集合添加多个元素
SMOVE source destination value将 value 从 集合source移动到集合 destination
SPOP key移除并返回集合中的一个随机元素
SREM key value1 value 2移除集合中一个或多个元素
SISMEMBER key value判断 value 是否是集合 key 的元素
SMEMBERS key返回集合中的所有元素
SCARD key获取集合的元素个数
SRANDMEMBER key count返回集合中一个或多个随机元素
SDIFF key1 key2 key3返回给定所有集合的差集
SDIFFSTORE destination key1 key2 key3返回给定所有集合的差集并存储在 destination 中
SINTER key1 key2 key3返回给定所有集合的交集
SINTERSTORE destination key1 key2 key3返回给定所有集合的交集并存储在 destination 中
SUNION key1 key2 key3返回所有给定集合的并集
SUNIONSTORE destination key1 key2 key3所有给定集合的并集存储在 destination 集合中
SSCAN key cursor MATCH pattern COUNT limit返回在key中从cursor开始,在limit个字典槽位中与pattern匹配的数据,注意limit并不是返回的记录条数。cursor的初始位置为0,如果返回的cursor为0,表示数据都已遍历完

        10、zset(sorted set):

        zset 是 string 类型的有序集合,每个元素中都有一个double类型的分数,通过这个分数进行排序,分数值可重复。

命令说明
ZADD key score1 value1 score2 value2 score3 value3向有序集合添加多个元素,或者更新已存在成员的分数
ZINCRBY key increment value有序集合中对指定元素的分数加 increment
ZREM key value1 value2 value3移除有序集合中的多个元素
ZREMRANGEBYLEX key min max移除有序集合中给定的字典区间的元素
ZREMRANGEBYRANK key min max移除有序集合中给定的排名区间的元素
ZREMRANGEBYSCORE key min max移除有序集合中给定的分数区间的元素
ZCARD key获取有序集合的元素个数
ZCOUNT key min max在有序集合中指定分数区间的元素个数
ZLEXCOUNT key min max在有序集合中指定字典区间的元素个数,-是无穷小,+是无穷大,(表示开区间,[表示闭区间
ZRANGE key start end [WITHSCORES]返回有序集中分数从低到高,指定索引区间内的元素
ZRANGEBYLEX key min max [LIMIT offset count]返回有序集中分数从低到高,指定字典区间内的元素。-是无穷小,+是无穷大,(表示开区间,[表示闭区间
ZRANGEBYSCORE key min max [WITHSCORES]  [LIMIT offset count]返回有序集中分数从低到高,指定分数区间内的元素
ZREVRANGE key start end [WITHSCORES]返回有序集中分数从高到低,指定索引区间内的元素
ZREVRANGEBYSCORE key max min [WITHSCORES]返回有序集中分数从高到低,指定分数区间内的元素
ZRANK key value返回有序集合中指定元素的索引(从小到大的排名)
ZREVRANK key value返回有序集合中指定元素的索引(从大到小的排名)
ZSCORE key value返回有序集合中指定元素的分数值
ZINTERSTORE destination keynum key1 key2 key3返回给定所有有序集合的交集并存储在 destination 中
ZUNIONSTORE destination keynum key1 key2 key3返回给定所有有序集合的并集并存储在 destination 中
ZSCAN key cursor MATCH pattern COUNT limit返回在key中从cursor开始,在limit个字典槽位中与pattern匹配的数据,注意limit并不是返回的记录条数。cursor的初始位置为0,如果返回的cursor为0,表示数据都已遍历完

五、持久化:

        Redis是一种高级key-value数据库,跟memcached类似,但Redis的数据可以持久化,而且支持的数据类型很丰富。Redis的所有数据都是保存在内存中,如果没有配置持久化,Redis重启后数据就全丢失了,于是需要开启Redis的持久化功能,可以不定期地将数据保存到磁盘上,当Redis重启后,可以从磁盘中恢复数据。有两种方式进行持久化:

        1、RDB(Redis DataBase)持久化:

        又称半持久化,是指在指定的时间间隔内将内存中的数据集快照写入磁盘。实际过程是Redis服务主进程先fork一个子进程,子进程在指定的时间间隔内将整个数据集写入临时文件,写入成功后,再替换之前的文件,用二进制压缩存储。可以理解为此模式是定时全量备份,由于是全量备份,所以在恢复数据时比较方便。由于备份的行为都是子进程操作的,所以对服务主进程几乎无压力。如果在同步的过程中出现系统崩溃时,在Redis下一次启动之前,可以通过redis-check-dump工具来检测RDB文件。如果数据集很大,相比AOF,RDB的恢复速度会更快。但是如果在未备份上次备份后的改动时服务出现了问题,则从上次备份之后但本次未开始的这段时间中变化的数据无法被记录。另外由于Redis版本不同导致RDB文件的格式可能会不同。

        RDB持久化除了可以通过save参数自动备份,还可以通过手工命令进行备份:

命令说明
save阻塞当前Redis操作,直到RDB过程完成为止。对于数据量比较大的服务会造成长时间阻塞,不建议使用,使用bgsave代替
bgsave服务主进程fork创建子进程,子进程负责RDB持久化,完成后自动结束。阻塞只发生在fork阶段,持续时间很短

        2、AOF(Append Only File)持久化:

       又称全持久化,是指以日志的形式记录服务器所处理的每一个写、删操作,查询操作不会记录,以文本的方式记录,可以打开文件看到详细的操作记录。可以理解为此模式是增量备份,由于每次数据库的变化都会导致记录磁盘,所以在效率上是最低的。同步到文件的策略有3种:每秒同步,每有变动就同步和不同步。如果在同步的过程中出现系统崩溃时,在Redis下一次启动之前,可以通过redis-check-aof工具来解决数据一致性的问题。如果日志过大,Redis可以启用rewrite机制,以append模式将改动写入到老的磁盘文件中,同时还会创建一个新的文件用于记录此期间有哪些修改命令被执行。但是对于相同数量的数据集,AOF文件通常要大于RDB文件。

 六、注意事项

          1、在使用SETNX和DEL结合起来进行加锁和释放锁时,需要考虑如果特殊情况:

                ①对于一个进程,SETNX执行成功,但DEL执行失败,此时锁将永远不会释放,其他进程无法获取锁。此时可以在SETNX加锁之后,使用EXPIRE设置过期时间,这样即使DEL失败也不致于锁永远不释放;

                ②针对SETNX、EXPIRE、 DEL需要结合起来使用的情况,Redis 2.6.12开始,SET支持参数EX、PX、NX和XX,这样可以在确保加锁的同时可以设置过期时间;

                ③对于多个进程,如果A进程加锁并且设置了过期时间后,对应的操作时间太长导致A进程的锁时间过期而被释放,A进程释放锁后被B进程获取到锁。等到A进程对应的操作结束后执行DEL时释放的却是B进程获取到的锁。为了解决该问题,可以在加锁时针对不同的进程SETNX的$key使用不同的值,DEL时需要判断$key是否是当前进程的key,如果是再进行删除。

参考:redis 持久化详解,RDB和AOF是什么?他们优缺点是什么?运行流程是什么?_rdb20230519163133vhbwiozrf-CSDN博客

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐