Redis6:
NoSQL(Not Only SQL),非关系型的数据库
不依赖业务逻辑方法存储,简单的key-value模式存储,因此大大的增加了数据库的扩展能力
*不遵循SQL标准
*不支持ACID
*远超SQL的性能
NoSQL适用场景:
*对数据高并发的读写
*海量数据的读写
*对数据高可扩展性的
Redis:一个开源的key-value存储系统
存储的value类型相对很多,包括string、list、set、zset(有序集合)、hash
*操作都是原子性的
redis:单线程+多路IO复用
key键操作:
keys * 查看当前库所有key
exists key 是否存在key
type key 查看key类型
del key 删除key unlink key 异步删除
expire key 秒钟 设置key过期时间
ttl key 查看还有多少秒过期,-1表示永不过期 -2表示已过期
select 切换数据库
dbsize 查看当前数据库key的数量
flushdb 清空当前库 flushall 通杀全部库
常用数据类型:
String字符串:
set <key><value> 添加键值对
get <key>查询对应键指
append <key><value>将给定的<value>追加到原值的末尾
strlen <key>获得指的长度
setnx <key><value>在key不存在,设置key的值
incr <key> 值+1 decr <key> 值-1
incrby <key>、decrby <key> 步长
mset、mget、msetnx
getrange <key> 起始位置 结束位置
setrange <key> 起始位置 <value>
setex <key> 过期时间 <value>
getset <key><value> 设置新值的同时获得旧值
List列表:单键多值
lpush/rpush <key><value1><value2>...
lpop/rpop <key>
rpoplpush <key1><key2> 从k1取出,插到k2
lrange <key> start stop
linsert <key> before/after <value> newvalue
lrem <key> n <value> 删除n个value
lset <key> index <value> 下标为index的值替换成value
Set集合:
sadd <key><value1><value2>...
smembers <key> 取出该集合所有值
sismembers <key><value> 判断集合<key>中是否含有该值,有1没有0
scard <key>返回该集合元素个数
srem <key><value1><value2>... 删除集合中某个元素
spop <key>随机从集合中吐出一个值
srandmember<key> n 随机取出n个值
smove <source><destination> value 将一个集合中的值放到另一个集合
sinter <key1><key2>返回两个集合的交集元素
sunion <key1><key2>返回两个集合的并集元素
sdiff <key1><key2>返回两个集合的差集元素 key1中的,不包含key2中的
Hash哈希:
hset <key><field><value> 给key集合中的field键赋值value
hget <key><field> 取出
hmset <key><field1><value1><field2><value2> 批量设置hash的值
hexists <key><field>查看key中,是否存在field
hkeys <key> 列出该hash集合的所有field
hvals <key> 列出该hash集合的所有value
hincrby <key><field><increment>
hsetnx <key><field><value> field不存在,设置为value
Zset有序集合:
zadd <key><score1><value1><score2><value2>... 加入有序集
zrange <key> start stop [WITHSCORES] 返回有序集key中,下标在start stop之间的元素
带有WITHSCORES,可以让分数一起和值返回到结果集
zrangebyscore key minmax [WITHSCORES]
zrevrangebyscore key maxmin [WITHSCORES]
zincrby key increment value 加增量
zrem key value 删除集合下指定值的元素
zcount key min max 统计集合,分数区间内元素个数
zrank key value 返回该值在集合中排名
数据结构:Hash+跳跃表
新数据类型:
Bitmaps:
setbit <key><offset><value>
getbit <key><offset>
bitcount <key> start end
bitop
HyperLogLog:解决基数问题,去重
pfadd <key><element>[element...]
pfcount <key>
pfmerge newkey key1 key2 合并
Geospatial:
geoadd <key> 经度longitude 纬度latitude member
geopos <key><member>
geodist <key> member1 member2 单位 [m km mi ft]
georadius <key><longitude><latitude>radius 单位 [m km mi ft]
以给定的经纬度取到范围内半径内的元素
Redis配置文件 /etc/redis.conf
Redis发布和订阅:
subscribe channel 订阅
publish channel ...发布消息
Jedis:
*bind 地址需要注销、protected-mode no、防火墙关闭
Redis事务操作:
是一个单独的隔离操作:事务中的所有命令都会序列化、按顺序地执行,事务在执行过程中
不会被其他客户端发来的命令请求打断
主要作用:串联多个命令,防止别的命令插队
Multi、Exec、discard
multi 组队
exec 执行
discard 放弃组队
*组队中某个命令出现了报告错误,执行时整个队列都会被取消
*执行阶段某个命令报出了错误,则只有报错的命令不会被执行,而其他命令都会执行
事务冲突:乐观锁和悲观锁
Watch key 监视一个或多个key,如果在事物执行之前,这个或这些key被其他命令
所改动,那么事务将被打断
unwatch 取消对所有key的监视
Redis事务三特性:
1.单独的隔离操作:
事务中的所有命令都会序列化,按顺序执行。事务在执行过程中不会被其他客户端发来的
命令请求所打断
2.没有隔离级别的概念:
队列中的命令没有提交之前不会实际被执行,因为事务提交前任何指令都不会被实际执行
3.不保证原子性:
事务中如果有一条命令执行失败,其他的命令仍会被执行,没有回滚
ab工具模拟并发 ab -n 请求次数 -c 并发数 ...
Redis持久化:
RDB:(Redis DataBase)在指定的时间间隔内将内存中的数据集快照写入磁盘
最后一次持久化,可能数据丢失
Fork,复制一个与当前进程一样的进程,作为原进程的子进程
*写时复制技术
优势:适合大规模的数据恢复
对数据的完整性和一致性要求不高更适合使用
恢复时间块
劣势:2倍的空间
AOF:Append Only File
以日志的形式来记录每个写操作,将Redis执行过的所有写指令记录下来,只许追加文件
但不可以改写文件
开启:配置文件中 appendonly yes
AOF和RDB同时开启,系统默认取AOF的数据
修复:redis-check-aof --fix ...
优势:1.备份机制更稳健,丢失数据概率更低
2.可读的日志文本,通过操作AOF稳健,可以处理误操作
劣势:1.比RDB占用更多磁盘空间
2.恢复备份速度慢
3.每次读写都同步的话,有一定的性能压力
4.存在个别bug
AOF持久化流程:
1.客户端的请求写命令会被append追加到AOF缓冲区内
2.AOF缓冲区根据AOF持久化策略[always、everysec、no]将操作sync同步到磁盘
的AOF文件中
3.AOF文件大小超过重写策略或手动重写时,会对AOF文件rewrite重写,压缩AOF文件
容量
4.Redis服务重启,会load加载AOF文件中的写操作达到数据恢复的目的
Redis主从复制:
主机数据更新后根据配置和策略,自动同步到备机的master/slaver机制,Master以写为主,Skave以读为主
*读写分离,性能扩展
*容灾快速恢复
搭建一主多从:(appendonly no)
1.创建/myredis文件夹
2.复制redis.conf配置文件到文件夹中
3.配置一主多从,创建多个配置文件
4.在配置文件中写
include /myredis/redis.conf
pidfile /var/run/redis_6379.pid
port 6379
dbfilename dump6379.rdb
redis-sever redis.conf 开启服务...
info replication 查看当前主机的运行状况
redis.cli -p 端口号
在从机上执行 slaveof <ip><port>
一主二仆:
从服务器挂掉,重启需要再次确定从机,确定后自动将主机的数据复制到从机
主服务器挂掉,从机不变,重启主机也不变
主从复制原理:
1.从服务器连接上主服务器后,从服务器向主服务器发送进行数据同步消息
2.主服务器接受到从服务器发送过来同步消息,把主服务器数据进行持久化
rdb文件,把rdb文件发送从服务器,从服务器拿到rdb进行读取
3.每次主服务器进行写操作后,和从服务器进行数据同步
薪火相传:
反客为主:slaveof no one 将从机变为主机
哨兵模式:反客为主自动版
1./myredis中创建 sentinel.conf文件,
sentinel monitor mymaster 主机ip 端口号 1(至少有多少个哨兵同意迁移的数量)
2.redis-sentinel sentinel.conf 启动哨兵
1.新主登基:从下线的主服务器的所有从服务里面挑选一个,将其转为主服务器
选择条件依次:
1.选择优先级靠前的
在redis.conf 中 replica-priority 优先值 值越小优先级越高
2.选择偏移量最大的(获得原主机数据最全的)
3.选择runid最小的从服务(每个redis实例启动后都会随机生成一个40位的runid)
2.群仆俯首:挑选出新的主服务后,sentinel向原主服务的从服务发送slaceof 新主服务的命令,复制新master
3.旧主俯首:当已下线的服务重新上线时,sentinel会向其发送slaveof命令让其成为新主的从
Redis集群:
Redis集群实现了对Redis的水平扩容、通过分区来提供一定程度的可用性
cluster-enabled yes
cluster-config-file nodes-端口号.conf
cluster-node-timeout 时间
redis-cli --cluster create --cluster-replicas 1 ip:端口号
replicas 1 最简单的方式配置集群
redis-cli -c -p 集群方式连接
cluster nodes 集群信息
*分配原则尽量保证每个主数据库运行在不同的IP地址,每个从库和主库不在同一个IP
slots:插槽
一个redis集群,有16384个插槽 0-16383
数据库中每个key属于一个插槽,有相对的公式计算
cluster keyslot key 得到插槽值
cluster countkeysinslot 插槽号 查看插槽的值
cluster getkeysinslot 插槽号 值 查看key
故障恢复:某台主机挂掉,从机会变为主机,原主机重启,会变为之前从机的从机
如果某一段插槽的主从都挂掉:cluster-require-full-coverage
yes:真个集群都挂掉
no:该插槽的数据全部不能使用,也无法存储
Redis应用过程问题:
缓存穿透:1.应用服务器压力变大、2.redis命中率降低、3.一直查询数据库
现象:1.redis查询不到数据、2.出现很多非url访问
解决:1.对空值缓存
2.设置可访问的名单(白名单)
3.采用布隆过滤器
4.进行实时监控
缓存击穿:1.数据库访问压力瞬间增加、2.redis里面没有出现大量key过期
2.redis正常运行
问题:1.redis某个key过期了,大量访问使用这个key
解决:1.预先设置热门数据
2.实时调整
3.使用锁
缓存雪崩:1.数据库压力变大服务器奔溃
问题:1.在极少的时间段,查询大量key的集中过期情况
解决:1.构建多级缓存架构
2.使用锁或队列
3.设置过期标志更新缓存
4.将缓存失效时间分散
分布式锁:setnx key value 设置锁
可以设置key的过期时间,自动释放
set key value nx ex 过期时间 上锁+过期时间
UUID防止锁的互删
LUA脚本保证删除操作原子性
Redis6新功能:
ACL:Access Control List 访问控制列表
acl list 用户权限列表
acl cat 查看命令
acl setuser ... on >password ...
auth 用户名 密码 切换用户
IO多线程
Cluster工具