Redis开发与运维读书笔记

本文记录了阅读该书中本人认为比较有收获,比较重要的知识点。其中有一些内容加了一些自己的理解。

API的理解和使用

为什么redis单线程还那么快?

  • 纯内存操作。避免了读写文件的时间消耗
  • 非阻塞IO。redis使用epoll作为I/O多路复用技术的实现,再加上Redis自身的事件处理模型将epoll中的连接、读写、关闭都转换为事件,不在网络I/O上浪费过多的事件。

epoll:
一开始说,epoll 是对 select 和 poll 的改进,避免了“性能开销大”和“文件描述符数量少”两个缺点。
对于“文件描述符数量少”,select 使用整型数组存储文件描述符集合,而 epoll 使用红黑树存储,数量较大。
对于“性能开销大”,epoll_ctl 中为每个文件描述符指定了回调函数,并在就绪时将其加入到就绪列表,因此 epoll 不需要像 select 那样遍历检测每个文件描述符,只需要判断就绪列表是否为空即可。这样,在没有描述符就绪时,epoll 能更早地让出系统资源。

  • 单线程避免了线程切换和竞争生产的消耗。

String类型

由于redis所有数据类型其实都是{key, value}的形式,因此String其实就是我们平常所说的“hashmap”,字符串类的值其实可以是简单的字符串,也可是XML、Json,甚至对java对象进行序列化后的值、也可以是数字、二进制(图片音频、视频),但是不能超过512M
在这里插入图片描述
str的存储结构:
int: 8个字节的长整型
embstr: 小于等于39个字节的字符串
raw: 大于39个字节的字符串
redis会根据当前值的类型和长度决定使用哪个数据结构(str也可以存int型)
string的使用场景:

  • 缓存功能。
    redis作为缓存层,减少存储层mysql的压力。

  • 计数
    许多应用Redis作为计数的基础工具,它可以实现快速计数、计数查询的功能(单线程执行,保证数据的正确性)

  • 共享session。
    用于分布式登录中共享session

  • 限速。
    和共享session原理相同,限制同一个Ip访问

  • 序列化保存数据。缺点就是序列化和反序列化需要开销
    set user:1 serialize(userInfo)

hashmap

key key value 形式

内部编码
ziplist:压缩列表,小于64个字节,查找效率慢
hashtable:哈希表,查找效率为O(1),会消耗更多内存

使用场景
记录用户信息
哈希表和关系型数据库的区别:

  • 哈希表是稀疏的,关系数据库的结构化的,关系数据库一旦创建某行数据,所有的行都要为其设置值(NULL)
  • 关系数据库可以做复杂的关系查询,而Redis去模拟关系型复杂查询开发困难。

列表

列表类用来存储多个有序的字符串,列表是有序的,可以范围查找,也可以从某个元素前后插入元素,可以从下表取出元素,可以对两端插入和弹出,

存储类型

  • ziplist(压缩列表) 默认64字节
  • linkedlist(链表)
    使用场景
    1、消息队列
    2、列表
    3、栈都可以
    lpush + lpop = Stack
    lpush + rpop = Queue

集合Set

集合中的元素不能重复,无序,redis实现了两两集合之间计算交集、并集
存储类型

  • intset 默认小于512字节
  • hashtable(哈希表)
    使用场景
    给用户打标签(tag)

有序集合

可以排序的set(对key排序)
存储类型

  • ziplist 默认小于128字节
  • skiplist(跳表)
    使用场景
    排行榜

bitmap

用二进制(位)作为信息的存储单位,一个字节等于8位
bitmap本身不是一个数据结构,其实是一个字符串
redis给bitmap单独提供了一套命令,可以把bitmap当成以位为单位的数组,数组的每个单位只能存储0和1,数组下标为Bitmap中叫做偏移量。
redis提供给bitmap数组的下标查找,范围查找
使用场景
记录某天登录的用户id
setbit unique:users:2016-04-05 0 1 设置值为1
bitcount key [start end] 获取范围内1的个数
bitmap还可以做两两之间的交集or、并集and、非、异或

计算两天内用户都登录过的数量
bittop and newkey key1 key2 

bitmap并不是万金油,当用户量很大,但是日活量很小的时候并不适用

HyperLogLog

hyperLogLog可以极小的内存空间完成独立总数的统计,占用内存非常小,但是存在一定的误差率

持久化

AOF 和 RDB

RDB

bgsave 保存redis快照。首先执行fork操作创建子进程,由子进程负责,完成自动结束。

rdb优点:
1、恢复数据远远快于AOF的方式
2、RDB是一个紧凑的二进制文件,代表某个时间上的数据快照。
缺点:
1、没办法做到实时持久化/秒级持久化,fork子进程属于重量级操作,频繁执行成本太高。
2、redis版本演化过程中有多个格式的RDB版本,存在老版本的Redis可能存在无法兼容新版本的问题。

AOF(append only file)

以独立日志的方式记录每次写命令,重启时重新执行AOF的文件命令达到恢复数据的目的。AOF主要是解决了数据库持久化的实时性。
为了提高AOF性能:
1、AOF缓冲区。设置缓冲器定时写入,减少磁盘IO访问次数。
2、重写机制。解决文件过大问题。合并一些命令操作,减少文件体积。

重写机制过程:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值