redis
1. 安装
1. 下载
官网
redis.io
历史下载链接
https://download.redis.io/releases/
2. 编译
采用alpine
系统
# 更新系统
$ apk add update
$ apk add upgrade
# 安装对应组件
$ apk add make gcc g++ gcc-c++ linux-headers tcl
# 下载redis, 这里采用4.09
$ wget https://download.redis.io/releases/redis-4.0.9.tar.gz
# 解压
$ tar -xvf redis-4.0.9.tar.gz
# 编译
$ cd redis-4.0.9
$ make
$ make test
# 安装编译好的
$ apk add redis=5.0.11-r0
# 开机自启
$ rc-update add redis
2. 配置
1. Redis 可执行文件说明
1. V5.0版本可执行文件说明
可执行文件 | 作用 |
---|---|
redis-benchmark | Redis 基准测试工具 |
redis-check-aof | Redis AOF 持久化文件检测和修复工具 |
redis-check-rdb | Redis RDB 持久化文件检测和修复工具 |
redis-cli | Redis 命令行客户端 |
redis-sentinel | 启动 Redis Sentinel |
redis-server | 启动 Redis |
2. V3.0版本可执行文件说明
可执行文件 | 作用 |
---|---|
redis-benchmark | Redis 基准测试工具 |
redis-check-aof | Redis AOF 持久化文件检测和修复工具 |
redis-check-dump | Redis RDB 持久化文件检测和修复工具 |
redis-cli | Redis 命令行客户端 |
redis-sentinel | 启动 Redis Sentinel |
redis-server | 启动 Redis |
2. 启动 Redis
有三种方式启动Redis默认配置, 运行配置, 配置文件启动
1. 默认配置
这种方法会使用Redis的默认配置来启动
$ redis-server
22933:C 22 Apr 2021 17:14:51.126 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
22933:C 22 Apr 2021 17:14:51.127 # Redis version=5.0.11, bits=64, commit=a980b7f2, modified=0, pid=22933, just started
22933:C 22 Apr 2021 17:14:51.127 # Warning: no config file specified, using the default config. In order to specify a config file use redis-server /path/to/redis.conf
22933:M 22 Apr 2021 17:14:51.128 * Increased maximum number of open files to 10032 (it was originally set to 1024).
_._
_.-``__ ''-._
_.-`` `. `_. ''-._ Redis 5.0.11 (a980b7f2/0) 64 bit
.-`` .-```. ```\/ _.,_ ''-._
( ' , .-` | `, ) Running in standalone mode
|`-._`-...-` __...-.``-._|'` _.-'| Port: 6379
| `-._ `._ / _.-' | PID: 22933
`-._ `-._ `-./ _.-' _.-'
|`-._`-._ `-.__.-' _.-'_.-'|
| `-._`-._ _.-'_.-' | http://redis.io
`-._ `-._`-.__.-'_.-' _.-'
|`-._`-._ `-.__.-' _.-'_.-'|
| `-._`-._ _.-'_.-' |
`-._ `-._`-.__.-'_.-' _.-'
`-._ `-.__.-' _.-'
`-._ _.-'
`-.__.-'
22933:M 22 Apr 2021 17:14:51.128 # Server initialized
22933:M 22 Apr 2021 17:14:51.129 * Ready to accept connections
当前 Redis 版本是 5.0.11Redis 默认端口是 6479
Warning 建议以配置文件来启动
2. 运行配置
# 使用其他端口启动 Redis
$ redis-server --port 6380
如果有很多配置需要修改的话, 使用
配置文件
更佳
3. 配置文件启动
Redis目录下都会有一个redis.conf配置文件一般会在一台机器上面启动多个redis, 并且配置集中管理在指定目录下
4. Redis 设置
# 写入参数
$ echo "vm.overcommit_memory = 1">> /etc/sysctl.conf
# 生效
$ sysctl -p
3. Redis 命令行客户端
1. 交互式方式
通过
redis-cli -h{host} -p{prot}
的方式连接到Redis服务
$ redis-cli -h 127.0.0.1 -p 6379
127.0.0.1:6379> set hello world
OK
127.0.0.1:6379> get hello
"world"
2. 命令方式
通过
redis-cli -h{host} -p{port} {command}
直接返回命令结果
$ redis-cli -h 127.0.0.1 -p 6379 get hello
3. 停止Redis服务
# 停止不生成持久化文件
$ redis-cli shutdown
28552:M 22 Apr 2021 18:47:03.306 # User requested shutdown...
28552:M 22 Apr 2021 18:47:03.306 * Saving the final RDB snapshot before exiting.
28552:M 22 Apr 2021 18:47:03.307 * DB saved on disk
28552:M 22 Apr 2021 18:47:03.307 # Redis is now ready to exit, bye bye...
# 停止, 生成持久化文件
$ redis-cli shutdown {nosave|save}
- Redis关闭的过程: 断开与客户端的连接, 持久化文件生成, 是一种相对优雅的关闭方式
- 除了通过
shutdown
方式外, 也可以使用kill
方式关闭, 尽量不要使用kill -9
的方式关闭 - shudown还有一个参数, 代表是否在关闭前, 生成持久化文件
4. Redis版本说明
非稳定版本: 2.7, 2.9, 3.1稳定版本: 2.6, 2.8, 3.0, 3.2
3. 使用
1. 相关命令
Redis有5种数据结构, 它们是键值对中的值, 对于键来说有一些通用的命令在线上环境中, 禁止使用查看所有键
keys
, 使用desize
1. 查询所有键
$ redis-cli -h 127.0.0.1 -p 6379
# 插入字符串类型的键值对
$ set hello world
ok
$ set java jvm
ok
$ keys *
1) "hellow"
2) "java"
2. 查询键总数
$ dbsize
(integer) 2
# 插入一个列表类型的键值对(值是多个元素组成)
$ rpush mylist a b c d e f g
(integer) 7
$ dbsize
(integer) 3
3. 检测键是否存在
# exists key
$ exists hello
(integer) 1
$ exists aa
(integer) 0
4. 删除键
del
是一个通用的命令, 无论值是什么数据结构类型,del
命令都能删除同时
del
命令可以删除多个键
# del key [key ...]
$ del hello
(integer) 1
5. 设置键过期
Redis 支持对键添加过期时间, 当超过过期时间后, 会自动删除键
# expire key time
$ set hello world
ok
$ expire hello 10
(integer) 1
6. 查询键过期
ttl
命令会返回键的剩余过期时间, 它有三种返回值大于等于0的证书: 键剩余的过期时间
-1: 键没设置过期时间
-2: 键不存在
$ ttl hello
(integer) -2
# 返回结果为-2, 说明键 hello 已经被删除
$ set hello world
OK
$ ttl hello
(integer) -1
# 返回将结果为-1, 说明键 hello 没有设置过期时间
$ expire hello 20
(integer) 1
$ ttl hello
(integer) 13
# 返回大于等于0以上的数字, 说明键 hello 有设置过期时间,并且剩余时间 13s
# 等待20s后查询
$ ttl hello
(integer) -2
# 返回结果为-2, 说明键 hello 已经被删除
7. 键的数据结构类型
type key
# 设置string类型的键值对
$ set a b
OK
# 结果与设置的一致
$ type a
string
# 设置list类型的键值对
$ rpush mylist1 a b c d e f g
(integer) 7
# 结果与设置一致
$ type mylist1
list
$ type aaaa
none
2. 数据结构和内部编码
type
命令实际返回的是当前键的数据结构类型, 分别有string(字符串), hash(哈希), list(列表), set(集合), zset(有序集合)
通过
object encoding
查询内部编码
$ object encoding java
"embstr"
$ object encoding mylist
"quicklist"
- 数据结构
内部编码
quicklist
结合了ziplist
和linkedlist
两者的优势- list -> quicklist(快速列表)
3. 单线程架构
Redis使用了单线程架构和I/O多路复用模型来实现高性能内存数据库服务
1. 引出单线程模型
Redis客户端与服务端的模型可以简化为如下所示每次客户端调用都经历了发送命令, 执行命令, 返回结果三个过程
Redis
客户端与服务端请求过程- 所有命令在一个队列里排队等待被执行
- 不存在多个命令被同时执行的情况
现在开启了三个redis-cli
客户端同时执行命令
客户端1设置一个字符串键值对
$ set hello world
客户端2设置对counter做自增操作
$ incr counter
客户端3对counter做自增操作
$ incr counter
2. 单线程解析
通常来讲. 单线程要比多线程差, 但是在redis中, 有以下优势
- 纯内存访问
- 非阻塞I/O
- 单线程避免了线程切换和竞态生产的消耗
4. 字符串
字符串类型是 Redis 最基础的数据结构
4. 使用技巧
1. 慢查询分析
客户端命令的生命周期
- 发送命令
- 命令排队
- 命令执行
- 返回结果
慢查询统计命令执行的时间
2. 慢查询命令
有两种方法, 配置文件修改和慢查询showlog-log-slower-than=0 记录所有命令
showlog-log-slower-than<0 不会记录任何命令
slowlog-max-len 慢日志最多存储多少条
1. 配置文件
2. 命令行
# 在执行时间大于20000微秒时会被记录
$ config set slowlog-log-slower-than 20000
# 1000条
$ config set slowlog-max-len 1000
$ config rewrite
3. 查询慢日志
# slowlog get [n]
# 查询所有慢日志
$ slowlog get
# id 发生时间戳 命令耗时 执行参数和命令
1) 1) (integer) 666
2) (integer) 1456786500
3) (integer) 11615
4) 1) "BGREWRITEAOF"
# 获取慢日志列表的长度
# slowlog len
$ slowlog len
(integer) 45
# 重置慢日志
$ slowlog reset
5. 设置内存, 并发
1. 设置并发
1. 系统相关设置
# 设置最大打开文件数
# Centos7
# 两种方式
# 非systemd启动
# 临时生效
$ ulimit -n
# 永久生效
$ echo "redis soft nofile 10000
redis hard nofile 10000">> /etc/security/limits.conf
# systemd启动
vim /usr/lib/systemd/system/redis.service
[Service]
LimitNOFILE=65536
# 重启daemon
$ systemctl daemon-reload
2. Redis 设置
2.6之后, 2.6之前需要注意
- 查看连接数
# 查看最大连接数
$ config get maxclients
1) "maxclients"
2) "10000"
# 查看当前连接数
$ info clients
# Clients
connected_clients:1
client_recent_max_input_buffer:2
client_recent_max_output_buffer:0
blocked_clients:0
- 设置最大连接数
# 临时生效最大连接数
# 目前设置为200
$ config set maxclients 200
# 永久设置, 重启生效
$ vim /etc/redis.conf
maxclients 10000
# 配合生效
# 先在线设置最大链接数, 然后在配置文件中修改, 重启后依然生效
2. 设置内存
1. 查询内存
$ info memory
# Memory
used_memory:818295
# 已经使用了的内存大小, 包括redis进程内部开销和你的cache的数据所占用的内存, 单位byte
used_memory_human:799.12K
# 用户数据所占用的内存, 就是你缓存的数据的大小
used_memory_rss:2449408
# 表示redis物理内存的大小, 即向OS申请了多少内存
used_memory_rss_human:2.34M
used_memory_peak:818295
# redis内存使用的峰值
used_memory_peak_human:799.12K
used_memory_peak_perc:100.00%
used_memory_overhead:817569
used_memory_startup:767579
used_memory_dataset:726
used_memory_dataset_perc:1.43%
allocator_allocated:785461
allocator_active:2411520
allocator_resident:2411520
total_system_memory:2093330432
total_system_memory_human:1.95G
used_memory_lua:37888
# redis lua内存使用的峰值
used_memory_lua_human:37.00K
used_memory_scripts:0
used_memory_scripts_human:0B
number_of_cached_scripts:0
maxmemory:0
maxmemory_human:0B
maxmemory_policy:noeviction
allocator_frag_ratio:3.07
allocator_frag_bytes:1626059
allocator_rss_ratio:1.00
allocator_rss_bytes:0
rss_overhead_ratio:1.02
# 内存碎片率
# >1 表示有碎片, 越大表明越多
# <1 表示使用虚拟内存
# 一般来说, 在1~1.5之间最好
rss_overhead_bytes:37888
mem_fragmentation_ratio:3.12
mem_fragmentation_bytes:1663947
mem_not_counted_for_evict:0
mem_replication_backlog:0
mem_clients_slaves:0
mem_clients_normal:49694
mem_aof_buffer:0
mem_allocator:libc
# 在编译时指定的Redis使用的内存分配器
# libc、jemalloc、tcmalloc, 默认是jemalloc
active_defrag_running:0
lazyfree_pending_objects:0
2. 设置内存
# 单位大小bytes
# 临时生效
$ config set maxmemory
# 永久生效(需要重启)
$ vim /etc/redis
# 设置1GB, 需要转化为bytes=1073741824
maxmemory 1073741824