Redis基础类型
Redis是一个key-value的存储系统,使用ANSI C语言编写
key的类型是字符串;
value的类型有:
常用的:String,list,set,sortedset,hashdeng
不常见的:bitmap(位图),geo地理位置
Redis5.0中新增一种类型:stream
Redis中命令忽略大小写,key是不忽略大小写的
String
String类型是Redis中最常用的类型,就是普通的set和get,做简单的KV缓存;
在实际开发中,也会把一些复杂结构统一转为String存储,使用的时候在反序列化拿出来;
String的实际使用场景有:
- 缓存功能
String字符串是最常用的数据类型,不仅仅是Redis,利用Redis作为缓存,配合其它数据库作为存储层,利用Redis支持高并发的特点,可以大大加快系统的读写速度、以及降低后端数据库的压力 - 计数器
许多系统都会使用Redis作为系统的实时计数器,可以快速实现计数和查询的功能。最终的计算结果还可以按照特定的时间落地到数据库或其他存储介质中 - 共享用户session
用户重新刷新一次页面,可能需要访问一下数据进行重新登陆,或者访问页面cookie,也可以利用Redis将用户的session集中管理,这样只需要保障Redis的高可用,每次用户session的更新和获取都可以快速完成,大大提高效率
Hash
Redis hash是一个String类型的filed和value的映射表,它提供了字段和字段值的映射。是一种类似map的结构,可以将结构话的数据,比如一个对象(没有嵌套其它的对象)给缓存在Redis中,每次读写缓存的时候,可以操作hash中的某个字段
每个hash可以存储2^32-1键值对。
List
有序列表,可以存储有序、可重复的元素。获取头部、尾部附近的元素是极快的
List元素的个数最多2^32-1个
- 可以用作栈或队列使用,也可以用于各种列表;
- 可以通过Irange命令,读取某个闭区间内的元素,可以基于list实现分页查询,基于Redis实现简单的高性能分页,类似微博下拉不断分页的逻辑;
Set
无序集合,自动去重;适用于不能重复且不需要顺序的数据结构
set元素的个数最多2^32-1个
- 在某个部署在多台机器上的系统中,可以利用Redis进行全局的set去重
- 可以基于set进行交集、并集、差集的操作,比如交集,可以把两个人的好友列表做交集,得出两人的共同好友
Sort Set
排序的set,去重且可以排序
- 可以按照分值排序,适用于做排行榜的场景;
- 可以用来做带权重的队列,比如普通消息权重为1,重要消息权重为2,工作线程可以根据权重来获取工作任务,让优先任务先执行
Bitmap
位图,按照bit位来存储信息,可以用来实现 布隆过滤器
通过一个bit位来表示某个元素对应的值或状态,key对应元素本身
bit本身会极大节省空间内存
- 用户每月签到,用户id为key,日期作为偏移量1表示签到
- 统计活跃用户,日期为key,用户id作为偏移量1表示活跃
- 查询用户在线状态,日期为key,用户id作为偏移量1表示在线
Geospatial
用来保存地理位置,并作位置距离计算或者根据半径计算位置等。
HyperLogLog
不精确的去重计数功能,比较适合用来做大规模数据的去重统计
Stream
用于可持久化的消息队列
几乎满足了消息队列具备的全部内容,包括
- 消息id的序列化生成
- 消息遍历
- 消息的阻塞、非阻塞读取
- 消息的分组消费
- 未完成消息的处理
- 消息队列监控
每个stream都有唯一的名称,就是redis的key
订阅发布功能
Redis的发布订阅机制包括三个部分,publisher,subscriber和channel
发布者和订阅者都是Redis客户端,channel则是Redis服务端
发布者将消息发布到某个频道,订阅了这个频道的订阅者就能收到这条消息
发布订阅的机制
订阅某个频道或模式:
- 客户端client
属性为pubsub_channels,该属性表明了客户端订阅的所有频道
属性为pubsub_patterns,该属性表明了客户端订阅的所有模式 - 服务器端redisserver
属性为pubsub_channels,该服务器端中的所有频道以及订阅了这些频道的客户端
属性为pubsub_patterns,该服务器端中的所有模式和订阅了这些模式的客户端
当客户端向某个频道发送消息时,Redis首先在redisServer中的pubsub_channels中找出键为该频道的节点,遍历该节点的值,即遍历了所有订阅了该频道的客户端,将消息发送给这些客户端
然后遍历结构体redisServer中的pubsub_patterns,找出包含该频道的模式的节点,将消息发送给订阅了该模式的客户端
使用场景
- 哨兵模式
在Redis哨兵模式中,哨兵通过发布与订阅的方式与Redis主服务器和从服务器进行通信。(后续详细写哨兵模式) - Redisson框架
一个分布式框架,在Redisson分布式锁释放的时候,通过发布与订阅的方式通知的
Redis持久化
为什么要持久化
Redis是内存数据库,宕机后数据会消失
Redis重启后快速恢复数据,需要提供持久化机制
Redis持久化数据是为了快速恢复数据,不是为了存储数据
Redis有两种持久化方式:RDB和AOF
Redis持久化不保证数据的完整性
当Redis用作DB时,DB数据要完整,所以一定要有一个完整的数据源(文件、mysql)
在系统启动时,将这个完整数据源中的数据load到Redis中
RDB
Redis Data Base,是Redis默认的存储方式,RDB是通过快照来完成的。记录的这一刻的数据,不关注过程
- 优点:
RDB是二进制压缩文件,占用空间小,便于传输(传给slaver)
主进程fork子进程,可以最大化Redis性能,主进程不能太大,Redis数据量不能太大,复制过程中主进程阻塞 - 缺点
不保证数据完整性,会丢失最后一次快照以后的更改的数据
AOF
append only file,另一种持久化方式,默认不开启,开启后Redis将对所有写入命令(及其参数)记录到AOF文件中,以达到记录数据库状态的目的,这样Redis重启后只要按顺序回访这些命令就可以恢复到原始状态
AOF会记录过程,RDB只管结果
先写到这~~~~~~~~