1. 缓存数据库
为了应对访问次数多的数据如果从磁盘数据库存取的话消耗时间长的状况,采用更快的缓存数据库。
redis是我的选择,因为他是一个开源的非关系型数据库,将大部分数据存储在内存中,并且 redis基于内存操作,读写速度很快,100000读写/秒,可以作为内存型缓存服务器,提供持久化存储方案(通过aof的always配置)
选择他的主要原因:

  1. 完全在内存中保存数据,使用磁盘只是为了持久化
  2. 丰富的数据类型
  3. 可以将数据复制到任意数量的从服务器中(作为集群节点时)
    2.redis的启动
 redis-server   作为服务端启动了,监听请求redis-client   作为客户端启动。连远程就用带参数 -h  ip

客户端启动如果不带参数默认是连本机的。测试链接成功与否,使用ping命令,收到pong 说明ok~!
3.数据对象
重点也就是他的数据对象
数据库键是一个字符串对象
值 可以: 字符串对象,列表对象,哈希对象,集合对象,有序集合对象。五种其中之一
没用c的字符串(空字符结尾),自定义了sds(simple dynamic string)作为默认字符串。
2.1 sds定义

struct sdshdr{int len;              //已经使用空间int free;             //未分配使用空间char buf[];            //保存字符串。多一个空字符的位置,不再len中
}

优点于c字符串:1,常数时间取len;2,杜绝缓冲区溢出:修改字符串先计算空间满足否,不满足自动分配空间;
2.2 并且在扩展字符串时会进行
预分配空间和惰性空间的优化策略:
预分配用于增长操作:分配*2,超过1M时仅多分配1M
惰性空间用于空间释放:利用free字段来记录保存。

3.1 redis 的链表:定义由 listnode 来定义节点(由pre 和 next)两个指向前后为;
list 数据结构来定义

{ head,tail,len,dup,free,match }
typedef struct list Node{ struct listNode* prev; struct listNode* next;
void* value;}
typedef struct list{ void* (*dup)(void *ptr);//节点复制函数void (*free)(void *ptr) ;            //节点值释放int (*match) (void *ptr,void *key);  //节点值对比              }

特性:1,每个节点都可 O(1)来查找前后节点。
2,无环,head的前节点:null;tail后节点:null;
3,快速取有长度
4,多态:链表节点用 void*来保存节点值

4.1 字典
用途:保存键值对的抽象数据结构。redis的底层用字典来实现。
4.2 字典的实现
redis的字典使用哈希表作为底层! (哈希表)

typedef struct dictht{dictEntry **table;           //哈希表数组。元素是dictEntry(表示一个键值对unsigned long size;    //哈希表大小unsigned long sizemask;          //为size-1,用来计算索引值的。unsigned long used;               //已有节点
}

哈希表的节点 dictEntry
内容:{void *key; union{ void *val; uint64_tu64; int64_ts64} v; struct dictEntry *next; } dictEntry;
在union 枚举类型中,是key键对应的值,值可以是其中三个之一(指针,整数)而next可以来解决哈希冲突的问题!
字典

typedef  struct dict {   dictType * type;  //里面是多个函数void *private;  //私有数据dictht ht[2];         //为什么是2,因为一个哈希表,一个rehash用int rehashidx;  //rehash值} dict;

type属性和private,为多态字典准备。
type是一个保存了多个函数的结构体类型(有:计算哈希值函数,复制键,复制值,对比键,销毁键,销毁值等函数)
rehashidx:这个值是记录rehash的进度,如果-1,说明没有进行rehash
4.3 解决键冲突
在dictEntry里面已经有了方法,使用开链的方式;并且为了速度而言,(我认为是刚存的数据使用可能性大!)将新节点放在链表的开头,
4.4 rehash
rehash是为了避免哈希表保存的键值对太多,或太少。维护负载因子的存在。对哈希表扩充或收缩。
步骤:
1,为字典的 ht[1]分配空间:如果扩充,大小为ht[0].used *2,要是2的n次方。, 否则,收缩,是ht[0].used大小就可(前提是为2的n次方)
2, 空间分配好了,ht[0]中包含的键值对进入ht[1]
3,迁移结束后,释放ht[0],将ht 【1】设置ht【0】,在ht【1】新建空白哈希表。for next rehash。

渐进式rehash:是通过每次对字典执行增删改查时,顺带将rehashidx索引上的所有键值对rehash到ht【1】。完一个+1,直到全部移过去。置rehashidx=-1
4.5总结
字典被用于实现redis的数据库和哈希键‘
字典底层是哈希表(2个!一个使用,一个rehash)
哈希表开链解决哈希冲突
在对哈希扩展收缩过程中,是渐进式rehash的。

02. 数据库的选择相关推荐

  1. 02 数据库语言SQL

    02 数据库语言SQL SQL语言概述 SQL语言是集DDL.DML和DCL于一体的数据库语言,SQL语言主要由以下9个单纯引导的操作语句来构成,但是每一种语句都能表达复杂的操作请求. DDL语句引导 ...

  2. MariaDB/MySQL从数据库中选择随机的行

    MariaDB/MySQL从数据库中选择随机的行 一个比较传统的做法是使用sql自带的rand函数,从而达到随机排序的目的. SELECT column FROM table ORDER BY RAN ...

  3. 数据库怎么选择?终于有人讲明白了

    作者 | Alex Petrov 所有数据库管理系统的主要工作都是可靠地存储数据并使其对用户可用.我们使用数据库作为数据的主要来源,帮助我们在应用程序的不同部分之间共享数据.我们使用数据库,而不是在每 ...

  4. 赠书 | 数据库怎么选择?终于有人讲明白了

    作者 | Alex Petrov 所有数据库管理系统的主要工作都是可靠地存储数据并使其对用户可用.我们使用数据库作为数据的主要来源,帮助我们在应用程序的不同部分之间共享数据.我们使用数据库,而不是在每 ...

  5. 为什么MySQL数据库索引选择使用B+树?

    在进一步分析为什么MySQL数据库索引选择使用B+树之前,我相信很多小伙伴对数据结构中的树还是有些许模糊的,因此我们由浅入深一步步探讨树的演进过程,在一步步引出B树以及为什么MySQL数据库索引选择使 ...

  6. 小型mysql_小型数据库的选择(轻量级数据库)(转)

    小型数据库的选择(轻量级数据库) 一直使用Sql Server开发,没有用过Access之外其它的DB.最近正想做个小型工具,这种小东西当然不可能用Sql Server数据库啦,可又不想用Access ...

  7. 小型数据库的选择(轻量级数据库)

    小型数据库的选择(轻量级数据库)     一直使用Sql Server开发,没有用过Access之外其它的DB.最近正想做个小型工具,这种小东西当然不可能用Sql Server数据库啦,可又不想用Ac ...

  8. 第三阶段:Web前端:02数据库(sql语言、JDBC数据库连接) | 03(1)SpringBoot

    二.数据库--> MySQl或MariaDB 0.1.Mysql-安装步骤 进入网址 http://doc.canglaoshi.org/-->常用下载:Windows必备-->Ma ...

  9. [转]oracle设计数据库应选择正确的数据类型

    原文地址:http://blog.sina.com.cn/s/blog_5014663501007n40.html 在设计数据库的时候,选择正确的数据类型,往往可以避免很多的问题,正确理解数据库的类型 ...

最新文章

  1. wxWidgets:wxSpinEvent类用法
  2. vue computed 使用小问题
  3. 使用ffmpeg视频切片并加密
  4. 剑指 Offer 27. 二叉树的镜像【无取巧解法,易于理解!】
  5. python语言特性-------python2.7教程学习【廖雪峰版】(一)
  6. 让51单片机八段数码管亮起来(静态显示和动态显示、共阴极和共阳极、位码和段码)
  7. 从入门到入土:[SEED-Lab]-SQL注入攻击|SQL Injection Attack Lab|详细说明|实验步骤|实验截图
  8. 入门学习因果推断在智能营销/权益应用的通用框架
  9. 支持Delphi2009/2010的DES加密单元
  10. biztalk中常用调试方法
  11. 【语音合成】基于matlab语音信号变速【含Matlab源码 565期】
  12. 单位计算机安全和保密措施,安全管理及保密措施
  13. Linux实训项目——第八章:配置网络接口及远程管理
  14. 使用 Socket 通信实现 FTP 客户端程序
  15. atmega328p引脚图_Arduino UNO兼容ATmega328开发板-Seeeduino v4.0,附原理图/PCB/使用说明等...
  16. 2021年工作日和非工作日JSON,全年休息日、节假日、假期、周末
  17. Node.js 发展史介绍与安装初体验
  18. linux传奇私服文件包,传奇私服目录文件结构
  19. 学Java的第十八天
  20. 你到底可以用Python做什么?以下是Python的3个主要应用程序。

热门文章

  1. H264/AVC Hypothetical Reference Decoder(HRD)
  2. 登录用友显示java已被阻止_解决Spring Security 用户帐号已被锁定问题
  3. 文件:jquery.min.js
  4. 任正非带队访问上海交大,高手的逻辑有什么不同
  5. 如何通过名字判断一个印度人的种姓
  6. pip 安装时报错Double requirement given: numpy==1.12.1....
  7. 微型计算机储存系统一般指主存器和,2019年12月网络教育统考《计算机应用基础》复习题(八)...
  8. Office Word和Excel的工具栏显示不全,只显示文件、绘图和帮助的解决办法
  9. 微信加入群聊的设计点
  10. JAVA采集图书的ISBN编号编码、出版社、出版时间、版次、正文语种、定价等信息