八个特性:速度快、持久化、多种数据结构、多种编程语言、功能丰富、代码简单、主从复制、高可用分布式。
- 速度快:10W OPS 数据放在内存,C语言5W行代码,单线程
- 持久化(断电不丢失):RDB、AOF,对数据的更新异步保存到硬盘
- 数据结构:1、字符串,2、哈希表,3、列表,4、集合,5、有序集合。衍生数据结构:bitmap(string),hyperLogLog(string),GEO(sorts set)
- 编程语言:支持TCP协议,
- 功能丰富:发布订阅,lua脚本,事务,pipeline
- 简单:单机2W3代码量,不依赖外部库,单线程模型
- 主从复制
- 高可用,分布式
使用场景
- 缓存系统
- 计数器
- 消息队列
- 排行榜
- 社交网络
- 实时系统
- 过期命令:expire key sec,ttl key查询,persist key去掉
- 返回-1代表key存在,并且没有过期时间
- 返回-2代表key已经被删除
- 操作时间复杂度:除了keys为O(n),其他都是O(1)
- 单线程:一次只运行一条命令、拒绝长命令(keys,flushdb,mutil/exec)、其实不是单线程(fysnc file descriptor)
数据结构
字符串:
- 原子批量操作 mget mset
- key没有才设置 setnx 更新 set xx
- 更新并返回旧值 getset
- 追加值 append
- 计算长度 strlen
- 浮点自增 incrbyfloat
- 操作下标 getrange setrange
哈希:
- hget hset hdel
- hexists hlen hgetall
- hmget hmset
- hincrby key k1 v1
列表:
- lpush lpop rpush rpop
- 添加linsert key before val newval
- 删除lrem key count val
- 修剪ltrim key start end
- 查询lrange key start end
- lindex key index
- llen key
- 修改lset key index newval
- 阻塞blpop key timeout, brpop
- 模拟栈Lpush lpop
- 模拟队列lpush rpop
- 固定长度列表lpush ltrim
- 消息队列lpush brpop
集合:
- sadd key v1 v2 v3, srem
- 数量scard
- 是否存在sismember
- 随机挑出count个元素srandmember key count
- smembers 获取所有元素
- spop 随机弹出一个元素
- 差集:sdiff key1 ley2
- 交集:sinter
- 并集:sunion
有序集合:
- zadd key score k1 k2
- zrem key score k1
- zincrby key score k1
- zcard key
- 获取分数zscore key k1
- 获取排名zrank key k1
- 按排名获取zrange key 0 -1 withscore
- 按分数获取zrangebyscore key minscore maxscore withscores
- 按分数获取个数zcount
- 删除排名内的元素zremrangebyrank key start end
- 删除分数范围内的元素zremrangebyscore key start end
- 从高到低排名zrevrank zrevrange
慢查询
- 获取慢查询队列slowlog get [n]
- 获取慢查询队列长度slowlog len
- 清空慢查询队列slowlog reset
- 慢查询阈值slowlog-log-slower-than微妙 =0记录所有命令
- 先进先出队列slowlog-max-len
流水线pipeline
- 可以提高批量处理效率
- 只能使用在一个节点上
- 非原子
发布订阅
- 角色:发布者、订阅者、频道
- 发布命令publish channel message
- 订阅频道subscribe channel
- 取消订阅unsubscribe channel
消息队列
- 只有一个人能抢到这条消息
位图bitmap
- 给位图指定索引设置值setbit key offset value
HyperLogLog
- 添加pfadd key element
- 计算独立总数pfcount key
- 合并多个 pfmerge destkey sourcekey
- 有0.81%的错误率
GEO
- geoadd key 经度 纬度 简称
- 获取两个位置的距离geodist
持久化RDB
- save(同步,阻塞)
- bgsave(异步,fork阻塞)
- 配置保存(通过配置文件dump.rdb)
- save 900 1 (在900秒里改变了1条)
- 是否压缩rdbchecksum yes
- 错误停止储存stop-writes-on-bgsave-error yes
- 储存名称dbfilename dump-6379.rdb
持久化AOF
- 三种配置always、eversec、no(由操作系统管理)
- AOF重写(防止文件无限增大),会将重复的命令合并,减少占用,加速恢复bgrewriteaof
- 重写需要的尺寸auto-aof-rewrite-min-size
- 重写增长率auto-aof-rewrite
- 打开AOF appendonly yes
- appendfilename "appendonly.aof"
- 三种策略appendfsync everysec
- 保存日志目录dir /bigdiskpath
RDB与AOF
- AOF优先级高
- AOF体积大
- AOF恢复数据慢
- AOF安全
- AOF轻
主从复制
- master和slave为一对多,方向单一
- 两种方式slaveof ip port、配置
- 取消复制slaveof no one
- 使从节点只读 slave-read-only yes