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实则是一个结构体:如下图

 

 这个结构体有一个字节数组,当前字符长度,可以屡屡组长度(free)组成,SDS主要以偏下简单地方开了优化

  • C语言若字符串溢起,那么网以重新分配内存(这个也许实行系统调用)并以内容还复制到任何一个数组当中,对于高性能的redis来说就是可怜耗费时间的。SDS则于各国一样不善并接字符串时判断空间是否足够充分,不够分配1MB内存,够则分配free大小内存。
  • 字符串缩短时内存先不回收,而是小存起来,减少内存重分配次数
  • 亚进制安全,使用len判断字符串是否结束,可保留二进制数据

2.链表

  • 双向无环链表

3.字典

  • 大面积用于redis各种功能,一个字典有点儿独哈希表,一个平常应用一个rehash时使用
  • hash冲突时一个目上的大半单键连接成一个单项列表(加于表头)
  • 冲负荷因子(内存和工夫的抵,已保存节点数/哈希表大小,临界值分别是0.1,5)决定是否rehash。采用渐进式rehash(保证性能,和描绘时复制技术思路相似),主要为以下几个步骤
        • 啊点说之别一个hash h1表分配空间
        • 字典内保障一个索引计数器,每次执行长,删除,查找或更新时除指定操作后尚以相应键值对rehash到h1上,直至操作完成(每个哈希表会标出一度存在的实业数)

     

Redis持久性

Redis提供零星种持久化方式:快照(RDB),和AOF(记录每一个操作)

  • RDB每隔一个特定的岁月保存好时间点的一个数量快照
  • AOF保存每一个操作,Redis重开时逐条执行每个操作重建原来的数
  • 少栽持久化方式可同时设有,Redis重启时优先采取AOF

 

RDB

原理

  • Redis调用Fork()创建子进程
  • 支行进程将数据写入到一个RDB文件里
  • 轮换原有的RDB文件
  • 文本存放于当前目录的dump.rdb文件内,可以经过redis.conf修改文件名及目录

 

缺点

  • 是因为各个隔一段时间执行,,可能会见招数丢失。
  • 采用Fork()创建子进程时,如果数据量很酷Fork()造作会造成Redis暂停服务几秒钟。

优点

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

大规模配件信息(redis.conf中)

 

AOF

优点

  • 丢失数据的可能减少

 缺点

  • AOF文件比RDB大

 

未完待续。。。

参考资料

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

https://segmentfault.com/a/1190000002906345

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

 

网站地图xml地图