Redis学习总结
对redis进行学习总结
Redis介绍
Redis是使用c语言开发的一个高性能键值数据库。Redis可以通过一些键值类型来存储数据。
键值类型: String字符类型 map散列类型 list列表类型 set集合类型 sortedset有序集合类型
Redis的数据结构
- String
介绍:Redis中的字符串结构是类似java中的ArrayList结构,是可以动态扩容的,扩容方式为翻倍现有容量,
限制:大小限制在512M(key同样) - Hash
介绍:Redis中的哈希表结构类似与Java中的HashMap结构,都是由数组+链表组成的二维结构,数组大小也是2^n次方,哈希碰撞频繁,有扩容和缩容(Java没有)的功能,扩容方式不是一次性的rehash,因为Redis是单线程的,rehash如果数据较多的情况下会耗费较长时间,导致线程卡顿,所以Redis采用了渐进式rehash的方案。它会同时保留两个新旧hash结构,在后续的定时任务以及hash结构的读写指令中将旧结构的元素逐渐迁移到新的结构中。这样就可以避免因扩容导致的线程卡顿现象,缩容同理。
限制:2^32-1个元素 - List
介绍:类似队列/栈结构,可以从左进右出,右进左出,双向链表
优化:使用ziplist结构。由于需要建立链表结构,而且redis中的是双向链表,所以需要大量指针导致占用内存,所有有ziplist结构(元素较少,由一段连续的内存组成,节省大量指针空间),然后有多个压缩链表组成一段quickList,这样既可以实现链表快速插入弹出功能,又节省了大量指针所需的空间
限制:2^32-1个元素 - Set
介绍:与HashMap类似,不过是由value直接作为hash值,且一个集合中不会有相同value
限制:2^32-1个元素 - Sorted-set
介绍:由value+score组成元素,score是来进行排序的标准,有hash表和跳跃列表组合的特殊结构
限制:2^32-1个元素
跳跃列表介绍:跳跃链表是一种特殊的链表结构,由于链表没有像数组一样拥有快速查找的功能,也无法使用二分法,所以通过使用跳跃列表来提高链表的查询功能(B+树就是一种跳跃列表)
Redis特性
-
redis储存在内存中
redis不同于mysql,数据是储存在内存中而不是磁盘中,速度快很多。 -
单线程
redis是单线程的,减少了线程切换和竞争的开销,速度非常快。 -
多数据库
redis中提供16个数据库,编号为0-15,可以通过move
实现数据转移 -
持久化
redis支持持久化,主要分为两种方式:RDB和AOF(可通过redis.conf配置文件进行配置)
1.RDB:通过快照方式,定期将缓存内容写入磁盘中。(dump.rdb)
优点:容易恢复,占用空间相对AOF小,性能也比AOF高
缺点:高可用性较低,由于是定期进行保存,可能导致数据部分丢失
900秒内有一个key修改,同步一次、300秒有10个修改、60秒有100000.
2.AOF:通过设置同步方式来实现同步(数据写入appendonly.aof)
1、每秒同步:性能较高,不过可能会出现数据丢失
2、每修改同步:实现完全数据同步,不过性能较低
3、不同步
优点:高可用性较高,保证数据安全
缺点:保存相同数据下文件大小比RDB大,且性能比RDB低
注:可以两种模式都开启 -
事务支持
redis支持事务
multi #开启事务
exec #提交事务
discard #事务回滚
Redis的主从复制
- 什么是主从复制?
持久化保证了即使redis服务重启也不会丢失数据,因为redis服务重启后会将硬盘上持久化的数据恢复到内存中,但是当redis服务器的硬盘损坏了可能会导致数据丢失,如果通过redis的主从复制机制就可以避免这种单点故障,如下图
说明:
主redis中的数据有两个副本(replication)即从redis1和从redis2,即使一台redis服务器宕机其它两台redis服务也可以继续提供服务。
主redis中的数据和从redis上的数据保持实时同步,当主redis写入数据时通过主从复制机制会复制到两个从redis服务上。
只有一个主redis,可以有多个从redis。
主从复制不会阻塞master,在同步数据时,master 可以继续处理client 请求
一个redis可以即是主又是从,如下图:
此应用自 https://juejin.im/post/5a912b3f5188257a5c608729#heading-31
注意
- 从java对象储存到redis中,需要进行序列化,从redis取出为java对象,需要反序列化
参考博客:
https://juejin.im/post/5a912b3f5188257a5c608729#heading-31
https://juejin.im/post/5b53ee7e5188251aaa2d2e16#heading-4
Redis安装步骤