基础
#
remote dictionary server
特点
no-sql, c编写
内存数据库 # 请求不经过parser和optimizer
key-value
单线程
可持久化
与memcache区别
memcache全在内存,不能持久化,redis部分硬盘
memcache类型支持简单
# memcache类型只有字符串,append字符串, blacklist删除麻烦
emecache多线程, redis单线程
底层模型,与客户端通信协议不同,redis自己实现vm机制(冷热数据分离)
value, memcache只能存1MB, redis可存1GB
redis可设置expire, 支持排行榜, 浮点数
类型
string
整个或一部分操作
整数、浮点数自增自减
list
两边推入或弹出
偏移量trim
读单个多个元素
值查找移除元素
set
增删查单个元素
单个元素是否存在
交集、并集、差集
随机取元素
hash
增删查单个键值对
获取所有键值对
zset
# 有序集合, 排序根据score, score为双精度浮点数
增删查单个元素
根据range或成员获取元素
应用
会话缓存(session cache)
全面缓存(FPC)
队列
排行榜/计数器
发布/订阅
命令
文件命令
redis-server
# 端口为6379
redis-server /etc/redis.conf 来加载配置文件
redis-cli
redis-benchmark
# 性能测试工具
redis-cli命令
ping
# 成功时返回 PONG
shutdown
# 关闭redis-server服务
-p 端口号
quit
功能
#
性能高 # 100k次读写/s
数据类型丰富
所有操作有原子性
支持发布/订阅,通知,key过期
发布订阅
subscribe
psubscribe
# 订阅给定模式匹配的所有频道
unsubscribe
punsubscribe
publish
sort
# 列表、集合、有序集合排序,返回结果或生成存储
过期
persist
# 移除键过期时间
ttl
# 键距离过期时间还有多少秒
pttl
# 多少毫秒
expire
# 给定键指定数秒后过期
pexpire
# 指定的毫秒后过期
expireat
# unix时间戳过期
pexpireat
# 毫秒unix时间戳
事务
# 事务期其他客户端命令阻塞
multi
# 创建事务队列,开始记录命令
exec
# 提交事务队列
watch
# 对键加锁
unwatch
discard
# 取消事务
持久化
bgsave
# fork线程创建快照, windows不支持
save
# 停止响应创建快照
sync
# 向主服务器要求复制时,主服务器bgsave,非刚bgsave过
bgrewriteaof
# 重写aof文件使它缩小
复制
slaveof
客户端分片
不完全事务
性能
#
内存数据库,需要预估内存,使用key过期节约
完整重同步占资源,可以部分重同步
重启数据加载慢
master内存快照时,save命令调rdbSave阻塞主线程
master AOF持久化,追加文件大时影响master重启恢复速度
用slave AOF
master调用BGREWRITEAOF重写AOF文件时,cpu和内存负载高
主从复制最好同局域网
数据
#
set mykey somvalue
get mykey
del mykey
incr
decr
incrby
decrby
incrbyfloat
append
getrange
setrange
getbit
setbit
bitcount
# 二进制位串位为1的数量
bitop
# 二进制位串执行and, or, xor, not
rpush list-key item
lpush
lrange list-key 0 -1
# -1为结束索引
lindex list-key 1
rpop
lpop list-key
lrange
ltrim
# 修剪
blpop
# timeout秒内阻塞并等待弹出元素
brpop
rpoplpush
# 一个列表中右弹元素推入另一个列表左端,最后返回这个元素
brpoplpush
sadd set-key item
smembers set-key
sismember set-key item
srem set-key item
# 删除,返回删除的数量
scard
# 元素数
srandmember
# 随机返回一个或多个元素。count正数时,返回的元素不重复, 负数时可重复
spop
# 随机移除一个元素
smove
# 一个集合中移除,并在一个集合中添加。返回移除的数量
sdiff
# 差集
sdiffstore
# 差集生成集合
sinter
# 交集
sinterstore
sunion
# 并集
sunionstore
hset hash-key sub-key value
hget hash-key sub-key
hdel hash-key sub-key
hlen
hexists hash-key sub-key
hkeys hash-key
hvals
hgetall hash-key
hincrbyfloat
hincrby hash-key field -1
hmget
hmset hash-key field1 "foo" field2 "bar"
zadd zset-key 728 member
zrange zset-key 0 -1 withscores
zrevrange zset-key 0 -1 withscores
zrangebyscore zset-key 0 800 withscores
# 根据score范围查找
zrevrangebyscore
zrem zset-key member
zremrangebyrank
zremrangebyscore
zincrby
zinterstore sum 3 sub1 sub2 sub3
# 生成交集, 重复值score相加, 3 指定可变参数的数量
zunionstore
# 并集
zcard
# 成员数量
zcount
# 分值之间的成员数量
zrank
# 返回排名
zrevrank
zscore
# 返回分值
client
#
jedis
# java, 支持redis sharding, 即ShardedJedis结合ShardedJedisPool
Jedis jedis = new Jedis("localhost"); # 连接redis数据库
jedis.set("name", "aa"); # 添加、覆盖
jedis.append("name", "bb"); # 追加,结果为 name=aabb
jedis.get("name"); # 取值
jedis.del("name"); # 删除
jedis.mset("name1", "aa", "name2", "bb"); # 批量添加、覆盖
jedis.mget("name1", "name2") # 批量取值
分布式
#
redisCluster
twemProxy
# twitter开发的redis集群代理
redisMonitor
redisSentinel
# 主从复制,高可用
codis
# 豌豆荚开发的redis集群代理
持久化
#
方式
无持久化
RDB
# 一段时间备份一个RDB文件,RDB文件很紧凑。用fork子进程的方式备份,恢复速度快
# 服务器故障时,会丢当前时段数据。数据集大时,fork耗时出现停止服务(毫秒至1秒)
point-in-time dump
dump-to-disk二条命令
AOF
# 记录写操作, AOF先于RDB
# fsync不fork在后台执行, 追加写文件,文件大时自动重写
# AOF文件结构不紧凑,AOF速度慢于RDB(关闭fsync一样快)
append-only文件
fsync策略
从不同步
每秒同步一次 # 只丢一秒数据
一命令同步一次
策略
配置
save 60 1000
# 60秒内有1000次写入时,自动save
stop-writes-on-bgsave-error no
rdbcompression yes
dbfilename dump.rdb
appendonly no
# 打开AOF
appendfsync everysec
always
# 每个写命令都马上同步
everysec
# 每秒
no
# 操作系统决定
no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
dir ./