一、声明
本文为整理的学习笔记,主要内容来自与redis学习中的那些参考资料。
这些学习资料里面最详细的是《redis核心技术与实战》和《可能是北半球最全面的Redis6.x系列文章》,都是很详细的讲解redis。
因为时间、以及文字表达能力有限,所以文中有很多内容就直接摘抄使用了原文。有一些地方有标记,有一些地方没有标记。
如果转载此文章,需要把参考资料中的所有链接都标记上。
二、redis是什么?
redis是一个基于BSD许可的开源内存数据结构存储,可以用作数据库、缓存和消息代理。
redis支持的数据结构:
- strings
- hashes
- lists
- sets
- sorted sets with range queries
- bitmaps
- hyperloglogs
- geospatial indexes
- streams
redis支持主从同步和分片集群、支持数据持久化、支持lua脚本、LRU eviction、事物。
三、redis的资料
四、redis搭建(单节点)
1. 安装依赖包
下载的是最新稳定版本,如果需要非最新版,则可以从官网下载指定版本。
yum -y install gcc
yum -y install libc
2. 下载安装redis
下载的是最新稳定版本,如果需要非最新版,则可以从官网下载指定版本。
cd /opt;
mkdir /opt/redis/;
wget http://download.redis.io/redis-stable.tar.gz;
tar xvzf redis-stable.tar.gz;
cd redis-stable;
make
3. 启动3.1
拷贝命令和配置文件
cp src/redis-server src/redis-cli src/redis-sentinel src/redis-benchmark src/redis-check-aof src/redis-check-rdb /opt/redis; cp redis.conf /opt/redis;
3.2 修改配置文件
daemonize no 修改为 daemonize yes; bind 127.0.0.1 -::1 修改为 bind 0.0.0.0; #需要使用vip6的,则把ipv6地址加上即可。
3.3 启动redis
/opt/redis/redis-server /opt/redis/redis.conf;
4. 安装完成后的命令
命令在解压后的redis目录的src目录下面。
- redis-server is the Redis Server itself.
- redis-sentinel is the Redis Sentinel executable (monitoring and failover).
- redis-cli is the command line interface utility to talk with Redis.
- redis-benchmark is used to check Redis performances.
- redis-check-aof and redis-check-rdb (redis-check-dump in 3.0 and below) are useful in the rare event of corrupted data files.
5. redis配置文件
1. Redis默认不是以守护进程的方式运行,可以通过该配置项修改,使用yes启用守护进程
daemonize no
2. 当Redis以守护进程方式运行时,Redis默认会把pid写入/var/run/redis.pid文件,可以通过pidfile指定
pidfile /var/run/redis.pid
3. 指定Redis监听端口,默认端口为6379,作者在自己的一篇博文中解释了为什么选用6379作为默认端口,因为6379在手机按键上MERZ对应的号码,而MERZ取自意大利歌女Alessia Merz的名字
port 6379
4. 绑定的主机地址
bind 127.0.0.1
5.当客户端闲置多长时间后关闭连接,如果指定为0,表示关闭该功能
timeout 300
6. 指定日志记录级别,Redis总共支e持四个级别:debug、verbose、notice、warning,默认为verbose
loglevel verbose
7. 日志记录方式,默|认为标准输出,如果配置Redis为守护进程方式运行,而这里又配置为日志记录方式为标准输出,则日志将会发送给/dev/null
logfile stdout
8. 设置数据库的数量,默认数据库为0,可以使用SELECT <dbid>命令在连接上指定数据库id
databases 16
9. 指定在多长时间内,有多少次更新操作,就将数据同步到数据文件,可以多个条件配合
save <seconds> <changes>
Redis默认配置文件中提供了三个条件:
save 900 1
save 300 10
save 60 10000
分别表示900秒(15分钟)内有1个更改,300秒(5分钟)内有10个更改以及60秒内有10000个更改。
10. 指定存储至本地数据库时是否压缩数据,默认为yes,Redis采用LZF压缩,如果为了节省CPU时间,可以关闭该选项,但会导致数据库文件变的巨大
rdbcompression yes
11. 指定本地数据库文件名,默认值为dump.rdb
dbfilename dump.rdb
12. 指定本地数据库存放目录
dir ./
13. 设置当本机为slav服务时,设置master服务的IP地址及端口,在Redis启动时,它会自动从master进行数据同步
slaveof <masterip> <masterport> #旧版命令
replicaof <masterip> <masterport> #新版命令
14. 当master服务设置了密码保护时,slav服务连接master的密码
masterauth <master-password>
15. 设置Redis连接密码,如果配置了连接密码,客户端在连接Redis时需要通过AUTH <password>命令提供密码,默认关闭
requirepass foobared
16. 设置同一时间最大客户端连接数,默认无限制,Redis可以同时打开的客户端连接数为Redis进程可以打开的最大文件描述符数,如果设置 maxclients 0,表示不作限制。当客户端连接数到达限制时,Redis会关闭新的连接并向客户端返回max number of clients reached错误信息
maxclients 128
17. 指定Redis最大内存限制,Redis在启动时会把数据加载到内存中,达到最大内存后,Redis会先尝试清除已到期或即将到期的Key,当此方法处理 后,仍然到达最大内存设置,将无法再进行写入操作,但仍然可以进行读取操作。Redis新的vm机制,会把Key存放内存,Value会存放在swap区
maxmemory <bytes>
18. 指定是否在每次更新操作后进行日志记录,Redis在默认情况下是异步的把数据写入磁盘,如果不开启,可能会在断电时导致一段时间内的数据丢失。因为 redis本身同步数据文件是按上面save条件来同步的,所以有的数据会在一段时间内只存在于内存中。默认为no
appendonly no
19. 指定更新日志文件名,默认为appendonly.aof
appendfilename appendonly.aof
20. 指定更新日志条件,共有3个可选值:
no:表示等操作系统进行数据缓存同步到磁盘(快)
always:表示每次更新操作后手动调用fsync()将数据写到磁盘(慢,安全)
everysec:表示每秒同步一次(折衷,默认值)
appendfsync everysec
21. 指定是否启用虚拟内存机制,默认值为no,简单的介绍一下,VM机制将数据分页存放,由Redis将访问量较少的页即冷数据swap到磁盘上,访问多的页面由磁盘自动换出到内存中(在后面的文章我会仔细分析Redis的VM机制)
vm-enabled no
五、客户端测试连接
1 连接redis服务器
/opt/redis/redis-cli -h 127.0.0.1 -p 6379 # 对于配置了acl的redis登陆。
redis-cli --user xxx --pass yyy
4.2 进入redis交互后
info #查看redis信息
4.3 查看redis客户端工具用法
/opt/redis/redis-cli --help
六、常用命令(摘自王义凯_Rick博客)
1 查看当前redis中所有可用命令
127.0.0.1:6379> command
1.1 使用command count命令查看当前Redis中命令的数量
127.0.0.1:6379>command count
1.2 使用command info命令查看当前Redis中指定的命令的详细信息:
127.0.0.1:6379> COMMAND INFO get
1) 1) "get"
2) (integer) 2
3) 1) readonly
2) fast
4) (integer) 1
5) (integer) 1
6) (integer) 1
7) 1) @read
2) @string
3) @fast
2 服务连接
2.1 连接redis
- -h 指定redis服务主机,默认为当前服务器。
- -p 指定端口,默认为6379
- -a 指定密码,默认无密码
- -u 指定用户。6.0版本新增了acl权限控制,如果配置了用户名和密码则使用此登陆。
# 连接成功
[root@localhost redis]# ./redis-cli -h 192.168.1.1 -p 6379 -a password
127.0.0.1:6379>
# 连接失败
[root@localhost redis]# ./redis-cli -h 192.168.1.1 -p 6379 -a password
Could not connect to Redis at 127.0.0.1:6389: Connection refused
not connected>
2.2 验证redis服务是否正常
使用PING命令,返回PONG,则代表redis服务正常。
127.0.0.1:6379> PING
PONG
3 查看服务器信息
使用info明林可以查看redis服务的信息,里面有以下的信息(详细信息没有摘录)。
127.0.0.1:6379> info
# Server
# Clients
# Memory
# Persistence
# Stats
# Replication
# CPU
# Modules
# Errorstats
# Cluster
# Keyspace
也可以使用info xx来查看指定的某个内容,比如info server查看服务的内容。
127.0.0.1:6379> info server
# Server
redis_version:6.2.6
redis_git_sha1:00000000
redis_git_dirty:0
redis_build_id:7b38e6eb6ac5051f
redis_mode:standalone
os:Linux 3.10.0-862.el7.x86_64 x86_64
arch_bits:64
multiplexing_api:epoll
atomicvar_api:atomic-builtin
gcc_version:4.8.5
process_id:9580
process_supervised:no
run_id:b05097542fe9c9cdd9c0f394c1723c7997c0eab8
tcp_port:6379
server_time_usec:1636944465254864
uptime_in_seconds:323693
uptime_in_days:3
hz:10
configured_hz:10
lru_clock:9554513
executable:/opt/redis/redis-server
config_file:/opt/redis/redis.conf
io_threads_active:0
4 常用key命令
查看所有key
keys * #线上不要使用,会影响性能
查看key的类型
type key
随机返回一个key
randomkey
删除key
返回删除状态1/0,True/False:
del key [key2 key3 key4...]
过期策略
给指定的 key 设置过期时间,以秒或unix timestamp为单位:
expire key seconds
expireat key timestamp
移除 key 的过期时间,key 将持久保持:
persist key
以秒为单位,返回给定 key 的剩余生存时间(TTL, time to live):
ttl key
以毫秒为单位返回 key 的剩余生存时间:
pttl key
统计key的数量
127.0.0.1:6379> dbsize (integer) 2
127.0.0.1:6379> keys * 1) "xxx" 2) "test"
5 配置相关
5.1 查看配置信息
127.0.0.1:6379> config get port #查看端口
1) "port"
2) "6379"
127.0.0.1:6379> config get max* #查看max开头的配置项
1) "maxmemory-policy"
2) "noeviction"
3) "maxmemory-samples"
4) "5"
5) "maxmemory-eviction-tenacity"
6) "10"
7) "maxclients"
8) "10000"
9) "maxmemory"
10) "0"
127.0.0.1:6379> config get * #查看所有配置
1) "rdbchecksum"
2) "yes"
5.2 修改配置
命令格式
config set parameter value
使用config set命令可以动态调整redis服务器的配置。修改后,可以使用config rewrite命令将新的配置写入配置文件,这样下次启动,就是新配置了,否则会是旧配置。
[root@localhost redis]# ./redis-cli -p 6379
127.0.0.1:6379> config get slowlog-max-len # 查看slowlog-max-len参数值
1) "slowlog-max-len"
2) "128"
127.0.0.1:6379> config set slowlog-max-len 256 # 设置slowlog-max-len参数值
OK
127.0.0.1:6379> config get slowlog-max-len # 查看slowlog-max-len参数值,可以看到已经是新的配置。
1) "slowlog-max-len"
2) "256"
127.0.0.1:6379> exit
[root@localhost redis]# ./redis-cli -p 6379 # 查看slowlog-max-len参数值,重新连接也是新的配置。
127.0.0.1:6379> config get slowlog-max-len
1) "slowlog-max-len"
2) "256"
127.0.0.1:6379> config rewrite # 将修改的配置写入配置文件。
OK
127.0.0.1:6379>
[root@localhost redis]# cat redis.conf |grep -v '#'|grep slowlog-max-len # 查看配置文件,可以配置文件记录的是新的配置值。
slowlog-max-len 256
6 重置统计信息
使用Config Resetstat 命令重置 INFO 命令中的某些统计数据,包括:
- Keyspace hits (键空间命中次数)
- Keyspace misses (键空间不命中次数)
- Number of commands processed (执行命令的次数)
- Number of connections received (连接服务器的次数)
- Number of expired keys (过期key的数量)
- Number of rejected connections (被拒绝的连接数量)
- Latest fork(2) time(最后执行 fork(2) 的时间)
- The aof_delayed_fsync counter(aof_delayed_fsync 计数器的值)
127.0.0.1:6379> CONFIG RESETSTAT OK
7 切换数据库
redis共有16个db,从db0~db15,使用select index命令在数据库之间进行切换:
127.0.0.1:6379> select 0 OK
8 获取当前时间
Time 命令用于返回当前服务器时间,返回一个包含两个字符串的列表: 第一个字符串是当前时间(以 UNIX 时间戳格式表示),而第二个字符串是当前这一秒钟已经逝去的微秒数。
127.0.0.1:6379> time 1) "1636946890" 2) "276444"
9 DEBUG
debug object key获取 key 的调试信息,当key不存在时返回错误信息。
debug segfault 命令执行一个非法的内存访问从而让 Redis 崩溃,仅在开发时用于 BUG 调试,执行后需要重启服务。
127.0.0.1:6379> debug object xxx
Value at:0x7f625540e720 refcount:1 encoding:embstr serializedlength:6 lru:9230820 lru_seconds_idle:326146
127.0.0.1:6379>debug segfault
10 数据持久化
异步AOF重写
执行一个异步的AOF(append only file)文件重写。
127.0.0.1:6379>BGREWRITEAOF
同步RDB持久化数据到磁盘
同步地将redis中的数据持久化到磁盘:
127.0.0.1:6379>save
异步RDB持久化数据到磁盘
异步将redis中的数据持久化到磁盘:
127.0.0.1:6379>BGSAVE
查看上次RDB持久化时间
使用lastsave命令查看上次持久化到磁盘的时间:
127.0.0.1:6379>lastsave
11清空库
flushdb清空当前数据库下的所有数据。
flushall清空所有库下的所有数据。
127.0.0.1:6379> flushdb
(error) READONLY You can't write against a read only replica.
127.0.0.1:6379> flushall
(error) READONLY You can't write against a read only replica. # 因为在从库执行的,所以不允许
12 监控
monitor命令用于监听redis服务器接收到的所有命令:
127.0.0.1:6379> monitor
OK
1636947155.606965 [0 192.168.2.151:39364] "PING"
1636947155.692873 [0 192.168.2.152:52732] "PUBLISH" "__sentinel__:hello" "192.168.2.152,26379,14e490939d4b0e10b96ad05e4d8837e2b5720137,3,mymaster,192.168.2.154,6379,3"
1636947155.810139 [0 192.168.2.151:39364] "PUBLISH" "__sentinel__:hello" "192.168.2.151,26379,abc469e9b9b952ab8c8f9ab9a502ed92fbcd8d23,3,mymaster,192.168.2.154,6379,3"
1636947155.810524 [0 192.168.2.154:6379] "PUBLISH" "__sentinel__:hello" "192.168.2.151,26379,abc469e9b9b952ab8c8f9ab9a502ed92fbcd8d23,3,mymaster,192.168.2.154,6379,3"
13 关闭服务器
异步的将数据持久化到磁盘后关闭服务器:
127.0.0.1:6379>SHUTDOWN [NOSAVE|SAVE]