Redis的基本介绍
# 一、简介
# 1,redis 特点
- 数据持久: 可以将内存中的数据保持在磁盘中,重启的时候可以再次加载进行使用;
- 数据多样: 不仅仅支持简单的 key-value 类型的数据,同时还提供 list,set,zset,hash 等数据结构的存储;
- 数据备份: 即 master-slave 模式的数据备份;
# 2,redis 优势
- 读写性能极高: Redis 能读的速度是110000次/s,写的速度是81000次/s;
- 数据类型丰富: Redis 支持二进制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 数据类型操作;
- 原子层面操作: Redis 的所有操作都是原子性的,同时Redis还支持对几个操作全并后的原子性执行;
- 特性丰富多样: Redis 还支持 publish/subscribe, 通知, key 过期等特性;
# 3,redis特性:
- 速度快:
- 读10w/s,写8.1w/s;
- 原因:内存存放、C语言实现、单线程无多线程竞争问题;
- 基于键值对构建;
- 功能丰富:
- 键过期功能,实现缓存;
- 发布订阅,实现消息系统;
- Lua脚本,构建新命令;
- 事务,保证事务特性;
- pipeline,减少网络开销;
- 简单稳定:
- 原因:源码少,单线程模型,不需要依赖操作系统类库;
- 客户端语言多:
- 基于tcp协议编程;
- Java、Python、C++……;
- 可持久化:
- RDB和AOF两种方式将数据持久化到硬盘,重启能恢复;
- 主从复制:
- 读写分离;
- 多个数据副本;
- 高可用和分布式:
- 故障发现和自动转移;
- 可扩展;
# 4,redis 数据类型
- redis 支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及 zset(sorted set:有序集合);
# 5,启动与关闭相关
- redis 可执行文件说明
可执行文件 | 说明 |
---|---|
redis-server | 启动redis服务 |
redis-cli | 启动redis客户端 |
redis-benchmark | redis基准测试工具 |
redis-check-aof | redis aof 持久化文件检测和修复工具 |
redis-check-dump | redis rdb 持久化文件检测和修复工具 |
redis-sentinel | 启动redis哨兵模式 |
- redis 启动
- 默认配置:
- 命令:redis-server;
- 使用默认配置文件:/usr/local/redis-6.2.4/redis.conf;
- 参数启动:
- 命令:redis-server --configKey1 configValue1 --configKey2 configValue2;
- eg:redis-server --port 8888;
- 其他未修改的参数依然使用默认配置文件中的默认参数,且自定义参数不会保存到配置文件中;
- 配置文件启动:
- 命令:redis-server /opt/redis/redis.conf;
- 默认配置:
# 6,性能高的原因
- Redis使用了单线程架构和I/O多路复用模型来实现高性能的内存数据库服务;
- 命令到服务端后都会进入一个队列,然后被逐一执行;
- 单线程快速原因:
- 纯内存访问;
- 非阻塞io,epoll实现io多路复用;
- 单线程避免了线程切换和竞态产生的消耗;
# 二、redis 命令
# 1,客户端连接
- redis-cli -h 127.0.0.1 -p 6379 -a xxxxxx -n 1
- -h Server hostname (default: 127.0.0.1),指定ip
- -p Server port (default: 6379),指定端口,默认是6379
- -a Password to use when connecting to the server,连接密码
- -n Database number,指定的数据库
命令 | 描述 |
---|---|
AUTH password | 验证密码是否正确 |
ECHO message | 打印字符串 |
PING | 查看服务是否运行 |
QUIT | 关闭当前连接 |
SELECT index | 切换到指定的数据库 |
# 2,key 相关操作
命令 | 描述 |
---|---|
DEL key | key 存在时删除 key |
DUMP key | 序列化给定 key ,并返回被序列化的值 |
EXISTS key | 检查给定 key 是否存在 |
EXPIRE key seconds | 为给定 key 设置过期时间 |
EXPIREAT key timestamp | 为 key 设置过期时间,命令接受的时间参数是 UNIX 时间戳(unix timestamp) |
PEXPIRE key milliseconds | 设置 key 的过期时间以毫秒计 |
PEXPIREAT key milliseconds-timestamp | 设置 key 过期时间的时间戳(unix timestamp) 以毫秒计 |
MOVE key db | 将当前数据库的 key 移动到给定的数据库 db 当中 |
PERSIST key | 移除 key 的过期时间,key 将持久保持 |
TTL key | 以秒为单位,返回给定 key 的剩余过期时间(TTL, time to live) |
PTTL key | 以毫秒为单位返回 key 的剩余的过期时间 |
RANDOMKEY | 从当前数据库中随机返回一个 key |
RENAME key newkey | 修改 key 的名称 |
RENAMENX key newkey | 仅当 newkey 不存在时,将 key 改名为 newkey |
TYPE key | 返回 key 所储存的值的类型 |
KEYS pattern | 查找所有符合给定模式的 key |
SCAN cursor [MATCH pattern] [COUNT count] [TYPE type] | 基于游标 cursor 开始查询符合 pattern 的 key,每次查询的数量是 count ,类型是 type 类型 |
# 3,string 命令
命令 | 描述 |
---|---|
SET key value | 设置指定 key 的值 |
GET key | 获取指定 key 的值 |
MSET key value [key value ...] | 同时设置一个或多个 key-value 对 |
MGET key1 [key2..] | 获取所有(一个或多个)给定 key 的值 |
GETBIT key offset | 对 key 所储存的字符串值,获取指定偏移量上的位(bit) |
SETBIT key offset value | 对 key 所储存的字符串值,设置或清除指定偏移量上的位(bit) |
SETRANGE key offset value | 用 value 参数覆写给定 key 所储存的字符串值,从偏移量 offset 开始 |
GETRANGE key start end | 返回 key 中字符串值的子字符 |
GETSET key value | 将给定 key 的值设为 value ,并返回 key 的旧值(old value) |
STRLEN key 返回 key | 所储存的字符串值的长度 |
SETEX key seconds value | 设置 key 的值,并将 key 的过期时间设为 seconds (以秒为单位) |
PSETEX key milliseconds value | 以毫秒为单位设置 key 的过期时间 |
SETNX key value | 只有在 key 不存在时设置 key 的值 |
MSETNX key value [key value ...] | 同时设置一个或多个 key-value 对,当且仅当所有给定 key 都不存在 |
INCR key | 将 key 中储存的数字值增一 |
INCRBY key increment | 将 key 所储存的值加上给定的增量值(increment) |
INCRBYFLOAT key increment | 将 key 所储存的值加上给定的浮点增量值(increment) |
DECR key | 将 key 中储存的数字值减一 |
DECRBY key decrement key | 所储存的值减去给定的减量值(decrement) |
APPEND key value | 如果 key 已经存在并且是一个字符串, APPEND 命令将 value 追加到 key 原来的值的末尾 |
# 4,hash 命令
- Redis hash 是一个string类型的field和value的映射表,特别适合用于存储对象,每个 hash 可以存储 232 - 1 键值对(40多亿)。 eg:hscan key1 0 match *.log count 100:从 key1 哈希表中的0下标开始查询键以 .log 结尾的键值对,每次查询100个;
命令 | 描述 |
---|---|
HSET key field value | 将哈希表 key 中的字段 field 的值设为 value |
HGET key field | 获取存储在哈希表中指定字段的值 |
HMSET key field1 value1 [field2 value2 ] | 同时将多个 field-value 对设置到哈希表 key 中 |
HMGET key field1 [field2] | 获取所有给定字段的值 |
HGETALL key | 获取在哈希表中指定 key 的所有字段和值 |
HKEYS key | 获取所有哈希表中的字段 |
HVALS key | 获取哈希表中所有值 |
HLEN key | 获取哈希表中字段的数量 |
HDEL key field2 [field2] | 删除一个或多个哈希表字段 |
HEXISTS key field | 查看哈希表 key 中,指定的字段是否存在 |
HINCRBY key field increment | 为哈希表 key 中的指定字段的整数值加上增量 increment |
HINCRBYFLOAT key field increment | 为哈希表 key 中的指定字段的浮点数值加上增量 increment |
HSETNX key field value | 只有在字段 field 不存在时,设置哈希表字段的值 |
HSCAN key cursor [MATCH pattern] [COUNT count] | 从 key 哈希表中的 cursor 游标开始查询键符合 pattern 的 键值对 ,每次查询的数量是 count |
# 5,list 命令
- Redis list是简单的字符串列表,按照插入顺序排序。可以添加一个元素导列表的头部(左边)或者尾部(右边),一个列表最多可以包含 2^32 - 1 个元素 (40多亿个元素)。
命令 | 描述 |
---|---|
BLPOP key1 [key2 ] timeout | 移出并获取列表的第一个元素,如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止 |
BRPOP key1 [key2 ] timeout | 移出并获取列表的最后一个元素,如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止 |
BRPOPLPUSH source destination timeout | 从列表中弹出一个值,将弹出的元素插入到另外一个列表中并返回它;如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止 |
RPOPLPUSH source destination | 移除列表的最后一个元素,并将该元素添加到另一个列表并返回 |
LPUSH key value1 [value2] | 将一个或多个值插入到列表头部 |
RPUSH key value1 [value2] | 在列表中添加一个或多个值 |
LPUSHX key value | 将值插入到已存在的列表头部 |
RPUSHX key value | 将值插入到已存在的列表尾部 |
LPOP key | 移出并获取列表的第一个元素 |
RPOP key | 移除并获取列表最后一个元素 |
LLEN key | 获取列表长度 |
LINDEX key index | 通过索引获取列表中的元素 |
LSET key index value | 通过索引设置列表元素的值 |
LRANGE key start stop | 获取列表指定范围内的元素 |
LTRIM key start stop | 对一个列表进行修剪,让列表只保留指定区间内的元素,不在指定区间之内的元素都将被删除 |
LINSERT key BEFORE | AFTER pivot value |
LREM key count value | 移除列表中值为 value 的元素,count 移除的数量,count<0时,从左往右;count>0时从右往左;count=0时,移除所有 |
# 6,set命令
- Redis Set是string类型的无序集合;集合成员是唯一的,这就意味着集合中不能出现重复的数据;Redis 中集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1);集合中最大的成员数为 232 - 1 (40多亿)。
命令 | 描述 |
---|---|
SADD key member1 [member2] | 向集合添加一个或多个成员 |
SCARD key | 获取集合的成员数 |
SDIFF key1 [key2] | 返回给定所有集合的差集 |
SDIFFSTORE destination key1 [key2] | 返回给定所有集合的差集并存储在 destination 中 |
SINTER key1 [key2] | 返回给定所有集合的交集 |
SINTERSTORE destination key1 [key2] | 返回给定所有集合的交集并存储在 destination 中 |
SISMEMBER key member | 判断 member 元素是否是集合 key 的成员 |
SMEMBERS key | 返回集合中的所有成员 |
SMOVE source destination member | 将 member 元素从 source 集合移动到 destination 集合 |
SPOP key | 移除并返回集合中的一个随机元素 |
SRANDMEMBER key [count] | 返回集合中一个或多个随机数 |
SREM key member1 [member2] | 移除集合中一个或多个成员 |
SUNION key1 [key2] | 返回所有给定集合的并集 |
SUNIONSTORE destination key1 [key2] | 所有给定集合的并集存储在 destination 集合中 |
SSCAN key cursor [MATCH pattern] [COUNT count] | 迭代集合中的元素 |
# 7,sorted set 命令
- Redis 有序集合和集合一样也是 string 类型元素的集合,且不允许重复的成员;有序集合每个元素都会关联一个double类型的分数;redis 正是通过分数来为集合中的成员进行从小到大的排序;有序集合的成员是唯一的,但分数(score)却可以重复;集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1);集合中最大的成员数为 232 - 1 (40多亿个成员)。
命令 | 描述 |
---|---|
ZADD key score1 member1 [score2 member2] | 向有序集合添加一个或多个成员,或者更新已存在成员的分数 |
ZCARD key | 获取有序集合的成员数 |
ZCOUNT key min max | 计算在有序集合中指定区间分数的成员数 |
ZINCRBY key increment member | 有序集合中对指定成员的分数加上增量 increment |
ZINTERSTORE destination numkeys key [key ...] | 计算给定的一个或多个有序集的交集并将结果集存储在新的有序集合 key 中 |
ZLEXCOUNT key min max | 在有序集合中计算指定字典区间内成员数量 |
ZRANGE key start stop [WITHSCORES] | 通过索引区间返回有序集合成指定区间内的成员 |
ZRANGEBYLEX key min max [LIMIT offset count] | 通过字典区间返回有序集合的成员 |
ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT] | 通过分数返回有序集合指定区间内的成员 |
ZRANK key member | 返回有序集合中指定成员的索引 |
ZREM key member [member ...] | 移除有序集合中的一个或多个成员 |
ZREMRANGEBYLEX key min max | 移除有序集合中给定的字典区间的所有成员 |
ZREMRANGEBYRANK key start stop | 移除有序集合中给定的排名区间的所有成员 |
ZREMRANGEBYSCORE key min max | 移除有序集合中给定的分数区间的所有成员 |
ZREVRANGE key start stop [WITHSCORES] | 返回有序集中指定区间内的成员,通过索引,分数从高到底 |
ZREVRANGEBYSCORE key max min [WITHSCORES] | 返回有序集中指定分数区间内的成员,分数从高到低排序 |
ZREVRANK key member | 返回有序集合中指定成员的排名,有序集成员按分数值递减(从大到小)排序 |
ZSCORE key member | 返回有序集中,成员的分数值 |
ZUNIONSTORE destination numkeys key [key ...] | 计算给定的一个或多个有序集的并集,并存储在新的 key 中 |
ZSCAN key cursor [MATCH pattern] [COUNT count] | 迭代有序集合中的元素(包括元素成员和元素分值) |
# 8,HyperLogLog 命令
- Redis HyperLogLog 是用来做基数统计的算法,在输入元素的数量或者体积非常非常大时,计算基数所需的空间总是固定的、并且是很小的; HyperLogLog 只会根据输入元素来计算基数,而不会储存输入元素本身,所以 HyperLogLog 不能像集合那样,返回输入的各个元素。
命令 | 描述 |
---|---|
PFADD key element [element ...] | 添加指定元素到 HyperLogLog 中 |
PFCOUNT key [key ...] | 返回给定 HyperLogLog 的基数估算值 |
PFMERGE destkey sourcekey [sourcekey ...] | 将多个 HyperLogLog 合并为一个 HyperLogLog |
# 9,发布订阅模式
- Redis 发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息,Redis 客户端可以订阅任意数量的频道。
命令 | 描述 |
---|---|
PSUBSCRIBE pattern [pattern ...] | 订阅一个或多个符合给定模式的频道 |
PUBSUB subcommand [argument [argument ...]] | 查看订阅与发布系统状态 |
PUBLISH channel message | 将信息发送到指定的频道 |
PUNSUBSCRIBE [pattern [pattern ...]] | 退订所有给定模式的频道 |
SUBSCRIBE channel [channel ...] | 订阅给定的一个或多个频道的信息 |
UNSUBSCRIBE [channel [channel ...]] | 退订给定的频道 |
# 10,redis 事务
- Redis 事务可以一次执行多个命令, 并且带有以下两个重要的保证:
- 事务是一个单独的隔离操作:事务中的所有命令都会序列化、按顺序地执行。事务在执行的过程中,不会被其他客户端发送来的命令请求所打断。
- 事务是一个原子操作:事务中的命令要么全部被执行,要么全部都不执行。一个事务从开始到执行会经历以下三个阶段:开始事务、命令入队、执行事务。
命令 | 描述 |
---|---|
EXEC | 执行所有事务块内的命令 |
MULTI | 标记一个事务块的开始 |
DISCARD | 取消事务,放弃执行事务块内的所有命令 |
UNWATCH | 取消 WATCH 命令对所有 key 的监视 |
WATCH key [key ...] | 监视一个(或多个) key ,如果在事务执行之前这个(或这些) key 被其他命令所改动,那么事务将被打断 |
# 11,redis 服务器命令
命令 | 描述 |
---|---|
BGREWRITEAOF | 异步执行一个 AOF(AppendOnly File) 文件重写操作 |
BGSAVE | 在后台异步保存当前数据库的数据到磁盘 |
CLIENT KILL [ip:port] [ID client-id] | 关闭客户端连接 |
CLIENT LIST | 获取连接到服务器的客户端连接列表 |
CLIENT GETNAME | 获取连接的名称 |
CLIENT PAUSE timeout | 在指定时间内终止运行来自客户端的命令 |
CLIENT SETNAME connection-name | 设置当前连接的名称 |
CLUSTER SLOTS | 获取集群节点的映射数组 |
COMMAND | 获取 Redis 命令详情数组 |
COMMAND COUNT | 获取 Redis 命令总数 |
COMMAND GETKEYS | 获取给定命令的所有键 |
TIME | 返回当前服务器时间 |
CONFIG GET parameter | 获取指定配置参数的值 |
CONFIG REWRITE | 对启动 Redis 服务器时所指定的 redis.conf 配置文件进行改写 |
CONFIG SET parameter value | 修改 redis 配置参数,无需重启 |
CONFIG RESETSTAT | 重置 INFO 命令中的某些统计数据 |
DBSIZE | 返回当前数据库的 key 的数量 |
DEBUG OBJECT key | 获取 key 的调试信息 |
DEBUG SEGFAULT | 让 Redis 服务崩溃 |
FLUSHALL | 删除所有数据库的所有key |
FLUSHDB | 删除当前数据库的所有key |
INFO [section] | 获取 Redis 服务器的各种信息和统计数值 |
LASTSAVE | 返回最近一次 Redis 成功将数据保存到磁盘上的时间,以 UNIX 时间戳格式表示 |
MONITOR | 实时打印出 Redis 服务器接收到的命令,调试用 |
ROLE | 返回主从实例所属的角色 |
SAVE | 异步保存数据到硬盘 |
SHUTDOWN [NOSAVE] [SAVE] | 异步保存数据到硬盘,并关闭服务器 |
SLAVEOF host port | 将当前服务器转变为指定服务器的从属服务器(slave server) |
SLOWLOG subcommand [argument] | 管理 redis 的慢日志 |
SYNC | 用于复制功能(replication)的内部命令 |
# 三、redis 高级教程
# 1,redis 的备份与恢复
- redis 中的 save 命令,将数据备份到 dump.rdb 文件中,并将该文件存放在安装目录中,可以通过 config get dir 获取 redis 安装目录,只需要将该文件放在安装目录,并启动服务便可恢复数据。
# 2,redis 的安全
- redis 可以通过 config set requirepass "passwd" 来设置密码,config get requirepass 来获取设置的密码,这样客户端连接到 redis 服务时就需要密码验证了;通过 auth passwd 来验证密码是否设置。
# 3,redis 管道技术
- redis 是一种基于客户端-服务端模型以及请求/响应协议的 TCP 服务。客户端向服务端发送一个查询请求,并监听 Socket 返回,通常以阻塞模式等待服务端响应的,服务端处理完命令,并将结果返回给客户端。
- redis 管道技术可以在服务端未响应时,客户端可以继续向服务端发送请求,并最终一次性读取所有服务端的响应。
# 4,redis 分区
- 分区是分割数据到多个 redis 实例的处理过程,因此每个实例只保存 key 的一个子集。
- 分区的优势:
- 通过多台计算机内存和值,构造更大的数据库;
- 通过多核和多台计算机,扩展计算能力;
- 通过多台计算机和网络适配器,允扩展网络带宽;
- 分区的不足:
- 涉及多个 key 的操作通常是不被支持的,eg:当两个 set 映射到不同的 redis 实例上时,你就不能对这两个set执行交集操作;
- 涉及多个 key 的 redis 事务不能使用;
- 数据处理较为复杂,从多个实例和主机备份持久化文件时,需要处理多个 rdb/aof 文件;
- 增加或删除容量也比较复杂,redis 集群大多数支持在运行时增加、删除节点的能力,但是类似于客户端分区、代理等其他系统则不支持这项特性;
- 分区类型:
- 范围分区:映射一定范围的对象到特定的 Redis 实例,需要一个区间范围到实例的映射表,这个表要被管理,同时还需要各种对象的映射表,通常对 Redis 来说并非是好的方法;
- 哈希分区:对任何 key 都适用,用一个 hash 函数将 key 转换为一个数字,对这个整数取模,将其转化为 0 ~ n-1 之间的数字,就可以将这个整数映射到 n 个 Redis 实例中的一个了;
编辑 (opens new window)
上次更新: 2024/02/28, 22:53:01