NoSQL,单线程
- 方便扩展
- 大数据量,高性能(1秒写8万,读11万)
- 数据类型多样性(不需要事先设计表)
NoSQL类型:
- KV键值对数据库 redis
- 文档型数据库 mongoDB
- 列储存数据库 HBase 分布式文件系统
- 图关系数据库 (存关系)Neo4j InfoGrid
安装Redis
- 下载 redis (程序一般放在opt)
- 解压 tar -zxvf (配置文件 redis.conf)
- cd redis-XXX
- make 32bit (64位系统直接使用make即可)
- sudo make install
- redis.conf
daemonize yes 守护进程 - redis-server XXX/redis.conf 启动指定配置的 redis
ps -ef|grep redis 查看redis进程
redis-cli -p 6379 (主机-h)
ping - redis-benchmark 压力测试工具
Redis命令
set
get
del
keys * 查看当前数据库所有key
type
shutdown 关闭链接
exit 退出
select 3 切换数据库(默认16个数据库,默认第0个)
dbsize 数据库大小
flashall flashdb 清空全部(当前)数据库
EXISTS 存在key返回1否则0
move 移动key到数据库
EXPIRE 设置过期秒数
ttl 查看key过期秒
Redis数据类型
- string
- list
Lpush 列表插入头部
Rpush 列表尾部插入
Lpop 列表头部移除
Rpop 列表尾部移除
Lset 更新值
Lrange list 0 -1 获取全部(0到-1)list值
Lindex 通过下标获取值
Llen
Lrem 移除几个某值
Ltrim 截取
RpopLpush 从列名1移动到列名2
Linsert before after 插入 - set 无需 不重复
sadd
SMEMBERS 查看所有元素
SISMEMBER 是否存在元素
scard 元素个数
srem 移除
SRANDMEMBER 随机取 (计算机伪随机)
spop 随机移除
smove 移动到另一个set
SDIFF 差集
SINTER 交集
SUNION 并集 - Hash 值为Map集合
hset
hget
hmset 键值1 键值2 ...
hmget
hgetall
hdel
hlen
HEXISTS
hkeys
hvals
HINCRBY 增加数
HDEBRBY
hsetnx 不存在的情况下创建
变更的数据 类似用户信息 - ZSET 有序集合
zadd key score value
ZRANGE 从小到大排序
ZRANGEBYSCORE key -inf +inf 带数 withscores
ZREVANGE 从大到小排序
zrem
zcard 获取有序集合个数
zcount 11 33 获取指定区间成员数量 - geospatial 地理位置
类似ZSRET
GEOADD key 116.40 39.9 beijing
GEOPOS 返回经纬度
GEODIST 用经纬度返回距离
GEOHASH
GEORADIUS 获取半径内的元素 withdist withcoord count
GEORADIUSBYMEMBER - Hyperloglog 基数 (不重复元素个数)
用户数 有一定错误 12k存储空间
PFADD
PFCOUNT - Bitmaps
setbit key 位置 1
getbit
bitcount
Redis事务
- 不保证原子性(要么同时成功要么同时失败)
错误命令,都不运行
运行错误,该命令报错 - 一致性、顺序性、排他性
- 开启事务 multi
- 命令入队
- 执行命令 exec
- 放弃命令 discard
乐观锁
(悲观锁 任何操作都要加锁)
- watch value 监控值与执行时是否相等
- multi 命令入队 exec 执行前被修改为其他值则(nil)
- ABA问题 版本、时间戳
- 重入机制 unwatch后可重新加锁
Redis配置文件
- unit单位 大小写不敏感
- include 包含其他配置文件
- 网络
绑定网卡IP bind 127.0.0.1 bind 0.0.0.0
protected-mode yes 保护模式
port 6379 - 通用
daemonize yes 以守护进程方式运行
pidfile /var/run/redis_6379.pid 指定pid文件(如果以守护进程方式运行)
loglevel 日志级别
logfile "" 日志位置文件名
database 16 数据库数量
always-show-logo yes - 快照
持久化,规定时间内执行了多少次操作会持久化
save 900 1 900秒内至少修改1个key
stop-writes-on-bgsave-error yes 持久化出错是否继续工作
rdbcompression yes 是否压缩rdb文件
rdbchecksum yes 保存rdb文件进行校验
dir ./ rdb文件报错目录 - 复制
- 安全
requirepass 设置密码 - 限制
maxclients
maxmemory
maxmemory-policy 内存达到上限后的处理策略 - APPEND ONLY模式
appendonly no 默认是RDB
appendfilename "appendonly.aof"
appendfsync everysec 每秒同步 always 每次修改同步 no 由操作系统同步
Redis持久化
- RDB(默认)
fork一个子进程,将内存快照数据写入二进制文件,临时RDB到正式RDB
/usr/local/bin/dump.rdb (生产环境有时需要备份)
/usr/local/bin放入dump.rdb启动数据库可恢复数据
save 同步持久化
bgsave 异步持久化 - AOF
写日志记录,fork子进程重写
AppendOnly yes 开启 重启redis后生效
appendonly.aof 文件记录所有操作
redis-check-aof --fix 修复aof文件
aof文件过大将fork一个进程重写
no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage 200
auto-aof-rewrite-min-size 64mb
Redis订阅发布
cli发布,订阅的cli接收(redis维护字典 链表)
PSUBSCRIBE pattern [pattern...] 订阅给定模式的频道
SUBSCRIBE channel 订阅
UNSUBSCRIBE channel 退订
PUBLISH channel message 发布
Redis主从复制
最低1主2从,读写分离 主写从读
环境配置,只配从库,默认都是master
命令:
info replication
SLAVEOF IP PORT
配置文件:replication,主机密码
全量复制:slave启动发送sync同步命令
增量复制:slave启动后master新增数据的同步
上图结构,Master关闭后,Slave1可通过命令
SLAVEOF no one 成为Master
- 数据冗余
- 故障恢复
- 负载均衡
- 高可用性(集群)基石
Redis哨兵模式
Master宕机,自动将一个Slave转为Master,旧Mater回归则成为Slave(Redis 2.8)
多哨兵模式
- 哨兵发现Master宕机 主观下线
- 投票选新Master
- 故障转移failover
切换Mater(发布订阅模式)客观下线
- 哨兵配置 Sentinel.conf
sentinel monitor 名 host port 1
1代表会投票 - 启动哨兵
redis-sentinel 配置文件
哨兵缺点:在线扩容比较麻烦
缓存穿透、击穿和雪崩
- 缓存穿透
读请求数据,缓存Redis和MySQL都不存在情况下,一直发送请求
- 用户鉴权校验
- 新建短期key-null
- 缓存击穿
读请求数据,缓存Redis没有MySQL有,大量用户同时访问MySQL
- 热点数据不过期
- 分布式锁(同时只允许一个用户访问)
- 缓存雪崩
缓存中数据大批量过期,而请求压力巨大
- 热点数据不过期,数据预热
- 异地多活
- 限流降级