• 博客园logo
  • 会员
  • 周边
  • 新闻
  • 博问
  • 闪存
  • 众包
  • 赞助商
  • YouClaw
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录

sm1le

  • 博客园
  • 联系
  • 订阅
  • 管理

公告

View Post

Redis

1.数据结构
五个基本类型:
字符串:set、get

底层
struct sdshdr{ 
    unsigned int len; // 标记buf的长度 
    unsigned int free; //标记buf中未使用的元素个数 
    char buf[]; // 实际存储的内容 
}

哈希:hset、hget。底层为压缩列表或哈希表。
列表:lpush、lpop、rpush、rpop,存储多个有序的字符串。底层为压缩列表或双向链表。
集合:sadd、smembers,一个key存储多个字符串。底层为整数集合或哈希表。
有序集合:zadd、zrank,已排序的集合,不能存在重复字符串。底层为压缩列表或跳表。
三个特殊类型:
Geospatial:地理位置定位,用于存储地理位置信息
Hyperloglog:用来做基数统计算法的数据结构
Bitmap:用一个比特位来映射某个元素的状态

2.缓存相关
一般情况:读请求过来,首先从缓存中查询,有值命中则直接返回,否则到数据库进行查询,把数据库的值更新到缓存中再返回
缓存穿透:
指查询一个一定不存在的数据,由于缓存是不命中时需要从数据库查询,查不到数据则不写入缓存,这将导致这个不存在的数据每次请求都要到数据库去查询,进而给数据库带来压力。
解决办法:
1.参数校验,过滤非法值
2.如果查询数据库为空,给缓存设置空值或默认值,然后设置一个过期时间
3.通过布隆过滤器查询值存不存在,存在才继续查询

缓存雪崩:
指缓存中数据大批量到过期时间,而查询数据量巨大,请求都直接访问数据库,引起数据库压力过大甚至宕机
解决办法:均匀设置过期时间

缓存击穿:
指热点key在某个时间点过期的时候,而恰好在这个时间点对这个Key有大量的并发请求过来,从而大量的请求打到数据库。
解决办法:当热key快到过期时间时,重新设置过期时间

3.过期相关
过期策略:
Redis采用惰性过期和定期过期两种策略
1.定时过期:每个设置过期时间的key到时间后便清除,对内存友好,但会占用大量CPU时间
2.惰性过期:只对访问到key进行判断是否过期,对CPU友好,但太多过期key占用大量内存
3.定期过期:每隔一段时间扫描一定数量的key,折中办法

内存淘汰策略:
volatile-lru:当内存不足以容纳新写入数据时,从设置了过期时间的key中使用LRU(最近最少使用)算法进行淘汰;
allkeys-lru:当内存不足以容纳新写入数据时,从所有key中使用LRU(最近最少使用)算法进行淘汰。
volatile-lfu:4.0版本新增,当内存不足以容纳新写入数据时,在设置了过期的key中,使用LFU算法(最少使用)进行删除key。
allkeys-lfu:4.0版本新增,当内存不足以容纳新写入数据时,从所有key中使用LFU算法进行淘汰;
volatile-random:当内存不足以容纳新写入数据时,从设置了过期时间的key中,随机淘汰数据;。
allkeys-random:当内存不足以容纳新写入数据时,从所有key中随机淘汰数据。
volatile-ttl:当内存不足以容纳新写入数据时,在设置了过期时间的key中,根据过期时间进行淘汰,越早过期的优先被淘汰;
noeviction:默认策略,当内存不足以容纳新写入数据时,新写入操作会报错。

4.Redis应用
缓存、排行榜、计数器、共享session、分布式锁、社交网络

5.持久化机制
RDB:
默认机制,把内存数据以快照的形式保存在磁盘上。Redis会新开一个子进程进行持久化,将数据写入一个临时文件中,再用这个临时文件替代上一次持久化的文件
优点:适合大规模数据的持久化
缺点:无法做到实时持久化,有可能丢失最后一次持久化的数据
触发条件:
自动触发:save m n,在m秒内发生n次key变化则触发bgsave
手动触发:save(阻塞redis),bgsave(开子进程)

AOF:
以日志的形式将写指令记录下来,redis重启后会根据日志内容执行写指令完成数据恢复工作
优点:丢失数据的可能性更小
缺点:恢复数据慢,磁盘空间占用较多

5.redis高可用
1.主从复制:Redis部署了多台机器,有主节点,负责读写操作,有从节点,只负责读操作。从节点的数据来自主节点,第一次连接采用全量复制,之后采用增量复制。当主节点宕机,需要人工将从节点提升为主节点,并且告知客户端主节点发生变化。
2.哨兵模式:由一个或多个Sentinel实例组成的Sentinel系统,它可以监视所有的Redis主节点和从节点,发现节点不可达时,作下线标识,当主节点被标识时,哨兵会进行协商,当大多数哨兵认为主节点不可达时,自动将下线主服务器属下的某个从节点升级为新的主节点,同时通知客户端。
3.集群模式:对数据进行分片,也就是说每台Redis节点上存储不同的内容,通过Gossip协议通信。
主观下线:集群中每个节点定期给其他节点发送ping消息,接收节点回复pong,若一段时间内接受节点没有回复,则主观认为该节点下线。
客观下线:当某节点主观下线后,下线消息将在集群内传播,当超过一半节点标记该节点下线时,该节点客观下线,集群广播该节点下线。

6.分布式锁
获取锁:setnx
释放锁:del

避免死锁:设置过期时间(expire time)只能用于set命令
原子操作:set key value EX(PX) time NX(XX)
EX: 设置失效时长,单位秒
PX: 设置失效时长,单位毫秒
NX:key不存在时设置value,成功返回OK,失败返回(nil)
XX:key存在时设置value,成功返回OK,失败返回(nil)

posted on 2022-08-02 21:53  sm1le  阅读(25)  评论(0)    收藏  举报

刷新页面返回顶部
 
博客园  ©  2004-2026
浙公网安备 33010602011771号 浙ICP备2021040463号-3