语言redis

Nosql  == not only sql

进程的起步同平息

基础执行c程序时,利用exec函数调用一个特有之起步例程,该启动例程丛内核中收获命令执行参数与环境变量值。

非关系型数据库    redis 和 mongodb

过程终止之情状

5种健康终止之情事:

(1)从main函数返回;
(2)调用exit;
(3)调用_exit和_Exit函数;
(4)最后一个线程调用pthread_exit;
(5)最后一个线程从其启动例程返回;  

3种植非常终止情形

(1)调用abort;
(2)接到一个信号;
(3)最后一个线程对取消请求做出响应;

解决:

进程启动与平息图

语言 1

  1. High performance   高并发读写
  2. Huge storage   海量数据的过人效率存储和做客
  3. High scalability & High availability 高但扩展性和高可用性

atexit函数

一个经过最多足挂号32和函数(例如:signal函数),这些函数由exit函数自动调用。在先后终止时调用这些函数,形成已处理程序,来展开收进程前之了断工作。而exit函数通过atexit函数的报记录来判定调用哪些函数。

 

exit函数

斯函数由ISO C
定义,其操作包括处理终止处理程序,然后关所有标准I/O流。需留意的凡,它不会见处理公事描述符、多进程(父子进程)以及作业控制。

Nosql数据库的季杀分类:

_e(E)xit函数 ISO C 定义是函数的目的是啊经过提供平等种植无需运行已处理程序或信号处理函数的主意要止程序。但ISO C 对标准I/O流是否开展冲洗,这取决操作系统的兑现。在unix中,是未进行冲洗的。

  1. k-v存储
  2. 列存储 Hbase
  3. 文档存储 Mongodb
  4. 图数据库

exit和_e(E)ixt函数的状态码

任凭进程怎样了,它还见面在根本上推行同一段代码(由进程启动与离图可知)。这段代码来关闭所有的文书描述符,释放具有的存储空间。

程序退出后,利用退出码告知该过程的父进程。父进程经过wait或waitpid函数来就该子进程的善后工作(获取子进程有关消息
释放子进程占用资源)。若父进程没有处理子进程的退状态,则分进程变成僵死进程。相反的,若父进程在子进程前停止,则分进程变成孤儿进程。孤儿进程会由于1哀号经过(init进程)接收,大致过程如下:

(1)进程终止时,内核逐个检查所有活动的进程;
(2)分析查找该终止进程的子进程;
(3)将该进程的子进程的父进程ID改为1;

对比图:

wait和waitpid函数

次正常或特别终止时,内核都见面往爸爸进程发送SIGNAL信号。子进程终止是异步事件,所以该信号也是异步信号。而拖欠信号一般会吃大进程默认忽略。或者提供一个信号处理函数来善后。wait和waitpid函数就是中的信号处理函数的相同有些。

wait和waitpid函数区别如下:

(1)wait会阻塞调用者进程等待直至第一个终止的子进程到来;
(2)waitpid可以通过参数设置,来实现调用者进程不阻塞,或选择要阻
塞等待的子进程;

这边的调用者指的凡爸爸进程

语言 2

条件表和环境变量

 

环境表结构图

语言 3

  • 每个程序还收下及均等摆环境表
  • 环境表也是一个字符指针数组
  • enrivon叫做环境指针
  • 指针数组叫做环境表
  • 各个指针指向的字符串叫做环境字符串

Nosql 特性:

环境变量

  • unix内核并无检讨环境字符串,它们的解说了取决于各个应用进程
  • 习以为常以一个shell启动文件被安环境变量来控制shell的动作
  • 修改要增加环境变量时,只能影响时历程和今后(之前的百般)生成与调用的任何子进程的环境,但无克影响其父亲进程的条件

同环境变量相关的函数如下:

#include<stdlib.h>
char *getenv(const char *name);
      返回值:指向与name关联的value的指针;若未找到,返回NULL

int putenv(char *str);
                       返回值:若成功,返回0;若出错,返回非0

int setenv(const char *name, const char *value,
            int rewrite);
int unsetenv(const char *name);
                两个函数返回值:若成功,返回0;若出错,返回-1 
  1. 易扩展
  2. 利落的数据模型
  3. 命运据量高性能,高可用

这些函数如何修改环境表的

环境表和条件字符串通常存放于内存空间的赛地址处(顶部)。所以当修改其的价值时,内存是不克继承朝着大地址延伸;但还要因为,它之下是各个栈帧,所以也无可知为下延长。如何改它的价的长河如下:

(1)修改环境表

1)新value <= 旧value,直接覆盖旧value的存储空间
2)新value >= 旧value,调用malloc函数,在堆区开辟新的存储空间,
将新value复制到这里,再将这片存储区首地址写到环境表相应的位置处。

(2)新增环境表

1)新增一个环境变量,调用malloc函数开辟新的存储空间,将原来的环
境表复制到该存储区,其次再添加一个环境变量,然后在尾部赋值为NULL,
最后将environ指向该区域;
2)在 1)过程的基础上,调用realloc函数,多次添加环境变量;

注意:为这种艺术修改的环境变量只当就程序运行时有效,当次结束时,相应的存储区被系统回收,这些改动就会见失效。

 

内存存储结构补说明

redis是c语言开发的

内存管理结构图

语言 4

  • 未初始化数据段(block started by symbol):以次开始实行
    施行之前,内核将是段子遭遇的数目初始化为0或空指针;
  • 栈:每次函数调用时,其归来地址及调用者的环境信息(如某些机器寄存器的价)都存放于栈中;
  • 共享库:只有需要在有着进程都不过援引的存储区中保存这种库例程的一个副本;

 

仓储空间分配函数

#include<stdlib.h>
void *malloc(size_t size);
void *calloc(size_t nojy, size_t size);
void *realloc(void *ptr, size_t newsize);
         3个函数返回值:若成功,返回非空指针;若出错,返回NULL
  • malloc函数:乍起值不确定;底层通过调用sbrk函数实现;
  • calloc函数:初始值为0;
  • realloc函数:增还是减少以前分配区的尺寸;当多长度时,可能将原先分配区的内容移到任何一个够好的区域,以便在分配区末尾增加存储区,而新增存储区初始值不确定(例如:可变数组的使);

注意:这些动态分配的函数一般在分配存储空间时,会于要求的深。因为于开拓空间的上下有存储记录管理信息。因此,在行使时,千万不要越界访问,以免造成不可预知的结局。

redis应用场景:

函数间跳反策略

在c语言中,goto语句是免可知超过函数过反之。尤其是当函数深层调用时之跳转需求,在阴差阳错处理的状下颇实用。

#include<setjmp.h>
int setjmp(jmp_buf env);
          返回值:若直接调用,返回0;若从longjmp返回,返回非0
void longjmp(jmp_buf env, int val);

变量值回滚问题:机关变量和寄存器变量会存在回滚现象。利用volatile属性来避免此类情况的生。(每当受变量赋值时,赋的值回首先存储于内存(存储器变量)中,然后在由cpu取走,存储于cpu的寄存器上(寄存器变量)。在做系统优化时,那些频繁利用的变量,会一直存储到寄存器中若不经过内存。)

  • 做缓存
  • 职责队列
  • 网站访问统计
  • 动排行榜
  • 多少过期处理
  • 等等

寄存器变量会设有回滚现象的探究

在调用setjmp函数时,内核会拿当前之栈顶指针保存在env变量中,所以在调用longjmp函数返回该岗位时,全局变量、静态变量、易失变量和自动变量如果当调用setjmp和longjmp函数之间它们的值为涂改了,是匪见面回滚到setjmp函数调用之前的值(当然,编译器将auto变量优化为寄存器变量除外)。因为,这些存储器变量的值是储存于内存相应的段落遭遇,回到原栈顶状态时,同样访问的还是原来的内存空间。

然,对于寄存器变量来说,首先要明确一点:寄存器变量是故动态储存的主意。意思是寄存器变量的价值可能存在不同之寄存器中。如果当调setjmp和longjmp函数之间它们的价值为涂改了,这个价值可能无会见满怀到setjmp之前的对其赋值的寄存器中,而以调用longjmp函数后,又回去了调用setjmp函数时之状态。这个上再次读取寄存器变量的值经常,读到的是原来那个寄存器中存储的值如果非是改了之生寄存器中储存的值,所以出现的回滚现象。

 


redis的安装: 百度

 

安装好redis之后(linux)

改配置文件来后高运行   

语言 5

./bin/redis-server
./redis.conf      用配置文件启动redis服务

 ps -ef | grep redis    
查看redis服务是否起来

kill -9 <进程号>       
杀死进程来关闭redis-server

为得就此  ./bin/redis-cli
shutdown  来关闭redis

 


Jedis   java的连接redis的一个jar包

连接redis的例证,创建连接池底事例

语言 6

 

防火墙 6379 的端口打开

语言 7

 

连接池

语言 8

语言 9

 


Redis的数据结构:

  1. 字符串             String
  2. 字符串列表      list
  3. 哈希                 hash
  4. 字符串集合      set
  5. 不变字符串      sorted-set

积存String常用命令:

  • set                建立
  • get                查看
  • getset          返回一个字符串,也即是键的旧值。
    如果键不存在,则回nil
  • del               删除
  • incr             数字有增无减1
  • decr            数字压缩1
  • incrby         数字加从定义
  • decrby       数字压缩从定义
  • append      返回一个整数,在多操作后底字符串的尺寸。

存储Hash:

  • hset key key_name values           
  • hset key key_name1 values1        建立hash,赋值单个
  • hmset key key_name value key_name1 value1       建立hash,赋值多独
  • hget key key_name             获得单个值
  • hmget key key_name key_name1     获得多只价
  • hgetall key       获得全套底key,value
  • hlen     获得长度
  • hkeys   获得键
  • hvals   获得值

存储List:

  • lpush
  • rpush
  • lrange   后又参数index  范围
  • lpop     取出后一去不返
  • rpop
  • llen
  • 等等

存储Set:

与list不同,不允许出现重的要素

  • sadd  key     添加 
  • srem  key     删除
  • smembers key   查看成员值
  • scard key     返回成员个数
  • 等等

存储Sorted-Set

  • zadd myset 50 p 60 j 70 x     添加有序的set
  • zadd 100 p        如果value相同,分数会蒙
  • zscore myset p     查询p的分数
  • zcard myset      查询长度
  • zrem  myset  p   删除p
  • 等等

Redis   key的通用操作

  • keys *
  • del key
  • exists key     返回1象征有
  • get key
  • rename key    重命名

Redis特性:

  multi  事务块

  exec 执行工作

  discard 取消事务

语言 10


Redis 持久化:

  • RDB方式  可以指定多少秒写副磁盘一次
  • AOF方式 读取log
  • 任凭持久化
  • 同时RDB和AOF

redis默认是RDB方式:

  优势:

  劣势:

  配置:

    save 900 1

    save 300 10

    save 60 10000

    dbfilename dump.rdb  保存文件称

    dir ./  在当前目录保存

AOF方式:

  优势:

  劣势:

  配置:

    appendonly no/yes  是不是启用

    #appendfsync always  每改一赖就是一起同潮

    #appendfsync everysec  每秒同步同不良

    #appendfsync no    不同步

  进入appendonly.aof文件去最后之通令就得上取消的目的


from:http://www.imooc.com/learn/839

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图