如何高效掌握Redis的基本操作技巧?

2026-05-17 05:391阅读0评论SEO基础
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计2739个文字,预计阅读时间需要11分钟。

一:概述Redis是一个开源的、使用ANSI C语言编写的、遵守BSD协议、支持网络、可基于内存持久化的日志型Key-Value数据库,并提供多种语言的API。其值(value)可以是字符串(String)或哈希(Hash)。

一:概述

Redis是一个开源的使用ANSI C语言编写、遵守BSD协议、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。
值(value)可以是 字符串(String), 哈希(Map), 列表(list), 集合(sets) 和 有序集合(sorted sets)等类型。

二:Redis数据类型

Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合)。

2.1 基本语法

#存储键值对 127.0.0.1:6379> set name xiaowu OK #根据键获取值 127.0.0.1:6379> get name "xiaowu" #检查键是否存在 127.0.0.1:6379> exists name (integer) 1 127.0.0.1:6379> exists xiaowu (integer) 0 #修改键的名称 127.0.0.1:6379> rename name newName OK #删除键 127.0.0.1:6379> del key (integer) 1 #设置键的过期时间为 1 分钟 127.0.0.1:6379> expire newName 60 (integer) 1 #返回所有的键 127.0.0.1:6379> keys * 2.2 String(字符串)

string是 redis 最基本的类型,是二进制安全的。意思是 redis 的string可以包含任何数据。比如 jpg 图片或者序列化的对象,一个键最大能存储 512MB。
set和get操作

127.0.0.1:6379> set name xiaowu OK 127.0.0.1:6379> get name "xiaowu"

mset和mget操作

#同时设置一个或多个键值对 127.0.0.1:6379> mset key1 "hello" key2 "world" OK #获取多个值 127.0.0.1:6379> mget key1 key2 1) "hello" 2) "world"

incr和decr操作

# 将 key 中储存的数字值增一 127.0.0.1:6379> set a 20 OK 127.0.0.1:6379> incr a (integer) 21 127.0.0.1:6379> get a "21" #将 key 中储存的数字值减一 127.0.0.1:6379> decr a (integer) 20 127.0.0.1:6379> get a "20"

应用场景
 1.用于控制数据库表主键id,为数据库表主键提供生成策略。
 2.redis控制数据的生命周期,通过数据是否失效控制业务行为。

2.3 哈希

hash 是一个键值对集合,是一个string类型的field和value的映射表,hash特别适合用于存储对象。Redis 中每个 hash 可以存储 232 - 1 键值对(40多亿)。
基本操作

#同时将多个 field-value (字段-值)对设置到哈希表中 127.0.0.1:6379> hset myhash field1 "foo" field2 "bar" (integer) 2 127.0.0.1:6379> hget myhash field1 "foo" 127.0.0.1:6379> hget myhash field2 "bar" #删除哈希表 key 中的一个或多个指定字段 127.0.0.1:6379> hdel myhash field1 (integer) 1 127.0.0.1:6379> hdel myhash field2 (integer) 1 #获取在哈希表中指定 key 的所有字段和值 127.0.0.1:6379> hgetall myhash 1) "field1" 2) "foo" 3) "field2" 4) "bar" #获取所有哈希表中的字段 127.0.0.1:6379> hkeys myhash 1) "field1" 2) "field2" 2.4 List列表

列表是简单的字符串列表,按照插入顺序排序,可以添加一个元素导列表的头部(左边)或者尾部(右边),底层采用的是双向链表的数据结构。列表最多可存储 232 - 1 元素。
基本操作

#添加元素 127.0.0.1:6379> lpush sql redis (integer) 1 127.0.0.1:6379> lpush sql mongodb (integer) 2 127.0.0.1:6379> lpush sql mysql (integer) 3 #范围查询 127.0.0.1:6379> lrange sql 0 10 1) "mysql" 2) "mongodb" 3) "redis" #移出并获取列表的第一个元素 127.0.0.1:6379> lpop sql "mysql" 127.0.0.1:6379> rpop sql "redis"

取最新的N个评论

127.0.0.1:6379> lpush mycomment 100001 (integer) 1 127.0.0.1:6379> lpush mycomment 100002 (integer) 2 127.0.0.1:6379> lpush mycomment 100003 (integer) 3 127.0.0.1:6379> lpush mycomment 100004 (integer) 4 127.0.0.1:6379> lrange mycomment 0 -1 1) "100004" 2) "100003" 3) "100002" 4) "100001" 2.5 SET集合

Set是string类型的无序集合,集合成员是唯一的,集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)。
基本操作

#插入数据 127.0.0.1:6379> sadd nosql redis (integer) 1 127.0.0.1:6379> sadd nosql mongodb (integer) 1 127.0.0.1:6379> sadd nosql mysql (integer) 1 127.0.0.1:6379> sadd nosql mysql (integer) 0 #返回集合中的所有成员 127.0.0.1:6379> smembers nosql 1) "mysql" 2) "redis" 3) "mongodb" #获取集合得成员数 127.0.0.1:6379> scard nosql (integer) 3 #移除并返回集合中的一个随机元素 127.0.0.1:6379> spop nosql "mysql" #移除集合中的一个或多个成员元素 127.0.0.1:6379> srem nosql redis (integer) 1

求共同好友

127.0.0.1:6379> sadd marong_friend 'songdan' 'wangsicong' 'songzhe' (integer) 3 127.0.0.1:6379> SMEMBERS marong_friend 1) "songzhe" 2) "wangsicong" 3) "songdan" 127.0.0.1:6379> sadd wangbaoqiang_friend 'dengchao' 'angelababy' 'songzhe' (integer) 3 127.0.0.1:6379> SMEMBERS wangbaoqiang_friend 1) "songzhe" 2) "dengchao" 3) "angelababy" 127.0.0.1:6379> SINTER marong_friend wangbaoqiang_friend 1) "songzhe" #推荐好友 127.0.0.1:6379> SDIFF marong_friend wangbaoqiang_friend 1) "wangsicong" 2) "songdan" 2.6 zset(sorted set:有序集合)

zset 和 set 一样也是string类型元素的集合,且不允许重复的成员,不同的是每个元素都会关联一个double类型的分数,redis正是通过分数来为集合中的成员进行从小到大的排序。
基本操作

zadd key score member #添加元素,元素在集合中存在则更新对应score 127.0.0.1:6379> zadd xwkey 1 redis (integer) 1 127.0.0.1:6379> zadd xwkey 1 mongodb (integer) 1 127.0.0.1:6379> zadd xwkey 2 mysql (integer) 1 127.0.0.1:6379> zadd xwkey 2 mysql (integer) 0 #有序集成员按分数值递增(从小到大)次序排列 127.0.0.1:6379> zrange xwkey 0 10 withscores 1) "mongodb" 2) "1" 3) "redis" 4) "1" 5) "mysql" 6) "2" #获取有序集合的成员数 127.0.0.1:6379> zcard xwkey (integer) 3 #移除有序集中的一个成员 127.0.0.1:6379> zrem xwkey mongodb (integer) 1 #移除有序集中的多个成员 127.0.0.1:6379> zrem xwkey redis mysql (integer) 2 三:持久化 3.1 概述

由于redis是一个内存数据库,当 redis 服务器重启,获取电脑重启,数据会丢失,我们可以将redis内存中的数据持久化保存到硬盘文件中。
持久化机制
利用永久性存储介质将数据进行保存,在特定的时间将保存的数据进行恢复的工作机制称为持久化。目前Redis持久化的方式有两种:RDBAOF
  RDB:默认方式,不需要进行配置,默认就使用这种机制,在一定间隔时间中,检测 key 的变化情况,然后持久化数据。
  AOF:日志记录的方式,可以记录每一条命令的操作,可以每一次命令操作后,持久化数据。
Redis在利用RDB和AOF进行恢复的时候,都会读取RDB或AOF文件,重新加载到内存中。

3.2 RDB

将当前数据状态进行保存,快照形式,存储数据结果,存储格式简单,关注点在数据。
按照一定的策略周期性的将数据保存到磁盘。对应产生的数据文件为dump.rdb,快照的周期通过配置文件中的save参数来定义。

dbfilename dump.rdb save 900 1 #当有一条Keys数据被改变时,900秒刷新到Disk一次 save 300 10 #当有10条Keys数据被改变时,300秒刷新到Disk一次 save 60 10000 #当有10000条Keys数据被改变时,60秒刷新到Disk一次

save的工作原理
 Redis的RDB文件不会坏掉,因为其写操作是在一个新进程中进行的。当生成一个新的RDB文件时,Redis生成的子进程会先将数据写到一个临时文件中,然后通过原子性rename系统调用将临时文件重命名为RDB文件。

3.3 AOF

数据的操作过程进行保存,日志形式,存储操作过程,存储格式复杂,关注点在数据的操作过程。使用AOF持久化方式时,Redis会将每一个收到的写命令都通过Write函数追加到文件中。
使用AOF的方式,在Redis重启时会逐个执行AOF文件中的命令来将硬盘中的数据载入到内存,载入的速度相比于RDB慢一些。
开启 AOF
 在redis.conf中通过appendonly参数开启

appendonly no ---> appendonly yes # appendfsync always 每一次都进行持久化,最慢但是保证完全的持久化,不推荐 appendfsync everysec 每隔一秒进行一次持久化,推荐 # appendfsync no 不持久化,不推荐

AOF的完全持久化方式同时也带来了另一个问题,持久化文件会变得越来越大。为了压缩AOF的持久化文件,Redis提供了bgrewriteaof命令。

四:数据备份与恢复

SAVE 命令用于创建当前数据库的备份。
数据备份
在 Redis 安装目录中创建 dump.rdb文件

127.0.0.1:6379> save OK

数据恢复

redis 127.0.0.1:6379> CONFIG GET dir 五:Redis事务

事务可以一次执行多个命令,并且带有以下两个重要的保证:
  1.事务是一个单独的隔离操作(隔离性):事务中的所有命令都会序列化、按顺序地执行。事务在执行的过程中,不会被其他客户端发送来的命令请求所打断。
  2.事务是一个原子操作(原子性):事务中的命令要么全部被执行,要么全部都不执行。

#开启事务 127.0.0.1:6379> multi OK 127.0.0.1:6379(TX)> set book "JVM" QUEUED 127.0.0.1:6379(TX)> get book QUEUED 127.0.0.1:6379(TX)> sadd tag "C++" "Java" "PhP" "Python" QUEUED 127.0.0.1:6379(TX)> smembers tag QUEUED #关闭事务 127.0.0.1:6379(TX)> exec 1) OK 2) "JVM" 3) (integer) 4 4) 1) "Python" 2) "Java" 3) "C++" 4) "PhP"

其他命令

#取消事务,放弃执行事务块内的所有命令 discard #取消 watch 命令对所有key的监视 unwatch #监视一个或者多个key,如果在事务执行之前这个(或这些) key 被其他命令所改动,那么事务将被打断 watch key [key..]

注意
  1.当定义事务过程中,命令格式(语法)输入错误,整体事务中的所有命令均不会执行,包括那些正确的命令。
  2.当定义事务过程中,命令执行出错(格式正确,无法执行),能够正确运行的命令会执行,运行错误的命令不会被执行。
转钱案例

127.0.0.1:6379> set dengchao 60000 OK 127.0.0.1:6379> set wangbaoqiang 200 OK 127.0.0.1:6379> multi OK 127.0.0.1:6379(TX)> incrby dengchao -10000 QUEUED 127.0.0.1:6379(TX)> incrby wangbaoqiang 10000 QUEUED 127.0.0.1:6379(TX)> exec 1) (integer) 50000 2) (integer) 10200 小结

本文共计2739个文字,预计阅读时间需要11分钟。

一:概述Redis是一个开源的、使用ANSI C语言编写的、遵守BSD协议、支持网络、可基于内存持久化的日志型Key-Value数据库,并提供多种语言的API。其值(value)可以是字符串(String)或哈希(Hash)。

一:概述

Redis是一个开源的使用ANSI C语言编写、遵守BSD协议、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。
值(value)可以是 字符串(String), 哈希(Map), 列表(list), 集合(sets) 和 有序集合(sorted sets)等类型。

二:Redis数据类型

Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合)。

2.1 基本语法

#存储键值对 127.0.0.1:6379> set name xiaowu OK #根据键获取值 127.0.0.1:6379> get name "xiaowu" #检查键是否存在 127.0.0.1:6379> exists name (integer) 1 127.0.0.1:6379> exists xiaowu (integer) 0 #修改键的名称 127.0.0.1:6379> rename name newName OK #删除键 127.0.0.1:6379> del key (integer) 1 #设置键的过期时间为 1 分钟 127.0.0.1:6379> expire newName 60 (integer) 1 #返回所有的键 127.0.0.1:6379> keys * 2.2 String(字符串)

string是 redis 最基本的类型,是二进制安全的。意思是 redis 的string可以包含任何数据。比如 jpg 图片或者序列化的对象,一个键最大能存储 512MB。
set和get操作

127.0.0.1:6379> set name xiaowu OK 127.0.0.1:6379> get name "xiaowu"

mset和mget操作

#同时设置一个或多个键值对 127.0.0.1:6379> mset key1 "hello" key2 "world" OK #获取多个值 127.0.0.1:6379> mget key1 key2 1) "hello" 2) "world"

incr和decr操作

# 将 key 中储存的数字值增一 127.0.0.1:6379> set a 20 OK 127.0.0.1:6379> incr a (integer) 21 127.0.0.1:6379> get a "21" #将 key 中储存的数字值减一 127.0.0.1:6379> decr a (integer) 20 127.0.0.1:6379> get a "20"

应用场景
 1.用于控制数据库表主键id,为数据库表主键提供生成策略。
 2.redis控制数据的生命周期,通过数据是否失效控制业务行为。

2.3 哈希

hash 是一个键值对集合,是一个string类型的field和value的映射表,hash特别适合用于存储对象。Redis 中每个 hash 可以存储 232 - 1 键值对(40多亿)。
基本操作

#同时将多个 field-value (字段-值)对设置到哈希表中 127.0.0.1:6379> hset myhash field1 "foo" field2 "bar" (integer) 2 127.0.0.1:6379> hget myhash field1 "foo" 127.0.0.1:6379> hget myhash field2 "bar" #删除哈希表 key 中的一个或多个指定字段 127.0.0.1:6379> hdel myhash field1 (integer) 1 127.0.0.1:6379> hdel myhash field2 (integer) 1 #获取在哈希表中指定 key 的所有字段和值 127.0.0.1:6379> hgetall myhash 1) "field1" 2) "foo" 3) "field2" 4) "bar" #获取所有哈希表中的字段 127.0.0.1:6379> hkeys myhash 1) "field1" 2) "field2" 2.4 List列表

列表是简单的字符串列表,按照插入顺序排序,可以添加一个元素导列表的头部(左边)或者尾部(右边),底层采用的是双向链表的数据结构。列表最多可存储 232 - 1 元素。
基本操作

#添加元素 127.0.0.1:6379> lpush sql redis (integer) 1 127.0.0.1:6379> lpush sql mongodb (integer) 2 127.0.0.1:6379> lpush sql mysql (integer) 3 #范围查询 127.0.0.1:6379> lrange sql 0 10 1) "mysql" 2) "mongodb" 3) "redis" #移出并获取列表的第一个元素 127.0.0.1:6379> lpop sql "mysql" 127.0.0.1:6379> rpop sql "redis"

取最新的N个评论

127.0.0.1:6379> lpush mycomment 100001 (integer) 1 127.0.0.1:6379> lpush mycomment 100002 (integer) 2 127.0.0.1:6379> lpush mycomment 100003 (integer) 3 127.0.0.1:6379> lpush mycomment 100004 (integer) 4 127.0.0.1:6379> lrange mycomment 0 -1 1) "100004" 2) "100003" 3) "100002" 4) "100001" 2.5 SET集合

Set是string类型的无序集合,集合成员是唯一的,集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)。
基本操作

#插入数据 127.0.0.1:6379> sadd nosql redis (integer) 1 127.0.0.1:6379> sadd nosql mongodb (integer) 1 127.0.0.1:6379> sadd nosql mysql (integer) 1 127.0.0.1:6379> sadd nosql mysql (integer) 0 #返回集合中的所有成员 127.0.0.1:6379> smembers nosql 1) "mysql" 2) "redis" 3) "mongodb" #获取集合得成员数 127.0.0.1:6379> scard nosql (integer) 3 #移除并返回集合中的一个随机元素 127.0.0.1:6379> spop nosql "mysql" #移除集合中的一个或多个成员元素 127.0.0.1:6379> srem nosql redis (integer) 1

求共同好友

127.0.0.1:6379> sadd marong_friend 'songdan' 'wangsicong' 'songzhe' (integer) 3 127.0.0.1:6379> SMEMBERS marong_friend 1) "songzhe" 2) "wangsicong" 3) "songdan" 127.0.0.1:6379> sadd wangbaoqiang_friend 'dengchao' 'angelababy' 'songzhe' (integer) 3 127.0.0.1:6379> SMEMBERS wangbaoqiang_friend 1) "songzhe" 2) "dengchao" 3) "angelababy" 127.0.0.1:6379> SINTER marong_friend wangbaoqiang_friend 1) "songzhe" #推荐好友 127.0.0.1:6379> SDIFF marong_friend wangbaoqiang_friend 1) "wangsicong" 2) "songdan" 2.6 zset(sorted set:有序集合)

zset 和 set 一样也是string类型元素的集合,且不允许重复的成员,不同的是每个元素都会关联一个double类型的分数,redis正是通过分数来为集合中的成员进行从小到大的排序。
基本操作

zadd key score member #添加元素,元素在集合中存在则更新对应score 127.0.0.1:6379> zadd xwkey 1 redis (integer) 1 127.0.0.1:6379> zadd xwkey 1 mongodb (integer) 1 127.0.0.1:6379> zadd xwkey 2 mysql (integer) 1 127.0.0.1:6379> zadd xwkey 2 mysql (integer) 0 #有序集成员按分数值递增(从小到大)次序排列 127.0.0.1:6379> zrange xwkey 0 10 withscores 1) "mongodb" 2) "1" 3) "redis" 4) "1" 5) "mysql" 6) "2" #获取有序集合的成员数 127.0.0.1:6379> zcard xwkey (integer) 3 #移除有序集中的一个成员 127.0.0.1:6379> zrem xwkey mongodb (integer) 1 #移除有序集中的多个成员 127.0.0.1:6379> zrem xwkey redis mysql (integer) 2 三:持久化 3.1 概述

由于redis是一个内存数据库,当 redis 服务器重启,获取电脑重启,数据会丢失,我们可以将redis内存中的数据持久化保存到硬盘文件中。
持久化机制
利用永久性存储介质将数据进行保存,在特定的时间将保存的数据进行恢复的工作机制称为持久化。目前Redis持久化的方式有两种:RDBAOF
  RDB:默认方式,不需要进行配置,默认就使用这种机制,在一定间隔时间中,检测 key 的变化情况,然后持久化数据。
  AOF:日志记录的方式,可以记录每一条命令的操作,可以每一次命令操作后,持久化数据。
Redis在利用RDB和AOF进行恢复的时候,都会读取RDB或AOF文件,重新加载到内存中。

3.2 RDB

将当前数据状态进行保存,快照形式,存储数据结果,存储格式简单,关注点在数据。
按照一定的策略周期性的将数据保存到磁盘。对应产生的数据文件为dump.rdb,快照的周期通过配置文件中的save参数来定义。

dbfilename dump.rdb save 900 1 #当有一条Keys数据被改变时,900秒刷新到Disk一次 save 300 10 #当有10条Keys数据被改变时,300秒刷新到Disk一次 save 60 10000 #当有10000条Keys数据被改变时,60秒刷新到Disk一次

save的工作原理
 Redis的RDB文件不会坏掉,因为其写操作是在一个新进程中进行的。当生成一个新的RDB文件时,Redis生成的子进程会先将数据写到一个临时文件中,然后通过原子性rename系统调用将临时文件重命名为RDB文件。

3.3 AOF

数据的操作过程进行保存,日志形式,存储操作过程,存储格式复杂,关注点在数据的操作过程。使用AOF持久化方式时,Redis会将每一个收到的写命令都通过Write函数追加到文件中。
使用AOF的方式,在Redis重启时会逐个执行AOF文件中的命令来将硬盘中的数据载入到内存,载入的速度相比于RDB慢一些。
开启 AOF
 在redis.conf中通过appendonly参数开启

appendonly no ---> appendonly yes # appendfsync always 每一次都进行持久化,最慢但是保证完全的持久化,不推荐 appendfsync everysec 每隔一秒进行一次持久化,推荐 # appendfsync no 不持久化,不推荐

AOF的完全持久化方式同时也带来了另一个问题,持久化文件会变得越来越大。为了压缩AOF的持久化文件,Redis提供了bgrewriteaof命令。

四:数据备份与恢复

SAVE 命令用于创建当前数据库的备份。
数据备份
在 Redis 安装目录中创建 dump.rdb文件

127.0.0.1:6379> save OK

数据恢复

redis 127.0.0.1:6379> CONFIG GET dir 五:Redis事务

事务可以一次执行多个命令,并且带有以下两个重要的保证:
  1.事务是一个单独的隔离操作(隔离性):事务中的所有命令都会序列化、按顺序地执行。事务在执行的过程中,不会被其他客户端发送来的命令请求所打断。
  2.事务是一个原子操作(原子性):事务中的命令要么全部被执行,要么全部都不执行。

#开启事务 127.0.0.1:6379> multi OK 127.0.0.1:6379(TX)> set book "JVM" QUEUED 127.0.0.1:6379(TX)> get book QUEUED 127.0.0.1:6379(TX)> sadd tag "C++" "Java" "PhP" "Python" QUEUED 127.0.0.1:6379(TX)> smembers tag QUEUED #关闭事务 127.0.0.1:6379(TX)> exec 1) OK 2) "JVM" 3) (integer) 4 4) 1) "Python" 2) "Java" 3) "C++" 4) "PhP"

其他命令

#取消事务,放弃执行事务块内的所有命令 discard #取消 watch 命令对所有key的监视 unwatch #监视一个或者多个key,如果在事务执行之前这个(或这些) key 被其他命令所改动,那么事务将被打断 watch key [key..]

注意
  1.当定义事务过程中,命令格式(语法)输入错误,整体事务中的所有命令均不会执行,包括那些正确的命令。
  2.当定义事务过程中,命令执行出错(格式正确,无法执行),能够正确运行的命令会执行,运行错误的命令不会被执行。
转钱案例

127.0.0.1:6379> set dengchao 60000 OK 127.0.0.1:6379> set wangbaoqiang 200 OK 127.0.0.1:6379> multi OK 127.0.0.1:6379(TX)> incrby dengchao -10000 QUEUED 127.0.0.1:6379(TX)> incrby wangbaoqiang 10000 QUEUED 127.0.0.1:6379(TX)> exec 1) (integer) 50000 2) (integer) 10200 小结