Redis测试

Redis开启外网连接 (仅为测试, 生产模式请关闭):
服务器:

请求:
说明:{{current.desc}}

响应:
{{result}}

Redis开启外网连接 (仅为测试, 生产模式请关闭):
如果开启了iptables
                vim /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
            
                如果开启了firewall
                firewall-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-cli命令:
                #连接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

Redis Methods:
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 缓存雪崩的发生,我们需要采取一系列的措施来保障系统的稳定性和可靠性。


READONLY You can‘t write against a read only replica.
进入redis.conf配置文件,修改配置文件的slave-read-only为no


READONLY You can‘t write against a read only replica.
进入redis.conf配置文件,修改配置文件的slave-read-only为no


READONLY You can‘t write against a read only replica.
进入redis.conf配置文件,修改配置文件的slave-read-only为no