Flushdb 清除所有key
set无序集合 无序性、唯一性
Sadd key 添加元素 sadd key a b c 唯一性不能重复
Srem key a 删除元素
Smembers key 查看所有元素
Spop key 弹出一个随机元素 弹出的返回值就删除掉
Srandmember key 显示一个随机元素
Scard key 返回集合元素个数
Smove key 移动元素到另一个集合
例子:sadd key a b c sadd key1 d e f smove key key1 a 移动key里面a元素到key1里面
Sinter 取交集
例子:sadd lisi a b c sadd wang a c d sinter lisi wang 显示 a c
Sunion 并集 就是所有的元素
例子:asdd lisi a b c sadd wang a c d sunion lisi wang 显示 a b c d
Sdiff 差集
例子:sdiff lisi wang 显示b sdiff wang lisi 显示 d
Sinterstore 交集存储起来
例子:sinterstore res lisi wang srmembers res 显示 a c
Set 有序集合
Zadd 添加 zadd class 12 zhang 15 lisi 20 wang 4 xiao
Zrange key start end [whthscores]根据排名查看所有元素
zrange class 0 -1 withscores 0是开始 -1是结束
(whthscores显示分数值,可选)
zrange class 0 -1 结果 升序排列
"xiao" "zhang" "lisi" "wang"
zrange class 0 -1 withscores 结果
"xiao" "4" "zhang" "12" "lisi" "15" "wang" "20"
Zrangebyscore key min max [whitscores][limit] 根据分值查看元素
zrangebyscore class 10 20 withscores limit 1 2
"lisi" "15" "wang" "20" (偏移一位 取2个)
Zrank key 正序排列返回排名 zrank class xiao 返回0
Zrevrank key 倒序返回排名 zrevrank class xiao 返回3
Zremrangebyscore 根据分数删除 zremrangebyscore class 15 20
Zremrangebyrank 根据排名删除 zremrangebyrank class 0 0
Zrem key member删除指定 zrem class zhang
Zcard key 查个数
Zcount key min max zcount class 1 20 返回4
Zinterstore des numkeys key [weight 权重]aggergate [sum max min]
计算并集
例子: zadd lisi 3 cat 5 dog 6 horse
zadd wang 2 cat 6 dog 8 horse
zinterstore res 2 lisi wang aggregate sum
zrange res 0 -1 withscores
"cat" "5" "dog" "11" "horse" "14"
权重例子:zinterstore res 2 lisi wang weights 2 1 aggregate sum
"cat" "8" "dog" "16" "horse" "20"
Hash结构 类似关联数组
Hset key field value 设置单个键与健值 hset user1 age 12
Hmset key field value[...]设置多个
例子:hmset user2 name wang age 21 sex v
Hget key field 获取单个键值 hget user1 name
Hmget key field [...]获取多个键值 hget user1 name age
Hgetall key 获取全部健与键值
Hdel key field 删除键
Hlen key 长度
Hincrby key field num 整数自增num hincrby user2 age 3
Hincrbyfloat key field num 浮点型自增 hincrbyfloat user1 age 0.5
Hkeys key 返回key所有键
Hvals key 返回key 所有键值
字符串操作
redis默认有16个数据库 可以select 数量 选择哪个数据库
redis默认无有效期,持久化缓存 磁盘上
Set nx没有key时操作 xx有值时操作
Mset 设置多个key value
get
mget
Del
Move 移动数据库
Existe 是否存在
Ttl key 查询生命周期 不存在返回-2
Rename 修改名字 重名覆盖
Renamenx 不存在时修改
Expire 设置生命周期 秒
Pexprie 毫秒生命周期
Setrange 偏移字节 set gzh hello setrange gzh 1 0 得到 "h0llo"
Append 追加value
Getrange 获取偏移量的值 getrange gzh 1 4 得到"0llo"
Getset get旧值set新值 先返回旧值再设置新值覆盖旧值
Incr 自增 秒杀时可以使用 可以先设置总数量,抢资格decr
Decr 自减
Incrby 自定义整型 incrby key number
Incebyfloat 浮点型 0.5 0.6
Decrby 减去指定减量值之后, key 的值 SET count 100 DECRBY count 20 返回值(integer) 80
Decrbyfloat
在位上操作
Setbit
例子:65 0100 0001
97 0110 0001
set char A setbit char 2 1 get char 返回 “a”
offset 最大值为2的32次方减一
Gitbit key num 获取num位置的值 1或者0 getbit z2 7
Bitcount key [start][end] 汇总
Bitop 对两个key 做位上的 and or 操作
List 链表
Lpush 把一个元素推到最左边
例子:lpush gzh a b c d 输出为 d c b a
Rpush 最右边 例子:rpush gzh a b c d 输出为 a b c d
Lpop 在最左边弹出一个值
Rpop 最右边
Lrange key min max 查看范围值 lrange gzh 0 -1
Lrem key num value 删除指定数量的值 lrem gzh 1 b 第一个b删除
Ltrim key min max 剪切 取min到max的值 ltrim gzh 0 3
Lindex key num 返回链表的值 lindex gzh 1 返回1位置值
Llen key 长度
Linsert key after(后)|before(前) search value 插入
例子:linsert gzh after d e 在第一个d后面加个e
Rpoplpush key1 key2 key1右边值弹出到key2左边推入
例子:rpoplpush gzh gzh1 会把gzh最右边的e 给gzh1最左边
Brpop gzh time 等待弹出 适合在线聊天
Blpop
brpop gzh 20 等待20秒 如果gzh有新数据 则弹出数据
redis事务
Multi 开启事务
Exec 执行事务
Discard 取消事务
事务不支持回滚,执行语句放到队列中,语句没有报错就能执行,执行事务后,正确的语句会执行,错误的报错,但是操作不会回滚
例子 事务不支持回滚
Set zhang 300 set zhao 200
开启事务
multi
decrby zhao 100 返回QUEUED在队列中,并没有执行
sadd zhang pig QUEUED 语句没错,但是类型不对
如果取消需要在执行前执行
执行事务
Exec
返回结果
1) (integer) 100
2) (error) WRONGTYPE Operation against a key holding the wrong kind of value
mget zhang zhao 返回 "300" "100" 没有原子性,语句对了就会执行
加锁
悲观锁(Pessimistic Lock),顾名思义,就是很悲观,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,当其他线程想要访问数据时,都需要阻塞挂起。传统的关系型数据库里边就用到了很多这种锁机制,比如行锁、表锁,读锁,写锁等,都是在操作之前先上锁。
乐观锁(Optimistic Lock),顾名思义,就是很乐观,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候回判断一下再次期间别人有没有去更新这个数据,可以使用版本号等机制。乐观锁适用于多读的应用类型,这样可以提高吞吐量。
Watch 观察监视 可以多个key ,但是有一个key变化,事务就会取消
Unwatch 取消监视
例子:set ticket 1 就1张票
Watch ticket 监视这张票
Mutlti 开始事务
decr ticket 减1张票 QUEUED
decrby zhang 100 扣钱QUEUED
在执行之前 这1张票 没有了
Exec 执行后为空 语句不执行
(nil)
mget ticket zhang 返回 "0" 没有票 钱不变"300"
频道发布与消息订阅
Publish 发布 publish news 'hello'
Psubscribe 订阅一个频道 psubscribe news
Subscribe 订阅多个频道subscribe news1 news
Redis rdb快照
Redis的持久化有2种方式 1快照 2是日志
Rdb快照的配置选项
save 900 1 // 900内,有1条写入,则产生快照
save 300 1000 // 如果300秒内有1000次写入,则产生快照
save 60 10000 // 如果60秒内有10000次写入,则产生快照
(这3个选项都屏蔽,则rdb禁用)
stop-writes-on-bgsave-error yes // 后台备份进程出错时,主进程停止写入
rdbcompression yes // 导出的rdb文件是否压缩
Rdbchecksum yes // 导入rbd恢复时数据时,要不要检验rdb的完整性
dbfilename dump.rdb //导出来的rdb文件名
dir /usr/local/var/db/redis/ //rdb的放置路径
Aof 的配置
appendonly no # 是否打开 aof日志功能
appendfsync always # 每1个命令,都立即同步到aof. 安全,速度慢
appendfsync everysec # 折衷方案,每秒写1次
appendfsync no # 写入工作交给操作系统,由操作系统判断缓冲区大小,统一写入到aof. 同步频率低,速度快,
no-appendfsync-on-rewrite yes: # 正在导出rdb快照的过程中,要不要停止同步aof
auto-aof-rewrite-percentage 100 #aof文件大小比起上次重写时的大小,增长率100%时,重写
auto-aof-rewrite-min-size 64mb #aof文件,至少超过64M时,重写
注: 在dump rdb过程中,aof如果停止同步,会不会丢失?
答: 不会,所有的操作缓存在内存的队列里, dump完成后,统一操作.
注: aof重写是指什么?
答: aof重写是指把内存中的数据,逆化成命令,写入到.aof日志里.
以解决 aof日志过大的问题.
问: 如果rdb文件,和aof文件都存在,优先用谁来恢复数据?
答: aof
问: 2种是否可以同时用?
答: 可以,而且推荐这么做
问: 恢复时rdb和aof哪个恢复的快
答: rdb快,因为其是数据的内存映射,直接载入到内存,而aof是命令,需要逐条执行
redis集群
Redis 集群 主从分离
复制redis.conf
Redis6380.conf redis6381.conf
修改主库 关闭rdb只打开aof日志 修改 bind 127.0.0.1为0.0.0.0
80从库 开启rdb 关闭aof
81从库 都关闭
修改
port 6380(从库端口)
pidfile /var/run/redis_6380.pid
dbfilename dump6380.rdb
Redis5.4以后
replicaof localhost 6379(主库端口)
以前为
Slaveof localhost 6379
开启从库 redis-server /usr/local/etc/redis6380.conf
连接从库 redis-cli -p6380
redis 服务器端命令
redis 127.0.0.1:6380> time ,显示服务器时间 , 时间戳(秒), 微秒数
1) "1375270361"
2) "504511"
redis 127.0.0.1:6380> dbsize // 当前数据库的key的数量
(integer) 2
redis 127.0.0.1:6380> select 2
OK
redis 127.0.0.1:6380[2]> dbsize
(integer) 0
redis 127.0.0.1:6380[2]>
BGREWRITEAOF 后台进程重写AOF
BGSAVE 后台保存rdb快照
SAVE 保存rdb快照
LASTSAVE 上次保存时间
Slaveof master-Host port , 把当前实例设为master的slave
Flushall 清空所有库所有键
Flushdb 清空当前库所有键
Showdown [save/nosave]
注: 如果不小心运行了flushall, 立即 shutdown nosave ,关闭服务器
然后 手工编辑aof文件, 去掉文件中的 “flushall ”相关行, 然后开启服务器,就可以导入回原来数据.
如果,flushall之后,系统恰好bgrewriteaof了,那么aof就清空了,数据丢失.
Slowlog 显示慢查询
注:多慢才叫慢?
答: 由slowlog-log-slower-than 10000 ,来指定,(单位是微秒)
服务器储存多少条慢查询的记录?
答: 由 slowlog-max-len 128 ,来做限制
Info [Replication/CPU/Memory..]
查看redis服务器的信息
Config get 配置项
Config set 配置项 值 (特殊的选项,不允许用此命令设置,如slave-of, 需要用单独的slaveof命令来设置)
Redis运维时需要注意的参数
1: 内存
# Memory
used_memory:859192 数据结构的空间
used_memory_rss:7634944 实占空间
mem_fragmentation_ratio:8.89 前2者的比例,1.N为佳,如果此值过大,说明redis的内存的碎片化严重,可以导出再导入一次.
2: 主从复制
# Replication
role:slave
master_host:192.168.1.128
master_port:6379
master_link_status:up
3:持久化
# Persistence
rdb_changes_since_last_save:0
rdb_last_save_time:1375224063
4: fork耗时
#Status
latest_fork_usec:936 上次导出rdb快照,持久化花费微秒
注意: 如果某实例有10G内容,导出需要2分钟,
每分钟写入10000次,导致不断的rdb导出,磁盘始处于高IO状态.
5: 慢日志
config get/set slowlog-log-slower-than
CONFIG get/SET slowlog-max-len
slowlog get N 获取慢日志
复制rdb(6379)到其他库(6382)
先save保存
Shutdown nosave 停止但不把命令写入rdb
Pkill -9 redis 杀掉进程
cp dump.rdb dump6382.rdb 复制rdb
redis-server /usr/local/etc/redis6382.conf 开启
redis-cli -p 6382 进入
Keys * 查看所有key
Sentinel哨兵 选项配置
port 26379 # 端口
sentinel monitor mymaster 127.0.0.1 6379 2 ,
给主机起的名字(不重即可),
当2个sentinel实例都认为master失效时,正式失效
sentinel down-after-milliseconds mymaster 30000 多少毫秒后连接不到master认为断开
sentinel can-failover mymaster yes #是否允许sentinel修改slave->master. 如为no,则只能监控,无权修改./
sentinel parallel-syncs mymaster 1 , 一次性修改几个slave指向新的new master. 默认一个不可多台同时指向防止高并发
sentinel client-reconfig-script mymaster /var/redis/reconfig.sh ,# 在重新配置new master,new slave过程,可以触发的脚本
#redis-sentinel-26379.conf 配置文件
port 26379
daemonize yes
pidfile "/var/run/redis-sentinel.pid"
logfile "26379.log"
dir "/opt/soft/redis/redis/data"
sentinel myid 79f32bcda5f25af012013038a790512947610699
sentinel deny-scripts-reconfig yes
sentinel monitor mymaster 127.0.0.1 7000 2
sentinel config-epoch mymaster 0
# Generated by CONFIG REWRITE
protected-mode no
user default on nopass ~* +@all
sentinel leader-epoch mymaster 0
sentinel known-replica mymaster 127.0.0.1 7001
sentinel known-replica mymaster 127.0.0.1 7002
sentinel current-epoch 0
redis cluster集群
生成6个redis.conf port是7000 到7005
#redis.conf配置文件
bind 127.0.0.1
pidfile "7000.pid"
port 7000
daemonize yes #守护进程模式
dir "/opt/soft/redis/redis/data" 生成文件存放路径
logfile "7000.log"
#dbfilename "dump-7000.rdb"
cluster-enabled yes #开启集群
cluster-config-file nodes-7000.conf #会自动生成的集群文件
cluster-require-full-coverage no #出错时是否全部受影响
#开启redis 7000到7005
sudo redis-server redis-7000.conf
#生成集群 redis5以后版本使用redis-cli 之前版本用redis-trib.rb工具
#用以下命令创建集群,--cluster-replicas 1 参数表示希望每个主服务器都有一个从服务器,这里则代表3主3从,前3个代表3个master,后3个代表3个slave。
#通过该方式创建的带有从节点的机器不能够自己手动指定主节点,redis集群会尽量把主从服务器分配在不同机器上。
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
#查看集群状态
redis-cli -c -p 7000 cluster info
#查看集群节点
redis-cli -c -p 7000 cluster nodes
#集群扩容增加节点
#增加7006 7007两个节点 7007为7006从节点
#生成配置文件 redis-7006.conf redis-7007.conf
sed "s/7000/7007/g" redis-7000.conf > redis-7007.conf
#启动配置文件
redis-server redis-7006.conf
#增加新节点
redis-cli --cluster add-node 127.0.0.1:7006 127.0.0.1:7000
#查看一下集群节点
redis-cli -c -p 7000 cluster nodes
#为新增主节点分配槽位
redis-cli --cluster reshard 127.0.0.1:7000
#分配过程中,会出现如下几个提示:第一个是要分配多少槽位?4096 第二个是新增节点的ID ?查看节点里面有 第三个是 是否全部分配 ?all
#将新增的从节点7007添加到集群中
redis-cli --cluster add-node 127.0.0.1:7007 127.0.0.1:7000
#建立新增节点的主从关系 (一长串是7006的ID)
redis-cli -p 7007 cluster replicate 1d471bdad4ca6a4805abff7479097eb027b5d5f9
#集群收缩 移除节点
#先移除槽位 --cluster-from {待移除的NodeId} --cluster-to {接受移除槽位的NodeId} --cluster-slots {移除的槽位个数}
redis-cli --cluster reshard --cluster-from 1d471bdad4ca6a4805abff7479097eb027b5d5f9 --cluster-to f0f40b04a9941dbd04df9de685feeb176e9ce611 --cluster-slots 1366 127.0.0.1:7006
#删除节点 {待删除的NodeId} 先删从节点7007 再删主节点 7006
redis-cli -p 7000 --cluster del-node 127.0.0.1:7000 dd147992b328c80ab8033c6044314959094507fc