ECS配置redis客户端连接远程服务端
首先保证ECS与redis网络环境可以互通使用ping需要检查命令测试和检查服务端6379端口是否放开,白名单安全组需要检查。
一、从redis官网下载redis-cli的压缩包
wget http://download.redis.io/redis-stable.tar.gz
解压下载的压缩包
tar xvzf redis-stable.tar.gz
进入redis-stable目录
cd redis-stable
安装
make
将redis-cli拷贝到/usr/local/bin/下,让redis-cli指令可直接在任何目录下使用
二、登录redis
三种登录方式,第一种是直接登录后输入密码,第二种是直接输入密码登录,第三种是用自己创建的用户登录
1. redis-cli -h r-f8z1erxbh1i6e6c726198.redis.rds.aliyuncs.com auth yourpassword 2. redis-cli -h r-f8z1erxbh1i6e6c726198.redis.rds.aliyuncs.com -a 13265121289Zw --这里有一个提示,我们将以这种方式登录waring为了有更好的体验,建议使用1和3互动auth登录方式 3. redis-cli -h r-f8z1erxbh1i6e6c726198.redis.rds.aliyuncs.com auth zici2008zw:13265121289Zw --我在服务端创建了一个zici2008zw指定用户密码登录的用户
关于redis-cli 命令的相关参数:
r-f8z1erxbh1i6e6c726198.redis.rds.aliyuncs.com:6379> keys * 1. "four" 2. "one" 3. "three"
r-f8z1erxbh1i6e6c726198.redis.rds.aliyuncs.com:6379> keys f 1. "four"
redis-cli -h r-2ze1daaf91b9d6f4.redis.rds.aliyuncs.com -p 6379 -a Passwd123 -n 15
redis-cli -h r-f8z1erxbh1i6e6c726198redis.rds.aliyuncs.com -p 6379 -a 13265121289Zw --latency-history -i 5
redis-cli -h r-f8z1erxbh1i6e6c726198.redis.rds.aliyuncs.com -p 6379 -a 13265121289Zw -r 3 ping
redis-cli -h r-f8z1erxbh1i6e6c726198.redis.rds.aliyuncs.com -p 6379 -a 13265121289Zw --scan --pattern '*f*'
redis-cli -h r-f8z1erxbh1i6e6c726198.redis.rds.aliyuncs.com -p 6379 -a 13265121289Zw --bigkeys
redis-cli -h r-f8z1erxbh1i6e6c726198.redis.rds.aliyuncs.com -p 6379 -a 13265121289Zw --stat
echo -en '*3\r\n$3\r\nset\r\n$4\r\nname\r\n$8\r\nzhangsan\r\n' | redis-cli -h r-f8z1erxbh1i6e6c726198.redis.rds.aliyuncs.com -p 6379 -a 13265121289Zw --pipe
(1)这串字符,就是键值key:value在redis的rdb文件里存储的格式。 (2)以redis protoc格式数据,将键值name:chenjing保存到redis里,如果原来就已存在对应的key,即会覆盖。 (3)’*3\r\n$3\r\nset\r\n$4\r\nname\r\n$8\r\nzhangsan\r\n’ 这一段的意思主要是想向redis创建一个key(name):value(zhangsan)的键值(set name zhangsan)。 *3表示一共3个参数; \r\n表示空格; $3表示参数的字节数,例如set是3个字母,set命令前先标记$3,zhangsan是8个字符标记$8;
redis-cli -h r-f8z1erxbh1i6e6c726198.redis.rds.aliyuncs.com -p 6379 -a 13265121289Zw --pipe < appendonly.aof
echo -n 'hello' | redis-cli -h r-f8z1erxbh1i6e6c726198.redis.rds.aliyuncs.com -p 6379 -a 13265121289Zw get
更多命令可参考: https://www.cnblogs.com/cjing2011/p/3000576bb44f506af4065eb558b7e343.html https://segmentfault.com/a/1190000022162774
redis服务端命令
r-f8z1erxbh1i6e6c726198.redis.rds.aliyuncs.com:6379> client list
id=89594 addr=172.17.253.228:33368 fd=34 name= age=5 idle=0 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=0 obl=0 oll=0 omem=0 events= cmd=CLIENT
r-f8z1erxbh1i6e6c726198.redis.rds.aliyuncs.com:6379> client setname 'AES-QUEGE'
OK
r-f8z1erxbh1i6e6c726198.redis.rds.aliyuncs.com:6379> client getname
"AES-QUEGE"
r-f8z1erxbh1i6e6c726198.redis.rds.aliyuncs.com:6379> client list
id=89594 addr=172.17.253.228:33368 fd=34 name=AES-QUEGE age=85 idle=0 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=0 obl=0 oll=0 omem=0 events= cmd=CLIENT
r-2ze1daaf91b9d6f4.redis.rds.aliyuncs.com:6379> client list
id=156638 addr=10.44.155.194:52524 fd=5 name=jacky age=322 idle=0 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=0
id=156711 addr=10.44.155.194:52612 fd=8 name= age=99 idle=93 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=0
id=156742 addr=10.44.155.194:52662 fd=11 name= age=9 idle=9 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=0
r-2ze1daaf91b9d6f4.redis.rds.aliyuncs.com:6379> client kill 10.44.155.194:52612
OK
r-2ze1daaf91b9d6f4.redis.rds.aliyuncs.com:6379> client kill addr 10.44.155.194:52662
(integer) 1
r-2ze1daaf91b9d6f4.redis.rds.aliyuncs.com:6379> client list
id=156638 addr=10.44.155.194:52524 fd=5 name=jacky age=369 idle=0 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=0
r-f8z1erxbh1i6e6c726198.redis.rds.aliyuncs.com:6379> config get slow* --也可单独获取 以下参数(config get slowlog-log-slower-than)
1. "slowlog-log-slower-than" ---目前redis 记录所有查询时间大于等于 20000 微秒的查询
2. "20000"
3. "slowlog-max-len" ---目前redis最多保存条日志,目前是1024条
4. "1024"
关于slow log详解可参考:https://www.cnblogs.com/onmyway20xx/p/5486604.html
[root@zengwen ~]# redis-cli -h r-f8z1erxbh1i6e6c726198.redis.rds.aliyuncs.com -p 6379 -a 13265121289Zw
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
r-f8z1erxbh1i6e6c726198.redis.rds.aliyuncs.com:6379> select 10
OK
r-f8z1erxbh1i6e6c726198.redis.rds.aliyuncs.com:6379[10]> dbsize
(integer) 0
r-f8z1erxbh1i6e6c726198.redis.rds.aliyuncs.com:6379[10]> select 1
OK
r-f8z1erxbh1i6e6c726198.redis.rds.aliyuncs.com:6379[1]> dbsize
(integer) 0
r-f8z1erxbh1i6e6c726198.redis.rds.aliyuncs.com:6379[1]>
r-f8z1erxbh1i6e6c726198.redis.rds.aliyuncs.com:6379[1]> info cluster
Cluster
cluster_enabled:0
databases:256
nodecount:8
monitor
r-f8z1erxbh1i6e6c726198.redis.rds.aliyuncs.com:6379> slowlog get
(empty array)
r-f8z1erxbh1i6e6c726198.redis.rds.aliyuncs.com:6379> slowlog len
(integer) 0
r-f8z1erxbh1i6e6c726198.redis.rds.aliyuncs.com:6379> info key user:u01
slot:13584 node_index:6r-f8z1erxbh1i6e6c726198.redis.rds.aliyuncs.com:6379>
r-f8z1erxbh1i6e6c726198.redis.rds.aliyuncs.com:6379> iinfo 7 cpu
"# CPU\r\nused_cpu_sys:126.79\r\nused_cpu_user:266.04\r\nused_cpu_sys_children:0.00\r\nused_cpu_user_children:0.00\r\n"
r-f8z1erxbh1i6e6c726198.redis.rds.aliyuncs.com:6379> iinfo 1 cpu
"# CPU\r\nused_cpu_sys:129.53\r\nused_cpu_user:269.65\r\nused_cpu_sys_children:0.00\r\nused_cpu_user_children:0.00\r\n"
r-f8z1erxbh1i6e6c726198.redis.rds.aliyuncs.com:6379> iinfo 2 cpu
"# CPU\r\nused_cpu_sys:114.74\r\nused_cpu_user:310.02\r\nused_cpu_sys_children:0.00\r\nused_cpu_user_children:0.00\r\n"
r-f8z1erxbh1i6e6c726198.redis.rds.aliyuncs.com:6379> iinfo 3 cpu
"# CPU\r\nused_cpu_sys:118.53\r\nused_cpu_user:239.94\r\nused_cpu_sys_children:0.00\r\nused_cpu_user_children:0.00\r\n"
r-f8z1erxbh1i6e6c726198.redis.rds.aliyuncs.com:6379>
r-f8z1erxbh1i6e6c726198.redis.rds.aliyuncs.com:6379> iscan 0 0
1) "0"
2) (empty array)
r-f8z1erxbh1i6e6c726198.redis.rds.aliyuncs.com:6379> dbsize
(integer) 5
r-f8z1erxbh1i6e6c726198.redis.rds.aliyuncs.com:6379> select 5
OK
r-f8z1erxbh1i6e6c726198.redis.rds.aliyuncs.com:6379[5]> dbsize
(integer) 0
r-f8z1erxbh1i6e6c726198.redis.rds.aliyuncs.com:6379[5]>
r-f8z1erxbh1i6e6c726198.redis.rds.aliyuncs.com:6379> monitor 1
OK
1617933414.776044 [0 127.0.0.1:61082] "INFO" "keyspace"
1617933414.776213 [0 127.0.0.1:61082] "INFO" "all"
1617933415.513654 [0 127.0.0.1:62574] "info" "all"
1617933415.740450 [0 10.13.53.160:59742] "role"
1617933416.208204 [0 11.115.28.156:44789] "role"
1617933416.513662 [0 127.0.0.1:62574] "info" "all"
1617933416.532412 [0 11.115.29.30:52143] "role"
1617933416.547598 [0 10.13.48.158:64052] "ECHO" "1"
1617933416.555325 [0 10.13.48.158:64052] "info"
1617933416.577764 [0 10.13.48.158:64052] "info"
1617933416.767382 [0 127.0.0.1:61105] "INFO" "keyspace"
1617933416.767563 [0 127.0.0.1:61105] "INFO" "all"
^C
[root@zengwen ~]# redis-cli -h r-f8z1erxbh1i6e6c726198.redis.rds.aliyuncs.com -p 6379 -a 13265121289Zw
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
r-f8z1erxbh1i6e6c726198.redis.rds.aliyuncs.com:6379> monitor 2
OK
1617933422.783067 [0 127.0.0.1:62202] "info" "all"
1617933423.783062 [0 127.0.0.1:62202] "info" "all"
1617933423.935848 [0 127.0.0.1:50302] "INFO" "keyspace"
1617933423.946771 [0 127.0.0.1:50302] "INFO" "all"
r-f8z1erxbh1i6e6c726198.redis.rds.aliyuncs.com:6379> riinfo 0 0 cpu
"# CPU\r\nused_cpu_sys:136.74\r\nused_cpu_user:304.72\r\nused_cpu_sys_children:0.00\r\nused_cpu_user_children:0.00\r\n"
set key1 value1 ex 60 --60秒过期,key=key1,value=value1
setex k4 10 v4 --10秒过期,value=v4,key=k4
expire key 60 --秒级
pexpireat key milliseconds-timestamp --毫秒级
ttl key
• Redis配置项hz定义了serverCon任务的执行周期,默认为10,即CPU空闲时每秒执行10次; • 每次过期key清理的时间不超过CPU时间的25%,即若hz=1,则一次清理时间最大为250ms,若hz=10,则一次清理时间最大为25ms; • 清理时依次遍历所有的db; • 从db中随机取20个key,判断是否过期,若过期,则逐出; • 若有5个以上key过期,则重复步骤4,否则遍历下一个db; • 在清理过程中,若达到了25%CPU时间,退出清理过程;
• volatile-lru:从已设置过期时间的数据集(server.db[i].expires)中挑选最近最少使用的数据淘汰; • volatile-ttl:从已设置过期时间的数据集(server.db[i].expires)中挑选要过期的数据淘汰; • volatile-random:从已设置过期时间的数据集(server.db[i].expires)中任意选择数据淘汰; • allkeys-lru:从数据集(server.db[i].dict)中挑选最近最少使用的数据淘汰; • allkeys-random:从数据集(server.db[i].dict)中任意选择数据淘汰; • no-enviction(驱逐):禁止驱逐数据
• 不要放垃圾数据,及时清理无用数据(实验性的数据和下线的业务数据及时删除); • key尽量都设置过期时间(对具有时效性的key设置过期时间,通过redis自身的过期key清理策略来降低过期key对于内存的占用,同时也能够减少业务的麻烦,不需要定期手动清理了; • 单key不要过大(key过大会导致网络传输延迟比较大,需要分配的输出缓冲区比较大,在定期清理的时候也容易造成比较高的延迟,最好能通过业务拆分,数据压缩等方式避免这种过大的key的产生); • 不同业务如果公用一个业务的话,最好使用不同的逻辑db分开(从上面的分析可以看出,Redis的过期key清理策略和强制淘汰策略都会遍历各个db。将key分布在不同的db有助于过期key的及时清理,另外不同业务使用不同db也有助于问题排查和无用数据的及时下线)。
关于redis热key,先从热key出现点来剖析,多数热key都由业务场景稳定出现拉升导致,可能是某些实时热搜的微博、评论、商品大促销导致点击量骤增等各类业务场景,都会导致热key的出现,一般多数热key的出现都是读多写少的场景;
常见热key导致的问题点:
- 流量集中,达到物理网卡上线。
- 请求过多,缓存分片服务器被打垮。
- DB击穿,引起业务雪崩。
1、SLB 层做负载均衡 2、Proxy 层做读写分离自动路由 3、Master 负责写请求 4、ReadOnly 节点负责读请求 5、Slave 节点和 Master 节点做高可用 实际过程中 Client 将请求传到 SLB,SLB 又将其分发至多个 Proxy 内,通过 Proxy 对请求的识别,将其进行分类发送; 例如,将同为 Write 的请求发送到 Master 模块内,而将 Read 的请求发送至 ReadOnly 模块。 而模块中的只读节点可以进一步扩充,从而有效解决热点读的问题。 读写分离同时具有可以灵活扩容读热点能力、可以存储大量热点Key、对客户端友好等优点。
5. 本架构比较适用于读多写少的场景,但是遇到读写量较为均衡或写多读少的场景,可以考虑改为云产品的集群版(性能增强版)会跟合适,但具体还是要根据实际情况选择。 6. 本方案需要依赖读写架构体系,但因为目前Redis集群版提供1个、3个、5个只读节点的配置,如果只读节点不够,或者满足不了当前的业务需求,可以考虑原产品的集群版,最终还是以实际情况为准。
exists key
type key
randomkey
rename oldkey newkey
renamex oldkey newkey
expire key seconds
ttl key
pexpire key 毫秒数
pttl key
set key value [ex 秒数] / [px 毫秒数] [nx] /[xx]
setnx key value
mset key value1 ...keyN valueN
msetnx key value1 . . . keyN valueN
SET 命令还支持可选的 NX 选项和 XX 选项,例如:SET nx-str “this will fail” XX 如果给定了 NX 选项,那么命令仅在键 key 不存在的情况下,才进行设置操作;如果键 key 已经存在,那么 SET … NX 命令不做动作(不会覆盖旧值)。 如果给定了 XX 选项,那么命令仅在键 key 已经存在的情况下,才进行设置操作;如果 键 key 不存在,那么 SET … XX 命令不做动作(一定会覆盖旧值)。在给定 NX 选项和 XX 选项的情况下,SET 命令在设置成功时返回 OK ,设置失败时返回 nil 。
get key
锁。
getset key value
mget key1 key2 ... keyN
incr key
decr key
incrby key integer
decrby key integer
incrbyfloat key floatnumber
append key value
substr key start end
SETRANGE key offset value
GETRANGE key start end
redis-cli --raw
reids>set msg"世界你好"
redis>strlen msg
strlen
lpush key string
lpushx
rpush key string
linsert
llen key
LPUSH key value
LPUSH key2 value2
LRANGE key0 10
LRANGE key0 -1
lindex key 0
ltrim key start end
lrem key count value
lpop key
同上,但是从尾部删除。
rpop
lset key index value
blpop key1...keyN timeout
brpop
BLPOP/BRPOP 的先到先服务原则 如果有多个客户端同时因为某个列表而被阻塞,那么当有 新值被推入到这个列表时,服务器会按照先到先服务(first in first service)原则,优先向最 早被阻塞的客户端返回新值。举个例子,假设列表 lst 为空,那么当客户端 X 执行命令 BLPOP lst timeout 时,客户端 X 将被阻塞。在此之后,客户端 Y 也执行命令 BLPOP lst timeout ,也因此被阻塞。如果这时,客户端 Z 执行命令 RPUSH lst “hello” ,将值 “hello” 推 入列表 lst ,那么这个 “hello” 将被返回给客户端 X ,而不是客户端 Y ,因为客户端 X 的被阻 塞时间要早于客户端 Y 的被阻塞时间。 rpoplpush/brpoplpush:rpoplpush srckey destkey 从srckey对应list的尾部移除元素并添加到 destkey对应list的头部,最后返回被移除的元素值,整个操作是原子的.如果srckey是空或者不 存在返回nil,注意这是唯一一个操作两个列表的操作,用于两个队列交换消息。 应用场景:task + bak 双链表完成工作任务转交的安全队列,保证原子性。 业务逻辑: 1: Rpoplpush task bak 2: 接收返回值,并做业务处理 3: 完成时用LREM消掉。如不成功或者如果 集群管理(如zookeeper)发现worker已经挂掉,下次从bak表里取任务 另一个应用场景是循环链表: 127.0.0.1:6379> lrange list 0 -1 1) “c” 2) “b” 3) “a” 127.0.0.1:6379> rpoplpush list list “a” 127.0.0.1:6379> lrange list 0 -1 1) “a” 2) “c” 3) “b”
sadd key member
srem key member
spop key
srandmember key
smove srckey dstkey member
scard key
sismember key member