logo头像
ICQL

415_redis

NoSql

  • NoSql(Not only sql),非关系型数据库,它不能替代关系型数据库,只能作为关系型数据库的一个良好补充
  • 分类
    • 1)键值(Key-Value)存储数据库:redis
    • 2)文档型数据库:MongoDB
    • 3)列存储数据库:分布式的文件系统,HBase
    • 4)图形数据库:Neo4J、InfoGrid、Infinite Graph

redis介绍

  • redis是使用c语言开发的一个高性能键值(Key-Value)内存数据库,单进程单线程模型,不存在并发问题
  • key类型:只能是String
  • value类型:
    • 1)String字符类型
    • 2)Hash散列类型
    • 3)list列表类型
    • 4)set集合类型
    • 5)sortedset有序集合类型
  • 应用场景
    • 缓存(数据查询、短连接、新闻内容、商品内容等等)
    • 分布式集群架构中的session分离
    • 聊天室的在线好友列表
    • 任务队列(秒杀、抢购、12306等等)
    • 应用排行榜
    • 网站访问统计
    • 数据过期处理(可以精确到毫秒)

安装redis和界面客户端

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#docker安装
docker run -di --name=db-redis -p 56379:6379 redis
docker run -di --name=db-redis -p 56379:6379 redis --requirepass "chenqinglin"

#测试redis
#登录容器
docker exec -it db-redis /bin/bash
#进入redis命令界面
redis-cli
#如果配置了密码
auth 密码
#测试:选择第一个数据库
select 1


#界面客户端使用 RedisDesktopManager

java客户端Jedis

1
2
3
#单实例连接
#jedis连接池连接
#spring集成

redis常用命令

  • 1)redis安装默认安装了 0-15 共16个db数据库,如果不选择select 0,默认使用db0
  • 2)Value数据类型
    • (1)String:采用String来存储对象的问题:如果只更新对象中的一个字段,还要完整传输整个数据,造成浪费,应该使用hash类型
    • (2)Hash:字段值只能是字符串类型
      Hash类型示意图
    • (3)List:redis的list是采用来链表来存储的,有序,按照插入顺序,可重复
    • (4)Set:无序,不可重复
    • (5)Sortedset:有序,不可重复,Sortedset和set的不同之处,是会给set中的元素添加一个分数,然后通过这个分数进行排序
  • 3)keys命令
    • 查询满足条件的key:keys pattern,例如keys test*
    • 确认一个key是否存在:exists key
    • 删除一个key:del key
    • 重命名key:rename key newkey
    • 查看值类型:type key
    • 设置key的生存时间(单位:秒)key在多少秒后会自动删除:EXPIRE key seconds
    • 查看key生于的生存时间:TTL key
    • 清除生存时间:PERSIST key
    • 生存时间设置单位为:毫秒 PEXPIRE key milliseconds

redis事务

  • MULTI 去开启事务,EXEC 去执行事务,不支持回滚,不建议使用事务

redis发布订阅

  • 没有ack,不会持久化,不可靠
  • pub/sub

redis多路复用nio

redis中使用lua脚本

  • 减少网络开销,在Lua脚本中可以把多个命令放在同一个脚本中运行
  • 原子操作,redis会将整个脚本作为一个整体执行,中间不会被其他命令插入。换句话说,编写脚本的过程中无需担心会出现竞态条件
  • 复用性,客户端发送的脚本会永远存储在redis中,这意味着其他客户端可以复用这一脚本来完成同样的逻辑

redis持久化

  • 持久化存储分为两种:rdb数据快照、aof日志追加
  • RDB:默认方式,在指定的时间间隔内,执行指定次数的写操作,则会将内存中的数据写入到磁盘中,dump.rdb文件
  • AOF:以日志的形式记录每个操作,将Redis执行过的所有指令全部记录下来(读操作不记录),只许追加文件但不可以修改文件,Redis启动时会读取AOF配置文件重构数据
    • RDB与AOF同时开启 默认先加载AOF的配置文件
    • 相同数据集,AOF文件要远大于RDB文件,恢复速度慢于RDB
    • AOF运行效率慢于RDB,但是同步策略效率好,不同步效率和RDB相同
    • Redis重启就会根据日志内容从头到尾执行一次来完成数据的恢复工作

redis数据过期淘汰策略

  • 1、被动删除:当读/写一个已经过期的key时,会发生一个惰性删除,直接删掉这个过期的key
  • 2、定时删除:由于惰性删除的策略无法保证过期数据被及时删掉,所以redis会定期主动淘汰一批已经过期的key
  • 3、主动清理:当前已用的内存超过配置的maxmemory限定时触发
    • 1)volatile-lru:从已设置过期时间的内存数据集中挑选最近最少使用的数据 淘汰
    • 2)volatile-ttl: 从已设置过期时间的内存数据集中挑选即将过期的数据 淘汰
    • 3)volatile-random:从已设置过期时间的内存数据集中任意挑选数据 淘汰
    • 4)allkeys-lru:从内存数据集中挑选最近最少使用的数据 淘汰
    • 5)allkeys-random:从数据集中任意挑选数据 淘汰
    • 6)no-enviction(驱逐):禁止驱逐数据(默认淘汰策略,当redis内存数据达到maxmemory,在该策略下,直接返回OOM错误)

redis内存模型

redis IO多路复用技术

redis集群

  • 主从
  • codis
  • cluster

缓存穿透、缓存雪崩、缓存击穿

  • 缓存穿透:短时间内大批量请求不存在的key,缓存没有命中,大量请求落在了数据库上导致异常
  • 缓存雪崩:短时间内大量key过期(失效),接着来的众多请求瞬间都落在了数据库上导致异常
  • 缓存击穿:热点数据,某一key在缓存过期后,瞬间大批量请求落在数据库上导致异常
  • 解决方案:
    • 1)使用互斥锁排队:锁上查询数据库的部分,分布式使用分布式锁,单机使用线程锁(synchronized、Lock)
    • 2)缓存空对象:如果一个查询数据库返回的数据为空或者数据库异常,缓存一个空对象,并且设置较短的过期时间
    • 3)布隆过滤器:类似不怎么精确的set结构,判断对象是否存在存在误判,不存在则一定不存在,存在则有可能不存在
    • 4)接口限流与熔断、降级
    • 5)仅缓存雪崩适用:缓存超时时间设置为 固定+随机,一定程度上缓解雪崩问题
微信打赏

赞赏是不耍流氓的鼓励

k" href="#redis介绍">redis介绍
  • 安装redis和界面客户端
  • java客户端Jedis
  • redis常用命令
  • redis事务
  • redis发布订阅
  • redis多路复用nio
  • redis中使用lua脚本
  • redis持久化
  • redis数据过期淘汰策略
  • redis内存模型
  • redis IO多路复用技术
  • redis集群
  • 缓存穿透、缓存雪崩、缓存击穿