Redis 学习笔记--从部署到实战

641 阅读15分钟

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
-k1keep alive 0reconnect1
-rSET/GET/INCR 使用随机 key, SADD 使用随机值
-p通过管道传输 请求1
-q强制退出 redis。仅显示 query/sec 值
--csv以 CSV 格式输出
-l生成循环,永久执行测试
-t仅运行以逗号分隔的测试命令列表
-IIdle 模式。仅打开 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关闭客户端连接

Redis Pipelining 流水线

redis分区