redis DB隔离 内存用满

版权声明:本文为CSDN博主「lcf枫」的原创文章,遵循CC 4.0 by-sa版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/u012279631/article/details/82383314
redis DB隔离 内存用满
DB 隔离问题
使用python 连接Redis,然后设置了值。想要在客户端中区查看相应的值却发现并不存在。

使用命令如下:

redis-cli
1
连接远端的时候使用:

redis-cli -h host -p port
1
连上了之后有几种手段可以查看是否存在一个key 
- get key nil 表示不存在

127.0.0.1:6379[2]> get aaa
(nil)
127.0.0.1:6379[2]> set aaa 1
OK
127.0.0.1:6379[2]> get aaa
"1"
127.0.0.1:6379[2]>
1
2
3
4
5
6
7
exists 注意 0 表示不存在
127.0.0.1:6379[2]> exists aaa
(integer) 1
127.0.0.1:6379[2]> exists bbb
(integer) 0
1
2
3
4
keys 这个命令可以返回所有的key 使用 keys * 并且支持模糊所搜 如:keys *end
127.0.0.1:6379[2]> keys *
1) "aaa"
127.0.0.1:6379[2]> keys a*
1) "aaa"
127.0.0.1:6379[2]> keys *aa*
1) "aaa"
127.0.0.1:6379[2]> keys *aaa*
1) "aaa"
127.0.0.1:6379[2]> keys *aaaa*
(empty list or set)
1
2
3
4
5
6
7
8
9
10
但是在代码中使用 python manager shell 是可以获取到的,百思不得其解。这时候只能够通过两种方式: 
- 把配置信息打印出来 
- pdb debug一下看看什么情况

{'default_timeout': 604800, 'default': True, 'db': 2, 'id': 'main', 'host': '127.0.0.1', 'type': 'redis', 'port': '6379', 'key_prefix': 'be.'}
1
最终看到的是这样的配置

db选择, redis里面也分了不同的数据。在进入了db之后首先需要 select 2。跳转到DB2.
 guifeng.chen  /Users/guifeng.chen   redis-cli                                                                                              23:36:01
127.0.0.1:6379>
127.0.0.1:6379> select 2
OK
127.0.0.1:6379[2]>
1
2
3
4
5
最终发现了在连接的时候还传了一个参数, key_prefix 这个会加在自己设置的key前面。这个是业务相关的东西了。
redis设置的值过一段时间消失
现象:在工作中dev环境设置和读取都没有问题。但是在test环境下,设置了key,过几秒或者几十秒就会消失。然后开始苦逼的pdb查看原因。最中也是看到能够成功的设置进去。

后来查了一会发现redis的内存使用已经满了。。 
关注内存这一块

# Memory
used_memory:268272336
used_memory_human:255.84M
used_memory_rss:296026112
used_memory_rss_human:282.31M
used_memory_peak:276211056
used_memory_peak_human:263.42M
total_system_memory:67451297792
total_system_memory_human:62.82G
used_memory_lua:41984
used_memory_lua_human:41.00K
maxmemory:268435456
maxmemory_human:256.00M
maxmemory_policy:allkeys-random
mem_fragmentation_ratio:1.10
mem_allocator:jemalloc-4.0.3
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
可以看到内存限制为maxmemory_human 256M 但是已经使用到了used_memory_human 255.8M.就是说会出现满了的情况。 
内存满了之后删除key maxmemory_policy。 但是新增加的key还是很快就被删除了,所以现在看来内存大大的不足,即使在随机的策略下一个key存活的时间依然的很短的。

这种情况下只能够将redis的内存放大或者说使用不同的key淘汰策略来达到目的。

redis info 介绍
127.0.0.1:6379> info
# Server
redis_version:4.0.11
redis_git_sha1:00000000
redis_git_dirty:0
redis_build_id:76a776f34ea01e56
redis_mode:standalone
os:Darwin 16.7.0 x86_64
arch_bits:64
multiplexing_api:kqueue
atomicvar_api:atomic-builtin
gcc_version:4.2.1
process_id:1485
run_id:9db1502241c638a3cce0bb629c1aa397439923b7
tcp_port:6379
uptime_in_seconds:148371
uptime_in_days:1
hz:10
lru_clock:9315774
executable:/usr/local/opt/redis/bin/redis-server
config_file:/usr/local/etc/redis.conf

# Clients
connected_clients:1
client_longest_output_list:0
client_biggest_input_buf:0
blocked_clients:0

# Memory
used_memory:1031408
used_memory_human:1007.23K
used_memory_rss:2170880
used_memory_rss_human:2.07M
used_memory_peak:1032496
used_memory_peak_human:1008.30K
used_memory_peak_perc:99.89%
used_memory_overhead:1030470
used_memory_startup:980736
used_memory_dataset:938
used_memory_dataset_perc:1.85%
total_system_memory:17179869184
total_system_memory_human:16.00G
used_memory_lua:37888
used_memory_lua_human:37.00K
maxmemory:0
maxmemory_human:0B
maxmemory_policy:noeviction
mem_fragmentation_ratio:2.10
mem_allocator:libc
active_defrag_running:0
lazyfree_pending_objects:0

# Persistence
loading:0
rdb_changes_since_last_save:0
rdb_bgsave_in_progress:0
rdb_last_save_time:1536029444
rdb_last_bgsave_status:ok
rdb_last_bgsave_time_sec:0
rdb_current_bgsave_time_sec:-1
rdb_last_cow_size:0
aof_enabled:0
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

# Stats
total_connections_received:3
total_commands_processed:20
instantaneous_ops_per_sec:0
total_net_input_bytes:530
total_net_output_bytes:36422
instantaneous_input_kbps:0.01
instantaneous_output_kbps:3.56
rejected_connections:0
sync_full:0
sync_partial_ok:0
sync_partial_err:0
expired_keys:0
expired_stale_perc:0.00
expired_time_cap_reached_count:0
evicted_keys:0
keyspace_hits:2
keyspace_misses:2
pubsub_channels:0
pubsub_patterns:0
latest_fork_usec:472
migrate_cached_sockets:0
slave_expires_tracked_keys:0
active_defrag_hits:0
active_defrag_misses:0
active_defrag_key_hits:0
active_defrag_key_misses:0

# Replication
role:master
connected_slaves:0
master_replid:078d5af90c73fc76c2fa13606bb1fa965cd8dd5b
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:0
second_repl_offset:-1
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0

# CPU
used_cpu_sys:24.67
used_cpu_user:13.20
used_cpu_sys_children:0.00
used_cpu_user_children:0.00

# Cluster
cluster_enabled:0

# Keyspace
db2:keys=1,expires=0,avg_ttl=0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
server:

redis_version : Redis 服务器版本
redis_git_sha1 : Git SHA1
redis_git_dirty : Git dirty flag
os : Redis 服务器的宿主操作系统
arch_bits : 架构(32 或 64 位)
multiplexing_api : Redis 所使用的事件处理机制
gcc_version : 编译 Redis 时所使用的 GCC 版本
process_id : 服务器进程的 PID
run_id : Redis 服务器的随机标识符(用于 Sentinel 和集群)
tcp_port : TCP/IP 监听端口
uptime_in_seconds : 自 Redis 服务器启动以来,经过的秒数
uptime_in_days : 自 Redis 服务器启动以来,经过的天数
lru_clock : 以分钟为单位进行自增的时钟,用于 LRU 管理
1
2
3
4
5
6
7
8
9
10
11
12
13
memory:

used_memory : 由 Redis 分配器分配的内存总量,以字节(byte)为单位
used_memory_human : 以人类可读的格式返回 Redis 分配的内存总量
used_memory_rss : 从操作系统的角度,返回 Redis 已分配的内存总量(俗称常驻集大小)。这个值和 top 、 ps 等命令的输出一致。
used_memory_peak : Redis 的内存消耗峰值(以字节为单位)
used_memory_peak_human : 以人类可读的格式返回 Redis 的内存消耗峰值
used_memory_lua : Lua 引擎所使用的内存大小(以字节为单位)
mem_fragmentation_ratio : used_memory_rss 和 used_memory 之间的比率
mem_allocator : 在编译时指定的, Redis 所使用的内存分配器。可以是 libc 、 jemalloc 或者 tcmalloc 。
1
2
3
4
5
6
7
8
空间满,删除策略:

volatile-lru:只对设置了过期时间的key进行LRU(默认值)
allkeys-lru : 删除lru算法的key
volatile-random:随机删除即将过期key
allkeys-random:随机删除
volatile-ttl : 删除即将过期的
noeviction : 永不过期,返回错误
1
2
3
4
5
6
参考链接:

redis删除策略

redis info

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值