一、Redis
1、定义:
2、redis和memcached相比的独特之处
>
>
3、安装:下载\解压(容易发生时间错误)
make
make PREFIX=/usr/local/redis install
拷贝配置文件 cp /usr/local/src/redis-2.6.16/redis.conf /usr/local/redis
4、启动:/usr/local/redis/bin/redis-server /usr/local/redis/redis.conf
连接:/usr/local/redis/bin/redis-cli
5、进程方式运行编辑配置文件:daemonize yes
二、命令及数据结构的操作
1、通用操作
set key value
get key
keys * 查询所有的key
keys key 通配指定字符
keys key* 通配
keys key[ab] 通配指定字符
keys key[?].. 通配单个字符
randomkey 返回随机的key
type key 返回类型
exists key 判断是否存在返回1/0
del key 删除key
rename key value 修改key的名称,如有原名存在覆盖.
renamenx key newkey 修改key的名称,新名称存在了不允许修改.
move key 1[服务器号码]
配置文件databases:16; select 0-15改变库,默认是0号服务器.
ttl key 查询有效期 不过期-1,2.8后不存在-2 秒
pttl key 查询有效期 不过期-1,2.8后不存在-2 毫秒
expire key 整型值s
pttl key 查询有效期
pexpire key 整型值ms
persist key 变为永久有效
flushdb 清空库
2、redis字符串类型的操作
>>set key value [ex 秒] | [px 毫秒] [nx 不存在新增] [xx 存在修改]
>>mset key value key value ... 设置多个键值
>>get key
>>mget key key ... 获得多个键值
>>append key [追加的值] 字符串后面追价值
>>getset key newvalue 获得旧值,并设置新值
>>setrange key [偏移量] [新值] 从偏移量开始替换成新值
>>getrange key [start stop] 获得部分值(左边0,右边-1)
>>incr key 增加1 incrby key 5 incrbyfloat key +/-0.5
>>decr key 减少1 decrby key 5
>>setbit key 2 1/0 变成大/小写
A 65 0100 0001
a 97 0110 0001
>>bitop operation destkey key1[key2...]
3、link链表结构(单项、双向、循环)
>>lpush key value 左边插入值
>>rpush key value 右边插入值
>>lrange key start end
>>lpop key 左边弹出值
>>rpop key 左边弹出值
>>lrem key count value 删除单元值 count+从前完后-从后往前
>>ltrim key star end 截取一小段
>>lindex key 0/1/2... 返回单个单元
>>llen key 返回长度
>>linsert key after/before [value] newvalue 在某个值的前面后面插入
>>rpoplpush A B A链表右边弹出,B链表左边推进
>>brpop,blpop key timeout
4、set 集合
>>特点:无序性、唯一性、确定性
>>sadd key value1 value2 增加元素
>>smembers key 查看所有元素
>>srem key value 删除元素
>>spop key 删除集合中的1个随机元素
>>srandmember key 随机得到集合中的1个元素
>>sismember key value 判断是否存在
>>scard key 集合元素的个数
>>smove source dest key 把key从source移动到dest
>>sinter key1 key2 key3 交集
>>sunion key1 kye2 key3 并集
>>sdiff key1 kye2 key3 差集
5、order set有序集合(score)
>>zadd key score1 value1 score2 value2
>>zrange key star stop 按内部排序起始值
>>zrange key 1 3 withscores 取出vaule和score
>>zrangebyscore key star stop 按score的值取
>>zrangebyscore key star stop limit 1 2 (跳过1个取2个)
>>zrank key value 给一个元素算出排名-升序
>>zrevrank class value 给一个元素算出排名-降序
>>zremrangebyscore key score1 score2 按score来删除
>>zremrangebyrank key 排名开始 排名结束 按排名删除
>>zrem key value 删除指定值
>>zcard key 统计元素个数
>>zcount key 25 30 按分数统计元素个数
交集
>>zinterstore 结果 (2) 集合1 集合2 aggreagte sum 合并并求和
>>zinterstore 结果 (2) 集合1 集合2 aggreagte min 合并并求和
>>zinterstore 结果 (2) 集合1 集合2 aggreagte max 合并并求和
>>zinterstore 结果 (2) 集合1 集合2 weights 2 1 aggreagte sum 合并并求和
并集
6、hash数据类型(类似关联数组 field => value )
>>hset key filed vaule 添加值
>>hget key filed 获取值
>>hmset key filed vaul filed vaul 添加多个值
>>hmget key filed filed filed filed 添加多个值
>>hgetall key 获得所有值
>>hdel key filed 删除值
>>hlen key 获取单元个数
>>hexists key filed 判断是否存在
>>hincrby key filed 1/2...
>>hincrbyfloat key filed 1/2...
>>hkeys key 返回多有的键
>>hvals key 返回所有的值
三、redis(单进程)事物
redis事物与mysql对比
事项 mysql redis
开启 start transaction; multi
语句 普通sql; 普通命令
失败 rollback;回滚 discard取消队列
成功 commit; exec
语法错误exec报错所有的语句不执行.
语法正确类型错误,正确的语句被执行了(程序员负责).
>>监视
>>悲观想法
世界充满危险,肯定有人和我抢, 给 ticket上锁, 只有我能操作. [悲观锁].
>>乐观想法
没有那么人和我抢,因此,我只需要注意,有没有人更改ticket的值就可以了 [乐观锁]
>>开始监视watch key1 key2,只要监视的值发生变化,取消执行.
取消监视unwatch
四、消息订阅
发布:publish [频道名] [内容]; 返回订阅客户端的个数
订阅:subscribe [频道名]
psubscribe new*
五、持久化(关机后还有)
工作方式
rdb(快照持久化)
1、每隔N分钟或者N次写操作后,从内存dump数据形成rdb文件,压缩放在备份目录.
redis-server 子进程 rdbdump
响应客户端 达到触发条件导出数据
监视触发条件
2、重写条件(这三个选项屏蔽禁用导出)
save 900 1 900秒发生1个key变化
save 300 10 300秒发生10个key变化
save 60 10000 60秒发生1万次变化
3、如果rdb导出出错,停止写入内存
stop-writes-on-bgsave-error yes
4、导出rdb压缩
rdbcompression yes
5、导入rdb数据到内存完整性
rdbchecksum yes
6、导出文件名
dbfilename dump.rdb
7、导出文件路径
dir ./
测试性能
/usr/local/redis/bin/redis-benchmark -n 2000
缺点
可能造成一段时间内的数据丢失.
>>aof(日志持久化)
工作方式:aof把每次执行的命令写入文本文件,每次写速度下来了,怎么写.
1、打开
appendonly yes/no 开启关闭aof功能
2、多久写一次
appendfsync always 每个命令都同步到aof,安全速度慢
appendfsync everysec 每秒1写次
appendfsync no 由操作系统判断
3、正在快照停止aof,避免io太高.
no-appendfsync-on-rewrite no/yes
4、aof重写条件
auto-aof-rewrite-percentage 100 与上次比增加100%后重写
auto-aof-rewrite-min-size 32mb 至少32M重写
5、aof文件名
appendfilename appendonly.aof
问题:
rdb、aof两种模式存在rdb快.
rdb、aof都有了,以aof(空文件)来恢复.
六、主从配置集群
1、读写分离,分担master任务.
2、主从备份防止宕机.
3、任务分离,主从分别分担备份与计算工作.
>>结构:一主多从 (星 型)
一主一从再跟从 (直线型)
>>主从通信过程:
Master<——————>Slave
1、Maste开始dump导出rdb,Slave恢复.
2、aof中中间的缓存同步
3、以后进程保存联系
>>三台机器集群
公共配置
daemonize yes 后台进程运行
pidfile /usr/local/redis/redisXXXX.pid
port XXXX 端口号
主服务器6379
#save 900 1 关闭rdb
#save 300 10
#save 60 10000
appendonly yes
appendfsync everysec
appendfilename /var/run/appendonly6379.aof
no-appendfsync-on-rewrite yes
#在日志重写时,不进行命令追加操作,而只是将其放在缓冲区里,避免与命令的追加造成DISK IO上的冲突。
从服务器6380
dbfilename dump6380.rdb
dir /usr/local/redis/
slaveof localhost 6379
stop-writes-on-bgsave-error yes
slave-read-only yes 只读状态
从服务器6381
#save 900 1 关闭rdb
#save 300 10
#save 60 10000
#appendonly no 关闭aof
slave-read-only yes 只读状态
启动密码
主服务器:requirepass foobared auth shunjian
从服务器:masterauth <master-password>
启动服务
/usr/local/redis/bin/redis-server /usr/local/redis/redis6379.conf
/usr/local/redis/bin/redis-server /usr/local/redis/redis6380.conf
/usr/local/redis/bin/redis-server /usr/local/redis/redis6381.conf
缺点:多台slave不要一下起来,否则IO剧增.
七、redis运维知识
time 显示服务器时间 , 时间戳(秒), 微秒数
dbsize 当前数据库的key的数量
bgrewriteaof 后台进程重写aof
save 保存rdb快照,会停止当前工作.
bgsave 后台保存rdb快照
lastsave 上次保存时间
Flushdb 清空当前库所有键
Flushall 清空所有库所有键
info
内存使用
used_memory:859192 数据结构的空间
used_memory_rss:7634944 实占空间
mem_fragmentation_ratio:8.89 前2者的比例,1.N为佳,如果此值过大,说明redis的内存的碎片化严重,可以导出再导入一次.
从服务器情况
role:master
connected_slaves:0
持久化
rdb_changes_since_last_save:6
rdb_last_save_time:1382366180
Fork 性能
latest_fork_usec:864 了解最近一次 fork 操作导致了多少时间的卡顿
获取配置配置文件
config get [requirepass]
config set [requirepass]
慢查询日志
slowlog-log-slower-than 10000 慢日志时间
slowlog-max-len 128 慢日志条数
关闭服务器
Shutdown [save/nosave]
八、数据flushdb、dump转移到另一个服务器
数据被清空
flushdb
shotdown
编辑aof文件删除flushdb
重启恢复
dump数据转移
cp 一份dump文件
关闭aof,打开rdb
启动服务器