Redis 学习笔记
环境
[root@master ~]# cat /etc/redhat-release
CentOS Linux release 7.9.2009 (Core)
Linux 安装 Redis
wget http://download.redis.io/redis-stable.tar.gz
tar xzf redis-stable.tar.gz
cd redis-stable
make
make 时出现如下报错:
[root@master redis-stable]# make
cd src && make all
make[1]: 进入目录“/root/redis-stable/src”
CC adlist.o
/bin/sh: cc: 未找到命令
make[1]: *** [adlist.o] 错误 127
make[1]: 离开目录“/root/redis-stable/src”
make: *** [all] 错误 2
原因:系统无gcc环境 解决方法:
# yum安装gcc
yum install gcc-c++ -y
# 清空上次编译失败残留文件
make distclean
如果仍然以下类似报错:
server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员
redisSetCpuAffinity(server.server_cpulist);
解决方法:
gcc -v # 查看gcc版本
yum -y install centos-release-scl # 升级到9.1版本
yum -y install devtoolset-9-gcc devtoolset-9-gcc-c++ devtoolset-9-binutils
scl enable devtoolset-9 bash #以上为临时启用,如果要长期使用gcc 9.1的话:
echo "source /opt/rh/devtoolset-9/enable" >>/etc/profile
安装成功会出现:
Hint: It's a good idea to run 'make test' ;)
make[1]: 离开目录“/root/redis-stable/src”
执行make test 进行测试, 如果出现如下错误:
[root@master redis-stable]# make test
cd src && make test
make[1]: 进入目录“/root/redis-stable/src”
CC Makefile.dep
make[1]: 离开目录“/root/redis-stable/src”
make[1]: 进入目录“/root/redis-stable/src”
You need tcl 8.5 or newer in order to run the Redis test
make[1]: *** [test] 错误 1
make[1]: 离开目录“/root/redis-stable/src”
make: *** [test] 错误 2
解决方法:
yum install tcl -y
执行make test成功,安装成功!!!
连接到 Redis
执行完 make 命令后, /root/redis-stable/src 下会出现编译后的 redis 服务程序 redis-server, 还有用于测试的客户端程序 redis-cli
启动 redis 服务
./redis-server # 启动 redis 使用的是默认配置
./redis-server ../redis.conf # 指定配置文件启动
使用测试客户端程序 redis-cli 和 redis 服务交互
[root@master ~]# cd /root/redis-stable/src
[root@master src]# ./redis-cli
127.0.0.1:6379>
Redis 配置文件
查看配置
在服务端
grep -Ev "^$|^#" redis.conf
在客户端
通过 Redis CONFIG 命令获取和设置所有 Redis 配置
获取 某一项的配置,CONFIG GET CONFIG_SETTING_NAME
127.0.0.1:6379> CONFIG GET loglevel
获取所有配置设置
127.0.0.1:6379> CONFIG GET *
编辑配置
在服务端
直接编辑 redis.conf 文件
在客户端
CONFIG set 命令更新配置
redis 127.0.0.1:6379> CONFIG SET CONFIG_SETTING_NAME NEW_CONFIG_VALUE
常用配置项
#默认端口6379
port 6379
#绑定ip,如果是内网可以直接绑定 127.0.0.1, 或者忽略, 0.0.0.0是外网
bind 0.0.0.0
#守护进程启动
daemonize yes
#超时
timeout 300
loglevel notice
#分区
databases 16
save 900 1
save 300 10
save 60 10000
rdbcompression yes
#存储文件
dbfilename dump.rdb
#密码 abcd123
requirepass abcd123
redis 数据类型
字符串(string)
二进制安全:已知长度,并且不受任何特殊终止字符的影响
一个字符串中存储最多 512 兆字节的内容
创建和检索
127.0.0.1:6379> SET name "redis.com.cn"
OK
127.0.0.1:6379> GET name
"redis.com.cn"
127.0.0.1:6379>
哈希(hash)
哈希是键值对的集合
哈希是字符串字段和字符串值之间的映射
适合表示对象
创建和检索
127.0.0.1:6379> HMSET user:1 username ajeet password javatpoint alexa 2000
OK
127.0.0.1:6379> HGETALL user:1
1) "username"
2) "ajeet"
3) "password"
4) "javatpoint"
5) "alexa"
6) "2000"
每个哈希可以存储多达 2^32– 1 个字段-值对
列表(list)
Redis 列表定义为字符串列表,按插入顺序排序,可以将元素添加到 Redis 列表的头部或尾部。
创建和检索
127.0.0.1:6379> lpush skill java
(integer) 1
127.0.0.1:6379> lpush skill redis
(integer) 2
127.0.0.1:6379> lpush skill mongodb
(integer) 3
127.0.0.1:6379> lrange skill 0 2
1) "mongodb"
2) "redis"
3) "java"
列表的最大长度为 2^32 – 1 个元素(超过 40 亿个元素)
集合(set)
无序字符串集合
添加,删除和查找的时间复杂度是 O(1)
创建和检索
127.0.0.1:6379> sadd tutoriallist redis
(integer) 1
127.0.0.1:6379> sadd tutoriallist sql
(integer) 1
127.0.0.1:6379> sadd tutoriallist postgresql
(integer) 1
127.0.0.1:6379> sadd tutoriallist postgresql
(integer) 0
127.0.0.1:6379> smembers tutoriallist
1) "sql"
2) "postgresql"
3) "redis"
集合中的最大成员数为 2^32-1 个元素(超过 40 亿个元素)
有序集合(sorted set)
排序集的每个成员都与一个分数相关联。
可以重复分数。
最小到最高分数。
创建和检索
127.0.0.1:6379> zadd skilllist 0 redis
(integer) 1
127.0.0.1:6379> zadd skilllist 0 sql
(integer) 1
127.0.0.1:6379> zadd skilllist 1 postgresql
(integer) 1
127.0.0.1:6379> zadd skilllist 2 momgodb
(integer) 1
127.0.0.1:6379> ZRANGEBYSCORE skilllist 0 10
1) "redis"
2) "sql"
3) "postgresql"
4) "momgodb"
位图 ( Bitmaps )
通过类似 map 结构存放 0 或 1 ( bit 位 ) 作为值
统计状态
创建
127.0.0.1:6379> setbit aaa:001 10001 1
(integer) 0
127.0.0.1:6379> setbit aaa:001 10002 0
(integer) 0
127.0.0.1:6379> setbit aaa:001 10003 1
(integer) 0
基数统计 ( HyperLogLogs )
可以接受多个元素作为输入,并给出输入元素的基数估算值
即使输入元素的数量或者体积非常非常大,计算基数所需的空间总是固定的、并且是很小的
创建和检索
127.0.0.1:6379> PFADD unique::ip::counter '192.168.0.1'
(integer) 1
127.0.0.1:6379> PFADD unique::ip::counter '127.0.0.1'
(integer) 1
127.0.0.1:6379> PFADD unique::ip::counter '255.255.255.255'
(integer) 1
127.0.0.1:6379> PFCOUNT unique::ip::counter
(integer) 3
Redis 命令
登录
redis-cli -h host -p port -a password
[root@master src]# ./redis-cli -h 192.168.108.133 -p 6379
192.168.108.133:6379>
关闭 Redis 服务器
127.0.0.1:6379> shutdown
服务器会打印: 39194:M 16 Dec 2020 10:59:17.585 # Redis is now ready to exit, bye bye...
Redis keys 命令
语法:
COMMAND KEY_NAME
| 命令 | 描述 |
|---|---|
| DEL | 用于删除 key |
| DUMP | 序列化给定 key ,并返回被序列化的值 |
| EXISTS | 检查给定 key 是否存在 |
| EXPIRE | 为给定 key 设置过期时间 |
| EXPIREAT | 用于为 key 设置过期时间,接受的时间参数是 UNIX 时间戳 |
| PEXPIRE | 设置 key 的过期时间,以毫秒计 |
| PEXPIREAT | 设置 key 过期时间的时间戳(unix timestamp),以毫秒计 |
| KEYS | 查找所有符合给定模式的 key |
| MOVE | 将当前数据库的 key 移动到给定的数据库中 |
| PERSIST | 移除 key 的过期时间,key 将持久保持 |
| PTTL | 以毫秒为单位返回 key 的剩余的过期时间 |
| TTL | 以秒为单位,返回给定 key 的剩余生存时间( |
| RANDOMKEY | 从当前数据库中随机返回一个 key |
| RENAME | 修改 key 的名称 |
| RENAMENX | 仅当 newkey 不存在时,将 key 改名为 newkey |
| TYPE | 返回 key 所储存的值的类型 |
字符串命令
| 命令 | 描述 |
|---|---|
| SET | 设置指定 key 的值 |
| GET | 获取指定 key 的值 |
| GETRANGE | 返回 key 中字符串值的子字符 |
| GETSET | 将给定 key 的值设为 value ,并返回 key 的旧值 ( old value ) |
| GETBIT | 对 key 所储存的字符串值,获取指定偏移量上的位 ( bit ) |
| MGET | 获取所有(一个或多个)给定 key 的值 |
| SETBIT | 对 key 所储存的字符串值,设置或清除指定偏移量上的位(bit) |
| SETEX | 设置 key 的值为 value 同时将过期时间设为 seconds |
| SETNX | 只有在 key 不存在时设置 key 的值 |
| SETRANGE | 从偏移量 offset 开始用 value 覆写给定 key 所储存的字符串值 |
| STRLEN | 返回 key 所储存的字符串值的长度 |
| MSET | 同时设置一个或多个 key-value 对 |
| MSETNX | 同时设置一个或多个 key-value 对 |
| PSETEX | 以毫秒为单位设置 key 的生存时间 |
| INCR | 将 key 中储存的数字值增一 |
| INCRBY | 将 key 所储存的值加上给定的增量值 ( increment ) |
| INCRBYFLOAT | 将 key 所储存的值加上给定的浮点增量值 ( increment ) |
| DECR | 将 key 中储存的数字值减一 |
| DECRBY | 将 key 所储存的值减去给定的减量值 ( decrement ) |
| APPEND | 将 value 追加到 key 原来的值的末尾 |
哈希命令
| 命令 | 描述 |
|---|---|
| HDEL | 删除一个或多个哈希表字段 |
| HEXISTS | 查看哈希表 key 中,指定的字段是否存在 |
| HGET | 获取存储在哈希表中指定字段的值 |
| HGETALL | 获取在哈希表中指定 key 的所有字段和值 |
| HINCRBY | 为哈希表 key 中的指定字段的整数值加上增量 increment |
| HINCRBYFLOAT | 为哈希表 key 中的指定字段的浮点数值加上增量 increment |
| HKEYS | 获取所有哈希表中的字段 |
| HLEN | 获取哈希表中字段的数量 |
| HMGET | 获取所有给定字段的值 |
| HMSET | 同时将多个 field-value (域-值)对设置到哈希表 key 中 |
| HSET | 将哈希表 key 中的字段 field 的值设为 value |
| HSETNX | 只有在字段 field 不存在时,设置哈希表字段的值 |
| HVALS | 获取哈希表中所有值 |
| HSCAN | 迭代哈希表中的键值对 |
| HSTRLEN | 返回哈希表 key 中, 与给定域 field 相关联的值的字符串长度 |
列表命令
| 命令 | 描述 |
|---|---|
| BLPOP | 移出并获取列表的第一个元素 |
| BRPOP | 移出并获取列表的最后一个元素 |
| BRPOPLPUSH | 从列表中弹出一个值,并将该值插入到另外一个列表中并返回它 |
| LINDEX | 通过索引获取列表中的元素 |
| LINSERT | 在列表的元素前或者后插入元素 |
| LLEN | 获取列表长度 |
| LPOP | 移出并获取列表的第一个元素 |
| LPUSH | 将一个或多个值插入到列表头部 |
| LPUSHX | 将一个值插入到已存在的列表头部 |
| LRANGE | 获取列表指定范围内的元素 |
| LREM | 移除列表元素 |
| LSET | 通过索引设置列表元素的值 |
| LTRIM | 对一个列表进行修剪(trim) |
| RPOP | 移除并获取列表最后一个元素 |
| RPOPLPUSH | 移除列表的最后一个元素,并将该元素添加到另一个列表并返回 |
| RPUSH | 在列表中添加一个或多个值 |
| RPUSHX | 为已存在的列表添加值 |
集合命令
| 命令 | 描述 |
|---|---|
| SADD | 向集合添加一个或多个成员 |
| SCARD | 获取集合的成员数 |
| SDIFF | 返回给定所有集合的差集 |
| SDIFFSTORE | 返回给定所有集合的差集并存储在 destination 中 |
| SINTER | 返回给定所有集合的交集 |
| SINTERSTORE | 返回给定所有集合的交集并存储在 destination 中 |
| SISMEMBER | 判断 member 元素是否是集合 key 的成员 |
| SMEMBERS | 返回集合中的所有成员 |
| SMOVE | 将 member 元素从 source 集合移动到 destination 集合 |
| SPOP | 移除并返回集合中的一个随机元素 |
| SRANDMEMBER | 返回集合中一个或多个随机数 |
| SREM | 移除集合中一个或多个成员 |
| SUNION | 返回所有给定集合的并集 |
| SUNIONSTORE | 所有给定集合的并集存储在 destination 集合中 |
| SSCAN | 迭代集合中的元素 |
有序集合命令
| 命令 | 描述 |
|---|---|
| ZADD | 向有序集合添加一个或多个成员,或者更新已存在成员的分数 |
| ZCARD | 获取有序集合的成员数 |
| ZCOUNT | 计算在有序集合中指定区间分数的成员数 |
| ZINCRBY | 有序集合中对指定成员的分数加上增量 increment |
| ZINTERSTORE | 计算给定的一个或多个有序集的交集并将结果集存储在新的有序集合 key 中 |
| ZLEXCOUNT | 在有序集合中计算指定字典区间内成员数量 |
| ZRANGE | 通过索引区间返回有序集合成指定区间内的成员 |
| ZRANGEBYLEX | 通过字典区间返回有序集合的成员 |
| ZRANGEBYSCORE | 通过分数返回有序集合指定区间内的成员 |
| ZRANK | 返回有序集合中指定成员的索引 |
| ZREM | 移除有序集合中的一个或多个成员 |
| ZREMRANGEBYLEX | 移除有序集合中给定的字典区间的所有成员 |
| ZREMRANGEBYRANK | 移除有序集合中给定的排名区间的所有成员 |
| ZREMRANGEBYSCORE | 移除有序集合中给定的分数区间的所有成员 |
| ZREVRANGE | 返回有序集中指定区间内的成员,通过索引,分数从高到底 |
| ZREVRANGEBYSCORE | 返回有序集中指定分数区间内的成员,分数从高到低排序 |
| ZREVRANK | 返回有序集合中指定成员的排名,有序集成员按分数值递减(从大到小)排序 |
| ZSCORE | 返回有序集中,成员的分数值 |
| ZUNIONSTORE | 计算一个或多个有序集的并集,并存储在新的 key 中 |
| ZSCAN | 迭代有序集合中的元素(包括元素成员和元素分值) |
事务
Redis 事务的执行并不是原子性的。
192.168.108.133:6379> multi
(error) DENIED Redis is running in protected mode because protected mode is enabled
解决方法:关闭保护模式
vim redis.conf
protected-mode no
重启redis
实例
127.0.0.1:6379> MULTI
OK
127.0.0.1:6379> EXEC
(empty array)
127.0.0.1:6379> MULTI
OK
127.0.0.1:6379> SET rediscomcn redis
QUEUED
127.0.0.1:6379> GET rediscomcn
QUEUED
127.0.0.1:6379> INCR visitors
QUEUED
127.0.0.1:6379> EXEC
1) OK
2) "redis"
3) (integer) 1
redis-check-aof 工具
| 命令 | 描述 |
|---|---|
| DISCARD | 取消事务,放弃执行事务块内的所有命令 |
| EXEC | 执行所有事务块内的命令 |
| MULTI | 标记一个事务块的开始 |
| UNWATCH | 取消 WATCH 命令对所有 key 的监视 |
| WATCH | 监视一个(或多个) key |
Redis脚本
使用 Lua 解释器来执行脚本
连接命令
| 命令 | 描述 |
|---|---|
| AUTH password | 验证密码是否正确 |
| ECHO message | 打印字符串 |
| PING | 查看服务是否运行 |
| QUIT | 关闭当前连接 |
| SELECT index | 切换到指定的数据库 |
管理 redis 服务相关命令
| 命令 | 描述 |
|---|---|
| BGREWRITEAOF | 异步执行一个 AOF(AppendOnly File) 文件重写操作 |
| BGSAVE | 在后台异步保存当前数据库的数据到磁盘 |
| CLIENT | 关闭客户端连接 |
| CLIENT LIST | 获取连接到服务器的客户端连接列表 |
| CLIENT GETNAME | 获取连接的名称 |
| CLIENT PAUSE | 在指定时间内终止运行来自客户端的命令 |
| CLIENT SETNAME | 设置当前连接的名称 |
| CLUSTER SLOTS | 获取集群节点的映射数组 |
| COMMAND | 获取 Redis 命令详情数组 |
| COMMAND COUNT | 获取 Redis 命令总数 |
| COMMAND GETKEYS | 获取给定命令的所有键 |
| TIME | 返回当前服务器时间 |
| COMMAND INFO | 获取指定 Redis 命令描述的数组 |
| CONFIG GET | 获取指定配置参数的值 |
| CONFIG REWRITE | 修改 redis.conf 配置文件 |
| CONFIG SET | 修改 redis 配置参数,无需重启 |
| CONFIG RESETSTAT | 重置 INFO 命令中的某些统计数据 |
| DBSIZE | 返回当前数据库的 key 的数量 |
| DEBUG OBJECT | 获取 key 的调试信息 |
| DEBUG SEGFAULT | 让 Redis 服务崩溃 |
| FLUSHALL | 删除所有数据库的所有 key |
| FLUSHDB | 删除当前数据库的所有 key |
| INFO | 获取 Redis 服务器的各种信息和统计数值 |
| LASTSAVE | 返回最近一次 Redis 成功将数据保存到磁盘上的时间 |
| MONITOR | 实时打印出 Redis 服务器接收到的命令,调试用 |
| ROLE | 返回主从实例所属的角色 |
| SAVE | 异步保存数据到硬盘 |
| SHUTDOWN | 异步保存数据到硬盘,并关闭服务器 |
| SLAVEOF | 将当前服务器转变从属服务器(slave server) |
| SLOWLOG | 管理 redis 的慢日志 |
| SYNC | 用于复制功能 ( replication ) 的内部命令 |
备份和恢复
备份
SAVE 命令创建当前数据库的备份
127.0.0.1:6379> SAVE
OK
执行 SAVE 后会生成dump.rdb 文件。
[root@master src]# find -name "dump.rdb"
./dump.rdb
恢复
将 Redis 备份文件(dump.rdb)移动到 Redis 目录中并启动服务器
查找 Redis 的安装目录
127.0.0.1:6379> config get dir
1) "dir"
2) "/root/redis-stable/src"
BGSAVE
安全
身份验证 为实例设置密码
127.0.0.1:6379> config get requirepass
1) "requirepass"
2) ""
127.0.0.1:6379> config set requirepass “javatpoint123”
OK
127.0.0.1:6379> CONFIG get requirepass
1) "requirepass"
2) "\xe2\x80\x9cjavatpoint123\xe2\x80\x9d"
127.0.0.1:6379>
验证时,有如下报错
127.0.0.1:6379> AUTH javatpoint123
(error) WRONGPASS invalid username-password pair
原因:
1:Redis6.0之前的使用方式,默认用户。兼容旧版本Redis的支持
AUTH <password>
2:新方式,还需要验证用户名
AUTH <username> <password>
查看 redis 版本
# 服务端
[root@master ~]# cd redis-stable/src/
[root@master src]# ./redis-server -v
Redis server v=6.0.9 sha=00000000:0 malloc=jemalloc-5.1.0 bits=64 build=a207ee3c635211f0
[root@master src]# ./redis-server --version
Redis server v=6.0.9 sha=00000000:0 malloc=jemalloc-5.1.0 bits=64 build=a207ee3c635211f0
# 客户端
127.0.0.1:6379> info
# Server
redis_version:6.0.9
为实例设置密码及验证
127.0.0.1:6379> ACL SETUSER zhoujy on >abc
OK
127.0.0.1:6379> ACL SETUSER zhoujy on #6d970874d0db767a7058798973f22cf6589601edab57996312f2ef7b56e5584d
OK
127.0.0.1:6379> ACL GETUSER zhoujy
1) "flags"
2) 1) "on"
3) "passwords"
4) 1) "ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad"
2) "6d970874d0db767a7058798973f22cf6589601edab57996312f2ef7b56e5584d"
5) "commands"
6) "-@all"
7) "keys"
8) (empty array)
127.0.0.1:6379> AUTH zhoujy abc
OK
127.0.0.1:6379> AUTH zhoujy cba
OK
基准测试
检查 Redis 的性能
| 选项 | 描述 | 默认值 |
|---|---|---|
| -h | 指定服务器主机名 | 127.0.0.1 |
| -p | 指定服务器端口 | 6379 |
| -s | 指定服务器 socket | |
| -c | 指定并发连接数 | 50 |
| -n | 指定请求数 | 10000 |
| -d | 以字节的形式指定 SET/GET 值的数据大小 | 2 |
| -k | 1keep alive 0reconnect | 1 |
| -r | SET/GET/INCR 使用随机 key, SADD 使用随机值 | |
| -p | 通过管道传输 请求 | 1 |
| -q | 强制退出 redis。仅显示 query/sec 值 | |
| --csv | 以 CSV 格式输出 | |
| -l | 生成循环,永久执行测试 | |
| -t | 仅运行以逗号分隔的测试命令列表 | |
| -I | Idle 模式。仅打开 N 个 idle 连接并等待 |
例子:
[root@master src]# ./redis-benchmark -h 127.0.0.1 -p 6379 -t set,lpush -n 100000 -q
ERROR: NOAUTH Authentication required.
ERROR: failed to fetch CONFIG from 127.0.0.1:6379
WARN: could not fetch server CONFIG
SET: 183823.52 requests per second
LPUSH: 182815.36 requests per second
客户端连接
最大客户端数
127.0.0.1:6379> Config get maxclients
(error) NOPERM this user has no permissions to run the 'config' command or its subcommand
解决方法: ?
| 命令 | 描述 |
|---|---|
| CLIENT LIST | 返回连接到 redis 服务的客户端列表 |
| CLIENT SETNAME | 设置当前连接的名称 |
| CLIENT GETNAME | 获取通过 CLIENT SETNAME 命令设置的服务名称 |
| CLIENT PAUSE | 挂起客户端连接,指定挂起的时间以毫秒计 |
| CLIENT KILL | 关闭客户端连接 |