Redis学习笔记一 入门基础

为什么快?

  纯内存访问

  非阻塞I/O,Redis使用epoll作为I/O多路复用技术的实现,处理了epoll的连接、读写、关闭转化为事件,不在网络I/O上浪费过多时间

   单线程避免了线程切换和竞态发生的消耗

   多路复用:

          select

               有I/O流事件来时,无法知道是什么流发生只能通过轮询的方式找出数据

               时间复杂度:O(n)

               存储:数组 (有最大数限制)

               最大连接数:单个进程所能打开的最大连接数有FD_SETSIZE定义,一般32位是3232 64位是3264

               连接数过大时 :会因为连接数增加带来I/O效率问题

          poll

               和select 没有什么区别,但是他没有最大数限制

               时间复杂度:O(n)

               存储:链表(没有最大数限制)

               最大连接数:没有限制

              连接数过大时:会因为连接数增加带来I/O效率问题

          epoll

               可以理解为event epoll,所以不同于上面的轮询,epoll 会把I/O流事件通知我们所以时间复杂度降低到O(1)

               时间复杂度:O(1)

               连接数过大时:  因为epoll内核中实现是根据每个fd上的callback函数来实现的,只有活跃的socket才会主动调用callback,所以在活跃socket较少的情况下,使用epoll没有前面两者的线性下降的性能问题,但是所有socket都很活跃的情况下,可能会有性能问题。

           总结:连接数少时  select,poll比epoll性能好因为epoll的callback也会造成消耗

是不是单线程?

Redis4.0 之后并不是单线程了 除了主线程外,他也有后台线程处理一些较为缓慢的操作(例如:清除脏数据,无用连接的释放,key释放等),但是它的读是单线程


Redis6.0 新增了多线程的功能来提供I/O的读写性能,他的主要实现思路是将主线的IO读写任务拆分给一组独立的线程去执行,这样就可以使用多个socket的读写可以并行化,采用多路I/O复用技术可以让单个线程高效的处理多个连接请求(尽量减少网络IO的时间消耗),将最耗时的socket的读取、请求解析、写入单独外包出去,剩下的命令执行仍然由主线程串行执行并和内存的数据交互。

Redis6.0默认多线程机制是关闭的需要开启则在Redis.config设置

//io线程 默认为关闭
io-threads-do-reads yes
//io线程数,默认为4
io-threads 4 

最大并发连接               

Redis 2.6 和更新版本中,这个限制是动态的:默认情况下它设置为10000个客户端,除非redis.conf中maxclient的值修改了

数据类型

  Strings  字符串

  Lists 列表,按插入顺序排序 

  Sets 无序集合  

  Hashes  哈希 字符串和字符串值之间的映射

  Sort Sets  排序集

    场景:排行榜存储

  Bitmaps  位图

    bitmaps 占用1位字符

    用途:在特定场景使用bitmaps能大大节约内存使用 

             例如:1亿用户,有5000万活跃用户时 set集合和bitmaps内存占用量有明显差距

数据类型单个占用空间存储总用户量内存量
集合类型64位50 000 00064 x 50 000 000=400MB
Bitmaps1位100 000  0001  x  100 000 000=12.5MB

                而如果用户量只有10万的时候则bitmaps的内存量就不如set

                因为一亿用户bitmap还是要用12.5MB去存储  而集合类型则只用存储10万的用户量的空间

数据类型单个占用空间存储总用户量内存量
集合类型64位100 00064 x 100 000=800KB
Bitmaps1位100 000  0001  x  100 000 000=12.5MB

场景:用户活跃数据多时记录用户当天是否访问

  HyperLogLogs

      用途:能极大的减少内存的存储,但是存储的准确率不是百分之百 ,redis给出的数字是81%,这就可以做很多事情比如可以做一些不需要那么准确的事情 例如布隆过滤器      

数据类型1天1个月
集合类型80M2.4G
Bitmaps15K450K

  Streams 流

  Geospatial indexes  地理空间索引

内存回收策略

      惰性删除

          方法访问时将过期删除  例如:调用redis get命令时

     定时任务删除

          每10s执行定时任务回收过期key

    used_memory>maxmemory触发内存驱逐策略(驱逐策略选择noeviction除外)

数据存储驱逐策略

  • noeviction:达到内存限制时不保存新值。当数据库使用复制时,这适用于主数据库
  • allkeys-lru:保留最近使用的密钥;删除最近最少使用 (LRU) 键
  • allkeys-lfu : 保存常用键;删除最不常用 (LFU) 键
  • volatile-lru:删除最近最少使用的键,expire字段设置为true
  • volatile-lfuexpire :删除字段设置为的最不常用键true
  • allkeys-random:随机删除键为添加的新数据腾出空间。
  • volatile-random:随机删除expire字段设置为 的键true
  • volatile-ttl:删除expire字段设置为true和最短剩余生存时间(TTL)值的键。

驱逐策略选择:

    根据使用率来判断,请选择allkeys-lru策略

     如果你缓存的对象使用不同的TTL值,则使用volatile-ttl策略

构建热点数据驱逐策略常用lru,lfu来判断

注:expire为键设置值会消耗内存

持久化  

    RDB

       当前进程数据生成快照保存到硬盘

       持久化命令:

           save:会阻塞redis服务器,生产不建议使用

           bgsave:redis进程fork操作创建子线程 阻塞一般在fork阶段 这个时间很短,创建的子线程去做生成rdb文件(fork操作属于重量级所以无法频繁操作)

      缺点:redis停止工作后丢失的数据会较多,因为RDB的保存点一般会每五分钟或更长时间创建一次 RDB 快照,所以就会丢失一部分最新的数据

                RDB 需要经常 fork() 以便使用子进程在磁盘上持久化。如果数据集很大,fork() 可能会很耗时,并且如果数据集很大并且 CPU 性能不是很好,可能会导致 Redis 停止为客户端服务几毫秒甚至一秒钟。AOF 也需要 fork() 但频率较低

      优点:适合灾难恢复,适合备份

       场景:可以用做备份,例如:30 天内每天保存一个 RDB 快照。这使您可以在发生灾难时轻松恢复不同版本的数据集

                 Redis复制的部分同步

    AOF

      是通过将命令先写入AOF缓冲,AOF缓冲在异步写入AOF文件

   优点:有不同的 fsync 策略(如下缓冲策略)

             AOF 日志是一个仅附加日志,因此不会出现寻道问题,也不会在断电时出现损坏问题。即使由于某种原因(磁盘已满或其他原因)日志以写一半的命令结束,redis-check-aof 工具也能够轻松修复它

             当 AOF 变得太大时,Redis 能够在后台自动重写 AOF

    缺点:AOF 文件通常比相同数据集的等效 RDB 文件大

    redis<7.0

        如果在重写期间有对数据库的写入,AOF 可能会使用大量内存(这些被缓冲在内存中并在最后写入新的 AOF)。

        重写期间到达的所有写入命令都会写入磁盘两次。

        Redis 可以在重写结束时冻结写入并将这些写入命令同步到新的 AOF 文件

   缓冲策略

       always:命令写入AOF缓冲后,直接调用fsync命令将缓冲里面的数据放入AOF文件,fsync完成后线程返回

       everysec:命令写入AOF缓冲后,调用系统write操作,write完成后返回,fsync同步文件操作由专门线程每秒调用一次  默认

       no:命令写入AOF缓冲后调用write操作,不对aof文件做fsync同步,同步硬盘操作由操作系统负责,通常同步周期最长30秒(无法保证持久化)

     建议:使用everysec 宕机情况下最多只会丢失一秒的数据 

   场景:实时持久化

   AOF重写机制:相当于将有些没用的命令 或者多条命令合并存 一般是设置个大小到了多少内存以上后自动将调用aof重写机制

系列链接

Redis学习笔记二 主从复制_记性差的程序员的博客-CSDN博客

Redis学习笔记三 哨兵(Sentinel)_记性差的程序员的博客-CSDN博客

Redis学习笔记四 集群(cluster)_记性差的程序员的博客-CSDN博客

Redis学习笔记五 运用篇_记性差的程序员的博客-CSDN博客

参考

https://www.jianshu.com/p/397449cadc9a

Redis 6.0_温柔的风的技术博客_51CTO博客

《Redis开发与运营》

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值