redis详解(持续更新)

Redis概述

Redis是一种key-value型数据库,运转于内存中,与它一般的数据库有memcached,现在基本被Redis替代。

 

Redis适用场景

俺们要与传统的关系型数据库举办比较才能更好的领会与利用Redis

1.高并发场景,
redis是个单线程的次序对于纯内存操作如hash查找可达成每秒百万次的数额级。

 
 比如说点赞这多少个工作,我们在redis中得以这么用set(关于redis的数据结构下文会详述)来存,key就是被点赞实体(如问题或评头品足)的id或唯一标志,主动点赞的用户ID都存在这一个set里面,
执行点赞时把用户ID存在这么些set里面就行了。
大家再看看MySQL里怎么办,被点赞实体的ID和点赞实体的ID就是一条记下,第一点由于锁的存在读取点赞人数时会对表加读锁,这时候就不可能添加记录,第二点是依据磁盘的,读写速率都很慢。

2.列举最新列表

 
redis中可选用list这些数据结构,用来储存最新的n条记录(lpush,和trim配合使用),每一遍取就利用lrange命令就行
。大家再看看MySQL在内部咋办,如下是一个优异的查询语句:select * from
table where…. order by time desc limit n ,随着数据增六只会愈加慢。

3.排行榜

 
redis提供一种数据结构sortset,优先队列即内部的要素得以按分值来排序。常用操作zadd等,由于这一个信息也是隔三差五跟新的依照磁盘的MySQL显然性能不够好。

4.消息队列,阻塞队列 

 redis提供阻塞队列这种多少数据结构常用,命令如brpop。

5.设置过期数据

 redis,的K-V数据结构提供数据过期值,比如对于验证码,缓存(基于缓存计划会再写一篇详细的篇章)

综上,在其实开发中我们通常是将MySQL和Redis一起构成来使用的,不同场景使用不同的工具。

 

Redis 常用数据结构及命令 

  • 双向列表List:    lpush,lpop,brpop,lrange,linsert等等
  • 无序集合Set:     scard,sdiff(A中有B中没的),smembers,sinter(交集)
  • 有序聚集SortedSet:   zadd,zscore
  • 单纯性数值KV:   set,setex
  • 积存对象Hash:  hset,hget    

更多详细新闻请见https://redis.io/commands

 

Redis部分数据结构的底部设计

1.动态字符串SDS

     我们举办一个下令,set msg “hello” ,那么底层就是暴发五个SDS对象。
接下来大家看看SDS与C语言的传统字符串有哪些界别(Redis使用C语言来编排)。SDS实则是一个结构体:如下图

MySQL 1

 

 那么些结构体有一个字节数组,当前字符长度,可以数老板度(free)组成,SDS重要在偏下两地点做了优化

  • C语言若字符串溢出,那么系统将重新分配内存(这一个或许实施系统调用)并将内容都复制到另一个数组当中,对于高性能的redis来说这是很耗时间的。SDS则在每两遍拼接字符串时判断空间是否够大,不够分配1MB内存,够则分配free大小内存。
  • 字符串裁减时内存先不回收,而是临时存起来,收缩内存重分配次数
  • 二进制安全,使用len判断字符串是否得了,可保存二进制数据

2.链表

MySQL 2

  • 双向无环链表

3.字典

  • 广泛用于redis各个功效,一个字典有六个哈希表,一个通常应用一个rehash时使用
  • hash争持时一个索引上的三个键连接成一个单项列表(加在表头)
  • 遵照负荷因子(内存与时光的平衡,已保存节点数/哈希表大小,临界值分别是0.1,5)决定是否rehash。采取渐进式rehash(保证性能,和写时复制技术思路相似),首要为以下多少个步骤
        • 为地点说的另一个hash h1表分配空间
        • 字典内保持一个索引计数器,每一次执行添加,删除,查找或更新时除指定操作后还将相应键值对rehash到h1上,直至操作完成(每个哈希表会标有已存在的实业数)

     MySQL 3

Redis持久性

Redis提供两种持久化情势:快照(RDB),和AOF(记录每一个操作)

  • RDB每隔一个特定的时刻保存这些时间点的一个数目快照
  • AOF保存每一个操作,Redis重启时逐条执行各种操作重建原来的多寡
  • 两种持久化格局得以而且存在,Redis重启时优先拔取AOF

 

MySQL,RDB

原理

  • Redis调用Fork()创设子进程
  • 子进程将数据写入到一个RDB文件里
  • 轮换旧的RDB文件
  • 文件存放在当前目录的dump.rdb文件内,可以透过redis.conf修改文件名及目录

 

缺点

  • 出于每隔一段时间执行,,可能会造成数据丢失。
  • 选择Fork()创制子进程时,假诺数据量很大Fork()造作会招致Redis暂停服务几分钟。

优点

  • RDB文件易于做备份,数据量大时启动速度快

周边配件消息(redis.conf中)

MySQL 4

 

AOF

优点

  • 不见数据的可能裁减

 缺点

  • AOF文件比RDB大

 

未完待续。。。

参考资料

https://www.zhihu.com/question/19764056

https://segmentfault.com/a/1190000002906345

http://blog.csdn.net/hguisu/article/details/8836819

 

网站地图xml地图