Redis总结
Redis:(全称:REmote DIctionary Server)是使用ANSI C语言编写的、开源的、遵守BSD协议、支持网络、既可基于内存又可持久化的Key-Value存储系统。通常又被称为数据结构服务器,因为Value值可以是:字符串(string)、哈希(hash)、列表(list)、集合(set)和有序集合(sorted set)类型。
一、概念
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-fsync | AOF方式备份数据时从缓存写入磁盘时每次写入的数据量,默认为32MB |
auto-aof-rewrite-min-size | AOF方式备份数据时文件最小体积,默认为64MB,超过该值则会触发AOF的rewrite机制 |
auto-aof-rewrite-percentage | AOF方式相比上次备份增加的百分比的最大值,超过该值则会触发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 field | key中是否存在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博客
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)