redis复习笔记

redis特性

速度快,完全基于内存,使用C语言实现,单线程模型
与传统数据库不同的是 Redis 的数据是存在内存中的,所以读写速度非常快,因此 redis 被广泛应用于缓存方向,每秒可以处理超过 10万次读写操作,是已知性能最快的Key-Value DB。

分布式缓存和本地缓存

在程序内部创建的map,set之类的就是本地缓存
分布式缓存,就是一些nosql数据库,常用的如memcache redis等
本地缓存,轻便快速,但是在程序结束的时候即结束,大缓存容易产生oom,且不同线程之间,缓存内容不同
分布式缓存一致性更好一点,用于集群环境下多节点使用同一份缓存的情况;有网络IO,吞吐率与缓存的数据大小有较大关系

redis和memcached

memcached可以缓存图片,视频,只支持key-value,没有数据持久化和事务功能,挂掉后数据不可恢复,存储方式是全部数据放到内存中
redis可以支持的数据结构有五种hash list set zset和string结构,大部分redis数据是放到内存中的,redis 支持持久化,主从备份,挂掉之后数据可恢复
在这里插入图片描述

redis可以存储的数据结构

1.Sring 普通的string,基本大家都支持
2.List 列表,常用于商品列表,评论列表
Redis列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)
3.Set 无序集合 适合交集、并集、查集操作,例如朋友关系
Redis 的 Set 是 String 类型的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据。
Redis 中集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是 O(1)。
4.Zset 有序集合 去重之后排序,适合排名场景
Redis 有序集合和集合一样也是 string 类型元素的集合,且不允许重复的成员。
不同的是每个元素都会关联一个 double 类型的分数。redis 正是通过分数来为集合中的成员进行从小到大的排序。有序集合的成员是唯一的,但分数(score)却可以重复。
5.Hash 哈希 来存结构化数据 hash key是这个hash的名字,然后里面的存储的东西是一个一个的key-value,是一个 string 类型的 field(字段) 和 value(值) 的映射表

常用命令 hgetall key;hget key field;keys *;del key;lpush/rpush;sadd key value;lrange;zrange
hash序列化比较复杂,但是灵活性高

一般对象用string + json存储,对象中某些频繁变化的属性抽出来用hash存储

Redis Stream 是专门为了持久化消息队列实现的数据结构

Redis Stream 主要用于消息队列(MQ,Message Queue),Redis 本身是有一个 Redis 发布订阅 (pub/sub) 来实现消息队列的功能,但它有个缺点就是消息无法持久化,如果出现网络断开、Redis 宕机等,消息就会被丢弃。

redis一些使用场景

存储session
作为缓存使用
存储排行榜
计数器:Redis可以直接对string类型对象做自增自减

redis持久化

包括RDB(默认) 和 AOF 机制
​ RDB是Redis默认的持久化方式。按照一定的时间将内存的数据以快照的形式保存到硬盘中,对应产生的数据文件为dump.rdb。通过配置文件中的save参数来定义快照的周期。就是定时保存redis快照
AOF:AOF持久化(即Append Only File持久化),则是将Redis执行的每次写命令记录到单独的日志文件中,当重启Redis会重新将持久化的日志中文件恢复数据。就是保存日志,从日志恢复redis数据
AOF可以保证数据完全不丢失,而RDB不行,RDB可能会丢失在最后一次备份之后到挂了那一刻之前的所有数据,但是RDB启动速度比AOF快,仅此而已

redis发布订阅

subscribe/publish 命令
通过subscribe订阅发布消息的redis数据库,发布消息的redis数据库通过publish发布需要发布的消息

redis 事务

事务支持一次执行多个命令,一个事务中所有命令都会被序列化。在事务执行过程,会按照顺序串行化执行队列中的命令,其他客户端提交的命令请求不会插入到事务执行命令序列中。总结来说,redis事务隔离级别是串行化的
事务命令:
MULTI用于开启一个事务,它总是返回OK。MULTI执行之后,客户端可以继续向服务器发送任意多条命令,这些命令不会立即被执行,而是被放到一个队列中,当EXEC命令被调用时,所有队列中的命令才会被执行。
EXEC执行所有事务块内的命令。返回事务块内所有命令的返回值,按命令执行的先后顺序排列。当操作被打断时,返回空值 nil 。
WATCH是一个乐观锁,可以为 Redis 事务提供 check-and-set (CAS)行为。可以监控一个或多个键,一旦其中有一个键被修改(或删除),之后的事务就不会执行,监控一直持续到EXEC命令。
DISCARD调用该命令,客户端可以清空事务队列,并放弃执行事务,且客户端会从事务状态中退出。
UNWATCH命令可以取消watch对所有key的监控。

redis事务是没有回滚的,redis事务里面有一条执行失败了,其他操作也不会回滚,后续操作也不会中断,redis事务只不过是批处理脚本罢了

redis主从

全量同步:一般出现在初始化阶段
处理完之后从数据库可以处理读请求

步骤:
1.从数据库先连接主数据库,发送SYNC
2.然后主数据库生成快照,并记录在此期间的写操作
3.主数据库向从数据库发送快照
4.主数据库向从数据库发送缓存的写命令
在这里插入图片描述
增量同步:
Redis增量复制是指Slave初始化后开始正常工作时主服务器发生的写操作同步到从服务器的过程。
增量复制的过程主要是主服务器每执行一个写命令就会向从服务器发送相同的写命令,从服务器接收并执行收到的写命令。
Redis主从同步策略
主从刚刚连接的时候,进行全量同步;全同步结束后,进行增量同步。当然,如果有需要,slave 在任何时候都可以发起全量同步。redis 策略是,无论如何,首先会尝试进行增量同步,如不成功,要求从机进行全量同步。
Redis主从复制不阻塞主服务器端。也就是说当若干个从服务器在进行初始同步时,主服务器仍然可以处理请求。主从复制也不阻塞从服务器端。

在上面的全量同步过程中,master会将数据保存在rdb文件中然后发送给slave服务器,但是如果master上的磁盘空间有效怎么办呢?那么此时全部同步对于master来说将是一份十分有压力的操作了。此时可以通过无盘复制来达到目的,由master直接开启一个socket将rdb文件发送给slave服务器。(无盘复制一般应用在磁盘空间有限但是网络状态良好的情况下)

redis 内存淘汰机制

5.0从六种变成了八种,默认no-eviction
volatile-lru 从已设置过期时间的数据集中挑选最近最少使用的数据淘汰
volatile-lfu 从已设置过期时间的数据集中挑选最不经常使用的数据淘汰
volatile-ttl 从已设置过期时间的数据集中挑选将要过期的数据淘汰
volatile-random 从已设置过期时间的数据集中挑选任意数据淘汰
allkeys-lru 当内存不足写入新数据时淘汰最近最少使用的Key
allkeys-random 当内存不足写入新数据时随机选择key淘汰
allkeys-lfu 当内存不足写入新数据时移除最不经常使用的Key
no-eviction 当内存不足写入新数据时,写入操作会报错,同时不删除数据

redis五种基本数据类型对应的底层结构

https://blog.csdn.net/yx0628/article/details/80035533
https://zhuanlan.zhihu.com/p/107467642

String :sds
List: ziplist/linkedlist
Hash : ziplist/hashmap
Set: intset/hashmap
ZSet:ziplist/skiplist
跳表的结构

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值