如果开启了iptablesvim /etc/sysconfig/iptables
-A INPUT -m state --state NEW -m tcp -p tcp --dport 6379 -j ACCEPT
:wq
systemctl restart iptables
iptables -L -n -v
如果开启了firewallfirewall-cmd --zone=public --add-port=6379/tcp --permanent
systemctl restart firewalld
firewall-cmd --zone=public --list-ports
修改配置文件whereis redis.conf
redis: /etc/redis.conf
vim /etc/redis.conf
#修改如下
#bind 127.0.0.1
protected-mode no
:wq
systemctl restart redis
systemctl list-unit-files | grep redis
#连接redis服务
#指定ip、端口、密码、数据库
redis-cli -h [ip] -p [port] -a [pwd] -n [db_number]
#shell脚本
redis-cli -h localhost set key value
#切换到1号库;redis有16个初始化库,编号0到15,默认使用0号库
select 1
#如果需要验证
auth [password]
#查看当前库的key的数量
dbsize
#删除当前库的全部数据
flushdb
#删除所有库的全部数据
flushall
array (
0 => '__construct',
1 => '__destruct',
2 => '_prefix',
3 => '_serialize',
4 => '_unserialize',
5 => '_pack',
6 => '_unpack',
7 => '_compress',
8 => '_uncompress',
9 => 'acl',
10 => 'append',
11 => 'auth',
12 => 'bgSave',
13 => 'bgrewriteaof',
14 => 'bitcount',
15 => 'bitop',
16 => 'bitpos',
17 => 'blPop',
18 => 'brPop',
19 => 'brpoplpush',
20 => 'bzPopMax',
21 => 'bzPopMin',
22 => 'clearLastError',
23 => 'client',
24 => 'close',
25 => 'command',
26 => 'config',
27 => 'connect',
28 => 'dbSize',
29 => 'debug',
30 => 'decr',
31 => 'decrBy',
32 => 'del',
33 => 'discard',
34 => 'dump',
35 => 'echo',
36 => 'eval',
37 => 'evalsha',
38 => 'exec',
39 => 'exists',
40 => 'expire',
41 => 'expireAt',
42 => 'flushAll',
43 => 'flushDB',
44 => 'geoadd',
45 => 'geodist',
46 => 'geohash',
47 => 'geopos',
48 => 'georadius',
49 => 'georadius_ro',
50 => 'georadiusbymember',
51 => 'georadiusbymember_ro',
52 => 'get',
53 => 'getAuth',
54 => 'getBit',
55 => 'getDBNum',
56 => 'getHost',
57 => 'getLastError',
58 => 'getMode',
59 => 'getOption',
60 => 'getPersistentID',
61 => 'getPort',
62 => 'getRange',
63 => 'getReadTimeout',
64 => 'getSet',
65 => 'getTimeout',
66 => 'hDel',
67 => 'hExists',
68 => 'hGet',
69 => 'hGetAll',
70 => 'hIncrBy',
71 => 'hIncrByFloat',
72 => 'hKeys',
73 => 'hLen',
74 => 'hMget',
75 => 'hMset',
76 => 'hSet',
77 => 'hSetNx',
78 => 'hStrLen',
79 => 'hVals',
80 => 'hscan',
81 => 'incr',
82 => 'incrBy',
83 => 'incrByFloat',
84 => 'info',
85 => 'isConnected',
86 => 'keys',
87 => 'lInsert',
88 => 'lLen',
89 => 'lPop',
90 => 'lPush',
91 => 'lPushx',
92 => 'lSet',
93 => 'lastSave',
94 => 'lindex',
95 => 'lrange',
96 => 'lrem',
97 => 'ltrim',
98 => 'mget',
99 => 'migrate',
100 => 'move',
101 => 'mset',
102 => 'msetnx',
103 => 'multi',
104 => 'object',
105 => 'pconnect',
106 => 'persist',
107 => 'pexpire',
108 => 'pexpireAt',
109 => 'pfadd',
110 => 'pfcount',
111 => 'pfmerge',
112 => 'ping',
113 => 'pipeline',
114 => 'psetex',
115 => 'psubscribe',
116 => 'pttl',
117 => 'publish',
118 => 'pubsub',
119 => 'punsubscribe',
120 => 'rPop',
121 => 'rPush',
122 => 'rPushx',
123 => 'randomKey',
124 => 'rawcommand',
125 => 'rename',
126 => 'renameNx',
127 => 'restore',
128 => 'role',
129 => 'rpoplpush',
130 => 'sAdd',
131 => 'sAddArray',
132 => 'sDiff',
133 => 'sDiffStore',
134 => 'sInter',
135 => 'sInterStore',
136 => 'sMembers',
137 => 'sMisMember',
138 => 'sMove',
139 => 'sPop',
140 => 'sRandMember',
141 => 'sUnion',
142 => 'sUnionStore',
143 => 'save',
144 => 'scan',
145 => 'scard',
146 => 'script',
147 => 'select',
148 => 'set',
149 => 'setBit',
150 => 'setOption',
151 => 'setRange',
152 => 'setex',
153 => 'setnx',
154 => 'sismember',
155 => 'slaveof',
156 => 'slowlog',
157 => 'sort',
158 => 'sortAsc',
159 => 'sortAscAlpha',
160 => 'sortDesc',
161 => 'sortDescAlpha',
162 => 'srem',
163 => 'sscan',
164 => 'strlen',
165 => 'subscribe',
166 => 'swapdb',
167 => 'time',
168 => 'ttl',
169 => 'type',
170 => 'unlink',
171 => 'unsubscribe',
172 => 'unwatch',
173 => 'wait',
174 => 'watch',
175 => 'xack',
176 => 'xadd',
177 => 'xclaim',
178 => 'xdel',
179 => 'xgroup',
180 => 'xinfo',
181 => 'xlen',
182 => 'xpending',
183 => 'xrange',
184 => 'xread',
185 => 'xreadgroup',
186 => 'xrevrange',
187 => 'xtrim',
188 => 'zAdd',
189 => 'zCard',
190 => 'zCount',
191 => 'zIncrBy',
192 => 'zLexCount',
193 => 'zPopMax',
194 => 'zPopMin',
195 => 'zRange',
196 => 'zRangeByLex',
197 => 'zRangeByScore',
198 => 'zRank',
199 => 'zRem',
200 => 'zRemRangeByLex',
201 => 'zRemRangeByRank',
202 => 'zRemRangeByScore',
203 => 'zRevRange',
204 => 'zRevRangeByLex',
205 => 'zRevRangeByScore',
206 => 'zRevRank',
207 => 'zScore',
208 => 'zinterstore',
209 => 'zscan',
210 => 'zunionstore',
211 => 'delete',
212 => 'evaluate',
213 => 'evaluateSha',
214 => 'getKeys',
215 => 'getMultiple',
216 => 'lGet',
217 => 'lGetRange',
218 => 'lRemove',
219 => 'lSize',
220 => 'listTrim',
221 => 'open',
222 => 'popen',
223 => 'renameKey',
224 => 'sContains',
225 => 'sGetMembers',
226 => 'sRemove',
227 => 'sSize',
228 => 'sendEcho',
229 => 'setTimeout',
230 => 'substr',
231 => 'zDelete',
232 => 'zDeleteRangeByRank',
233 => 'zDeleteRangeByScore',
234 => 'zInter',
235 => 'zRemove',
236 => 'zRemoveRangeByScore',
237 => 'zReverseRange',
238 => 'zSize',
239 => 'zUnion',
)
在Redis缓存应用中,常常会遇到缓存穿透、缓存击穿和缓存雪崩这些问题。这些问题如果不能得到有效的解决,会严重影响Redis缓存的性能和可用性。
缓存穿透是指在使用缓存查询时,查询一个不存在的数据,导致缓存无法命中,进而请求直接落到数据库上,形成数据库的压力,这就是缓存穿透问题。攻击者可以通过构造不存在的数据,大量请求缓存,从而攻击数据库。
解决方案:
a. 数据预热:将热门数据提前加载到缓存中,避免缓存击穿。
b. 布隆过滤器:在查询缓存之前,先判断查询的key是否在布隆过滤器中存在,如果不存在,直接返回;如果存在,再查询缓存或数据库。
缓存击穿是指在使用缓存查询时,查询一个非常热门的数据,当这个数据失效的瞬间,同时有大量的请求进来,导致缓存被击穿,请求直接落到数据库上,形成数据库的压力。
解决方案:
a. 加互斥锁:在缓存失效后,加互斥锁,避免同时有多个线程请求数据库,保证只有一个线程请求数据库,其他线程等待。
b. 设置热点数据不过期:热点数据不过期,避免在热点数据失效的瞬间,大量的请求进来,形成缓存击穿。
缓存雪崩是指在使用缓存查询时,大量的数据在同一时间失效,导致请求全部落到数据库上,形成数据库的压力。缓存雪崩是缓存系统设计不合理或者配置不当导致的。
解决方案:
a. 分布式锁:在缓存失效的时候,加分布式锁,避免大量请求同时落到数据库上。
b. 数据分布:将数据均匀分布到多台服务器上,避免某一台服务器宕机导致大量请求落到其他服务器上。
c. 缓存预热:提前加载热门数据到缓存中,避免缓存失效导致大量请求落到数据库上。
在前面我们已经介绍了 Redis 缓存穿透、缓存击穿的概念以及如何防止它们的发生。在这里,我们来详细介绍一下 Redis 缓存雪崩的概念以及如何应对。
Redis 缓存雪崩是指,在某个时间段内,缓存中的大部分数据都失效了,此时如果大量的请求涌入到数据库中,会导致数据库压力剧增,甚至引起宕机的情况。Redis 缓存雪崩通常是由于缓存中的数据在同一时间失效,导致大量的请求直接落到数据库上,而数据库无法承受如此大的负载压力。
为了避免 Redis 缓存雪崩的发生,我们可以采取以下措施:
数据缓存的失效时间设置随机,使得缓存失效的时间尽量分散。这样就不会在同一时间失效过多的缓存,避免大量请求落到数据库上。
设置缓存自动续期。在 Redis 中,我们可以使用 EXPIRE 命令来设置缓存的过期时间,同时使用 PEXPIRE 命令来为缓存设置自动续期。通过自动续期,即使缓存未能在设置的时间内得到更新,也不会发生大规模的缓存失效。
预热缓存。在系统启动的时候,可以使用预热缓存的方式将一些热门数据提前加载到缓存中,避免大量请求落到数据库上。
实现数据的异步加载。对于一些耗时的操作,可以使用异步加载的方式来获取数据,从而避免请求阻塞,减轻数据库的负担。
使用集群来分担负载。通过使用 Redis 集群来分担负载,可以降低单个 Redis 实例的负担,从而避免 Redis 缓存雪崩的发生。
综上所述,Redis 缓存雪崩是一种非常危险的情况,会导致整个系统的崩溃。为了避免 Redis 缓存雪崩的发生,我们需要采取一系列的措施来保障系统的稳定性和可靠性。