redis深入学习笔记
redis的安装
- 安装包下载
官网地址https://redis.io/
右键获取下载地址,如下图:
- 创建下载目录并下载安装包
cd /usr/local
mkdir redis
cd redis
wget http://download.redis.io/releases/redis-5.0.8.tar.gz
- 解压缩
tar -zxvf redis-5.0.8.tar.gz
- make
cd redis-5.0.8
make
- make install
make install
默认安装到/usr/local/bin
日志功能
redis.conf文件中的配置
# 日志级别
loglevel notice
# 日志文件路径
logfile /usr/local/bin/redis_6379.log
redis 持久化
RDB
快照物理日志
优点:恢复数据块
缺点:数据可能会丢失
AOF
逻辑日志
优点:丢失数据较少
缺点:恢复数据慢
持久化的监控
./redis-cli -a ffcsffcs info|grep rdb
rdb_changes_since_last_save:0 上次RDB保存后,变化的key的个数
rdb_bgsave_in_progress:0 当前是否正在进行bgsave操作 1表示正在进行RDB的快照 0表示没有进行RDB的快照
rdb_last_save_time:1537240803 上次RDB文件的时间戳
rdb_last_bgsave_status:ok 上次RDB执行的状态
rdb_last_bgsave_time_sec:-1 上次执行RDB耗时
rdb_current_bgsave_time_sec:-1 目前保存RDB快照已经花费的时间
./redis-cli -a ffcsffcs info|grep aof
mem_aof_buffer:102
aof_enabled:1
aof_rewrite_in_progress:0
aof_rewrite_scheduled:0
aof_last_rewrite_time_sec:-1
aof_current_rewrite_time_sec:-1
aof_last_bgrewrite_status:ok
aof_last_write_status:ok
aof_last_cow_size:0
aof_current_size:921
aof_base_size:870
aof_pending_rewrite:0
aof_buffer_length:0
aof_rewrite_buffer_length:0
aof_pending_bio_fsync:0
aof_delayed_fsync:0
Redis的内存设置
./redis-cli -a ffcsffcs info | grep mem
used_memory:875944
used_memory_human:855.41K
used_memory_rss:4136960
used_memory_rss_human:3.95M
used_memory_peak:875944
used_memory_peak_human:855.41K
used_memory_peak_perc:100.00%
used_memory_overhead:858398
used_memory_startup:791416
used_memory_dataset:17546
used_memory_dataset_perc:20.76%
total_system_memory:1927938048
total_system_memory_human:1.80G
used_memory_lua:37888
used_memory_lua_human:37.00K
used_memory_scripts:0
used_memory_scripts_human:0B
maxmemory:0
maxmemory_human:0B
maxmemory_policy:noeviction
mem_fragmentation_ratio:5.09
mem_fragmentation_bytes:3324176
mem_not_counted_for_evict:102
mem_replication_backlog:0
mem_clients_slaves:0
mem_clients_normal:66616
mem_aof_buffer:102
mem_allocator:jemalloc-5.1.0
redis 内存过期策略
-
定时删除:通过set命令来指定数据过期的时间,本质是:创建一个定时器
set命令 + 参数(过期时间) -
定期删除:主动删除
每隔一段时间执行一次删除任务
参数:hz -
惰性删除:被动删除,get key的时候做删除
redis 慢查询日志
-
什么是慢查询?慢查询日志
慢查询是慢操作,影响系统性能
慢查询日志帮助运维人员定位系统中的慢操作
是系统在命令发出执行后,计算每条命令的执行时间,如果这个执行时间超过了设置的阈值,就会被记录到慢查询日志中 -
Redis的慢查询相关参数设置
slowlog-log-slower-than 10000 命令执行的时间阈值,单位毫秒
等于0 记录所有的操作
小于0 不会记录任何操作(禁用了慢查询日志)slowlog-max-len 128 设置慢查询日志中最多存储的慢查询日志条数
-
举例
日志的组成格式:4部分
(1)ID号
(2)时间戳
(3)命令耗时
(4)命令和参数
命令:slowlog get [N]
修改时间阈值
config set slowlog-log-slower-than 10
命令: keys k*
redis的管道(pipeline)
批处理。
- 非管道处理时的用时(59661)
@ApiOperation("批量插入1000数据到redis的操作时间示例")
@GetMapping("/demo1")
public String demo1() {
long begin = System.currentTimeMillis() ;
redisTemplate.execute(new RedisCallback<Object>() {
@Override
public Object doInRedis(RedisConnection connection) throws DataAccessException {
for(int i = 0 ; i<1000; i++) {
connection.set(("set"+i).getBytes(),String.valueOf(i).getBytes()) ;
System.out.println("set"+i);
}
return null;
}
}) ;
long end = System.currentTimeMillis() ;
System.out.println("批量插入1000数据到redis的操作时间:"+(end - begin));
return String.valueOf( end - begin );
}
2. 管道处理时的用时(172)
@ApiOperation("管道方式插入1000数据到redis的操作时间示例")
@GetMapping("/demo2")
public String demo2() {
long begin = System.currentTimeMillis() ;
redisTemplate.executePipelined(new RedisCallback<Object>() {
@Override
public Object doInRedis(RedisConnection connection) throws DataAccessException {
for(int i = 0 ; i<1000; i++) {
connection.set(("pipeline"+i).getBytes(),String.valueOf(i).getBytes()) ;
System.out.println("pipeline"+i);
}
return null;
}
}) ;
long end = System.currentTimeMillis() ;
System.out.println("管道方式插入1000数据到redis的操作时间:"+(end - begin));
return String.valueOf( end - begin );
}
Redis HyperLogLog
Redis HyperLogLog 是用来做基数统计的算法,HyperLogLog 的优点是,在输入元素的数量或者体积非常非常大时,计算基数所需的空间总是固定 的、并且是很小的。只需要12K内存就能统计2^64个数据。
实现原理具体可参考
https://www.cnblogs.com/linguanh/p/10460421.html
命令
- PFADD key element [element …]
添加指定元素到 HyperLogLog 中。 - PFCOUNT key [key …]
返回给定 HyperLogLog 的基数估算值。 - PFMERGE destkey sourcekey [sourcekey …]
将多个 HyperLogLog 合并为一个 HyperLogLog
示例
Redis 发布订阅
命令
- SUBSCRIBE channel [channel …]
订阅给定的一个或多个频道的信息。 - PUBLISH channel message
将信息发送到指定的频道
示例
Redis 事务
单个 Redis 命令的执行是原子性的,但 Redis 没有在事务上增加任何维持原子性的机制,所以 Redis 事务的执行并不是原子性的。事务可以理解为一个打包的批量执行脚本,但批量指令并非原子化的操作,中间某条指令的失败不会导致前面已做指令的回滚,也不会造成后续的指令不做。
命令
- MULTI
标记一个事务块的开始 - EXEC
执行所有事务块内的命令
示例
-
示例1
-
示例2,中间插入失败不影响前后的操作,说明不是原子性
redis cluster 配置_方式1
-
创建集群的相关文件目录
其中7000到7005 为每个节点的目录,将端口作为目录
redis-cli和redis-server是从redis安装好后的bin目录下复制过来
-
为7000到7005的目录下添加redis.config的配置文件
port 7000
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
daemonize yes
port 按照各自的端口修改
- 分别启动6个节点
../redis-server redis.conf
- 查看启动后的6个节点的进程
ps -ef|grep redis
5. 创建集群环境
该版本不需要依赖ruby的脚本来创建,直接可以使用如下命令
redis-cli --cluster create 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 --cluster-replicas 1
输入 yes
- 测试集群
- 连接集群命令 -c 表示以集群方式连接
./redis-cli -c -p 7000
- 添加key
set a av
注意此处会自动根据hash计算key应该存储到哪个slot中,并切换到该slot所在的主节点,如图会从7000端口切换到7002端口。
redis cluster 配置_方式2
使用redis提供的工具来生成集群环境
- 该工具位于redis安全文件中的utils目录下
2. 将该工具拷贝到集群目录下
- 修改该文件的配置信息,将redis-cli redis-server 的路径修改正确,下图展示出其中两处
4.使用该工具生成6个redis节点
./create-cluster start
- 使用该工具创建集群环境
./create-cluster create
-
完成创建 后面验证与方式1一致
-
停止所有节点
./create-cluster stop
- 解散并清除集群
清除所有的集群配置
./create-cluster clean
redis 集群管理
-
cluster info
-
cluster nodes
-
cluster slots
-
cluster slaves {masterid}
-
cluster getkeysinslot 15495 10
查看对应槽【15495 】的【10】个key
reids cluster 添加节点
-
按照上面配置集群的方式新配置两个7006和7007端口的redis节点服务
-
启动7006和7007节点
-
添加master节点7006
./redis-cli --cluster add-node 127.0.0.1:7006 127.0.0.1:7000
- 查看添加的7006master
./redis-cli --cluster check 127.0.0.1:7000
可以看到新增的master还没有分配槽
- 分配槽slot到新的master
./redis-cli --cluster reshard 127.0.0.1:7000
- 查看分配后的槽信息
./redis-cli --cluster check 127.0.0.1:7000
- 添加slave节点7007到master7006
redis-cli --cluster add-node 127.0.0.1:7007 127.0.0.1:7000 --cluster-slave --cluster-master-id 64e80e2d2f1765f73d79d6ea4b3b15ee4a96ec4c
redis cluster删除节点
- 删除主节点
./redis-cli --cluster del-node 127.0.0.1:7006 64e80e2d2f1765f73d79d6ea4b3b15ee4a96ec4c
直接删除会报错,因为该主节点分配了槽,所以需要先取消槽
- 先取消主节点上的槽
./redis-cli --cluster reshard 127.0.0.1:7006
- 取消后的节点槽信息
- 再删除主节点
./redis-cli --cluster del-node 127.0.0.1:7006 64e80e2d2f1765f73d79d6ea4b3b15ee4a96ec4c
- 删除从节点7007
./redis-cli --cluster del-node 127.0.0.1:7007 1662dc6dc2552abab17ba234170714833263305a
- 查看节点信息
- 查看redis进程发现7006 7007的进程也不存在了
ps -ef|grep redis
redis 监控工具及命令
吞吐量
- 查看相关参数信息
./redis-cli -p 6379 -a ffcsffcs info | grep -e "connected_clients" -e "blocked_clients" -e "used_memory_human" -e "used_memory_peak_human" -e "rejected_connections" -e "evicted_keys" -e "instantaneous"
- 各参数意义
connected_clients:1 已经连接的客户端的个数
blocked_clients:0 被阻塞的客户端个数
used_memory_human:2.10M
used_memory_peak_human:2.18M
instantaneous_ops_per_sec:0 每秒执行的指令个数
instantaneous_input_kbps:0.00 每秒输入的数据量
instantaneous_output_kbps:0.00 每秒输出的数据量
rejected_connections:0 拒绝的链接个数
evicted_keys:0 运行以来删除的key的个数
- 有命令在执行时的参数数据示例
延迟
- 客户端引起的
模拟:
服务端监控命令
./redis-cli -p 6379 -a ffcsffcs --latency
客户端延迟debug 睡眠 5秒
debug sleep 5
2. 服务端引起的
(1)默认,禁用了服务器内部延迟的检查机制
(2)参数:latency-monitor-threshold
config set latency-monitor-threshold 100
(3)示例
手动制造一些延迟
debug sleep 2
debug sleep .15
debug sleep .5
(4)查看 latency
latency latest
latency history command
latency graph command
3. 指导和建议:
命令 doctor
latency doctor
延迟度量
baseline(基线)
# 100 表述侦测时长100秒
./redis-cli -p 6379 -a ffcsffcs --intrinsic-latency 100