什么是redis
redis是 C语言开发的开源的非关系型(NOSQL)的键值对数据库。它的键只能是string,值类型包括string,hash,list,set,zset等。它的数据保存在内存中,所以速度非常快,常用于分布式缓存。
redis的数据类型对应底层数据结构
redis的优缺点
优点:
速度快;
支持多种数据类型;
支持数据持久化;
支持事务,redis操作是原子性的,它还支持多个操作合并后的原子性操作;
支持主从复制,可以实现读写分离
缺点:
数据库容量受内存限制
redis为什么快
1.它完全基于内存
2.采用单线程,避免了线程间的上下文切换
3.数据结构简单,数据操作简单
4.使用多路I/O复用,非阻塞IO
redis是单线程还是多线程
redis是单线程的,但定期删除、数据持久化、主从同步都是由额外子线程执行的,6.0后还引入了多线程进行IO读写处理,但它执行命令的主线程还是单线程的。
redis的持久化机制
RDB:内存中的数据集以快照的形式保存到磁盘
AOF:将执行的每条写命令保存到文件中
优缺点:RDB的数据恢复速度更快;AOF数据不容易丢失,安全性更高
两种方式可以同时使用,既能方便数据的备份,也能确保数据的完整性
缓存雪崩,缓存击穿,缓存穿透
缓存雪崩:同一时间大面积key时效
处理办法:在批量往redis存数据时,加上个随机值
缓存击穿:一个非常热点数据失效,大并发访问直接落到数据库上
处理办法:非常热点的数据设置永不过期,或者获取数据的地方使用互斥锁
缓存穿透:是指用户发起大量请求获取一个在数据库和缓存中都不存在的值
处理办法:对请求数据进行校验,或者将此类数据也存入缓存
redis集群策略
- 主从模式
- 建立连接:
1:设置master的ip和port,保存master的信息
2:建立socket连接
3:定时发送ping
4:身份验证
5:发送slave的port - 数据同步
1:请求同步数据
2:创建RDB文件
3:恢复RDB文件
4:请求部分同步数据
5:恢复部分同步数据 - 命令传输
1:发送offset
2:接收slave的offset与本身的offset比较。
不在缓冲区,则执行全量复制。
在缓冲区发送本身offset和需要同步的数据。
3:保存offset,恢复部分同步数据
- 建立连接:
- 哨兵模式
- 监控:不断检查master和slave的状态。
- 通知:当监控到服务器出现异常,向其他哨兵和slave发送通知。
- 故障转移:断开master与slave的连接,选取一个slave为新的master,并告知客户端服务器的地址
[^1]: 有“主观下线”和“客观下线”两个概念 - 集群模式
多个主从结构作为一个整体使用,即数据分散保存到多台master中,每个master只有一部分数据。
redis分布式锁的实现
使用redission.getLock()获取锁对象->.lock()执行锁操作->.isLock()判断锁是否存在->.isHoldByCurrentTread()判断是否自己的锁->.unlock()解锁
底层命令是SETNX
redis红锁
redis节点之间既没有主从,也没有集群关系。客户端用相同的key和随机值在redis节点上请求锁,请求锁的超时时间应小于锁自动释放时间。当在超过半数redis上请求到锁的时候,才算是真正获取到了锁。如果没有获取到锁,则把部分已锁的redis释放掉。
redis的过期删除策略
惰性删除:
定期删除:
redis的淘汰机制
noevicition:不淘汰,redis满了以后新的存入直接报错
allkeys-lru:对所有key,进行最近最少使用机制淘汰(使用时间远近)
allkeys-lfu:对所有key,进行最近最少使用次数机制淘汰(单位时间内使用次数的多少)
allkeys-random:对所有key,随机淘汰
volatile-lru:对设置了过期时间的key,进行最近最少使用机制淘汰(使用时间远近)
volatile-lfu:对设置了过期时间的key,进行最近最少使用次数机制淘汰(单位时间内使用次数的多少)
volatil-random:对设置了过期时间的key,随机淘汰
volatile-ttl:对设置了过期时间的key,最快要过期的进行淘汰
常用命令
-
string
set:set key value
get:get key
del:del key
mset:mset key1 value1 key2 value2……
mget:mget key1 value1 key2 value2……
strlrn:strlrn key
append:append key value
incr:incr key
incrby:incrby key increment
incrbyfloat:increbyfloat key increment
decr:decr key
decrby:decrby key increment
setex:setex key seconds value
psetex:psetex key milliseconds value -
list
-
hash
hset:hset key field value
hget:hget key field
hgetall:hgetall key
hdel:hdel key field1 field2……
hmhset:hmset key field1 value1 field2 value2……
hmget:hmget key field1 filed2……
hlen:hlen key
hexists:hexists key field
hkeys:
hvals:
hincrby:
hincrbyfloat: -
set
-
zset
注意事项
- string
数据最大存储量:512MB
数据计算最大范围:long型最大值 - hash
每个hash可以存储2的32次方-1个键值对
常用配置
常用工具
redis瘫痪如何避免数据库压力