• Redis


    一:NoSql数据库

    1.1:NoSql简介

    1. Not  Only  Sql

    2. 非关系型数据库的集合

    3. 主流的NoSql数据库

          Redis

          Hbase

          MongoDB

    NoSql产生的背景

    1. 数据库高并发的读写

      比如 双11

      2.海量数据的效率
       哪怕是加上索引,分区,关系型数据库效率都相对来说力不从心!

      3.高扩展和可用性

      使用分布式的时候,关系型数据库的扩展性就不行了!

    和关系型数据库的区别

    1. 不支持事务的ACID

    2. 不需要实时的读写

    3. 不支持sql语句

    4. 出道时间短,功能还不是很完善

    5. 基于分布式,扩展方便

    6. 无需sql的解析,所以读写效率高

    7. 降低服务器成本

    8. 存储数据的格式是key,value.数据类型灵活

    9. 数据没有耦合性,容易扩展

    CAP定理

    1.CAP定理的概念

    指的是在一个分布式系统中, Consistency(一致性)、 Availability(可用性)、
    Partition tolerance(分区容错性),三者不可能共存!!!最多出现两个

    2.CAP定理是NOSQL数据库的基石

    一致性(C):在分布式系统中的所有数据备份,在同一时刻是否同样的值。

    可用性(A):在集群中一部分节点故障后,集群整体是否还能响应客户端的读写请求。

    分区容错性(P):在网络分区的前提下,保证数据的容错机制!意味着发生了分区的情况,必须就当前操作在C和A之间做出选择。

    3.三者不可能共存,最大只能满足两个

    CA:一致性(C)可用性(A)
    让我们想起来了 关系型数据库中事务的ACID特性!
    满足者:关系型数据库

    CP:一致性(C)分区容错性(P)
    满足者:分布式数据库

    AP:可用性(A) 分区容错性(P)
    满足者:NoSql

    4.什么是分布式数据库

    分布式数据库系统通常使用较小的计算机系统,每台计算机可单独放在一个地方,每台计算机中都可能有DBMS的一份完整拷贝副本,或者部分拷贝副本,并具有自己局部的数据库,位于不同地点的许多计算机通过网络互相连接,共同组成一个完整的、全局的逻辑上集中、物理上分布的大型数据库。

    5.典型应用

    最典型应用的银行领域为例:

    将分散的数据库从逻辑上联系在一起,可以大大提高数据的管理效率。这就是总行和支行之间的关系:总行与全国各地的支行之间既有各自需要处理的数据,又有需要交换的数据。

    将数据分散存储在各地的数据库中,可提高故障发生时的数据安全性。一旦上海支行的数据库出现故障,比如停机、损坏,也是仅仅限于上海支行,总行、广州等其他地区的支行数据库的数据都不会受到影响。

    分布式架构具备良好的扩展性。比如建立一个新的海外支行时,只要将新建的数据库加入到原有的分布式数据库架构中就可以,以最小的代价在不影响原有支行、总行的情况下完成数据库的扩展。

    以冗余方式进行数据的备份,以备在系统崩溃、数据丢失的情况下仍有备份数据可以进行恢复

     

    BASE定理

    1.什么是BASE定理

    BASE定理就是为了解决关系数据库强一致性引起的问题而引起的可用性降低而提出的解决方案。

    2.组成部分

    基本可用(Basically Available)
    可用性的要求不是很高!

    软状态(Soft state)
    数据不需要实时的保持一致!
    比如说1台机器做了修改,其他并不要求实时进行同步更新!

    最终一致(Eventually consistent)
    数据最终保持一致即可!

    二:初识Redis

    Redis介绍

    1. 开源的NoSql数据库

    2. C语言编写

    3. 基于内存运行,并且支持持久化

    4. Key value存储

    5. 是主流的Nosql数据库之一

    Redis优点

    1. 内存使用方面,表现优异

    2. 数据读写快速高效

    3. 持久化性能相比其他Nosql数据库要好

    4. 扩展性和移植性强

    5. 分布式中不可或缺的一员

    Redis的安装

    01. 把从官网上下载的 redis-3.2.10.tar.gz 通过 xftp上传到linux操作系统中的  指定位置

    虚拟机没有网怎么办,怎么与Xftp连接?????

    网络设置 启动

    点击属性

    配置ip 尽量不出现01

     选择本地连接右键属性,

    选择共享-----勾选允许其他网络.......-----选择VMware nNetWork Adapter Vmnet8

    在虚拟机中的

    配置好IP连接XFTP andXShell

    XShell连接Linux:

    点击新建添加会话

    点击完成后,点击新建会话旁边的类似文件夹的图标,就会看到所有会话,点击刚建好的会话连接

    XFTP连接Linux:

    同样新建会话窗口,填写名称等信息,点击确认

    出现此界面连接成功:

    怎么修改连接后出现的乱码问题??

    点击“选项”----勾选使用UTF-8编码

    刷新即可!!!

    02. tar -zxvf redis-3.2.10.tar.gz解压文件到文件中

    03. 进入redis的解压目录输入make

    04. 安装 make install  PREFIX="安装路径"  

    05. 如果在安装的位置看到一个bin目录 说明安装成功了

    可能出现的问题

    1.如果make报错

     make[1]: 进入目录“/software/redis-3.2.10/src”

        CC adlist.o

    /bin/sh: cc: 未找到命令

    make[1]: *** [adlist.o] 错误 127

    make[1]: 离开目录“/software/redis-3.2.10/src”

    make: *** [all] 错误 2

    问题 少cc组件!

    解决办法:

    yum install gcc-c++

    安装!

    如果yum安装过程中出现镜像的问题

    解决办法:

    1. 清空自带的yum源

     rm -rf /etc/yum.repos.d/*

    2. 创建本地yum源

    vim /etc/yum.repos.d/xx.repo

    后缀名必须是以 repo结尾的!

    xx是文件名,自拟!

    3. 编辑文件xx.repo

    [local]

    name=local

    baseurl=file:///mnt

    gpgcheck=0

    4. 挂载光盘

    光盘的挂载点必须是  上面的baseurl

     mount  /dev/cdrom   /mnt/

    只有挂载只有才有 /mnt/目录

    5. 实现永久挂载光盘

    vim /etc/fstab

    在文件中的最后一行输入

    /dev/cdrom     /mnt iso9660 defaults 0  0

    6. 让文件立即生效

    mount -a

    7. 可以使用yum了

    2.如果遇到   CC adlist.o

       In file included from adlist.c:34:0:

    zmalloc.h:50:31: 致命错误:jemalloc/jemalloc.h:没有那个文件或目录

     #include <jemalloc/jemalloc.h>

    解决办法:

    make MALLOC=libc

    运行redis

    ./redis-server ../redis.conf

    以下页面代表启动成功:

    测试redis

    打开新的创建 进入redis的命令行模式

    注意另一个启动redis的窗口,现在不能关闭。

    2.7:配置redis.conf文件

    后台运行redis

    vim redis.conf修改配置内容

    快速查找:ctrl+r /查找包含的字母     

    修改pid的文件位置,之后重启redis服务

     

    Redis多数据库的特点

    1. 数据库命名规则是0-15

    2. 不支持自定义的数据库名称

    3. 不能为每个数据库设置独立密码

    4. 多个数据库之间并不是完全独立

    比如在任何一个数据库中使用flushAll是清空所有的数据库!

    1. 数据库就像一个命名空间

    三:Redis常用数据类型的操作

    String类型

    1. 基本操作

     

    数值类型的操作

    1. 批量操作

    批量赋值

    mset key1 vlaue2 key2 value2....

    批量取值

    mget key1 key2 ....

    二进制操作

    通过2进制操作把 a 在redis中改变成 b!

    set key a 把a保存到key中

    因为a对应的ASCII码是 97
    97对应的2进制是01100001

    setbit key offset value
    设置key的指定位置的2进制数据

    offset就是偏移量!
    针对于97的二进制
    从左到右 是0---7
    offset 0 ==0
    offset 1 ==1
    offset 2 ==1
    offset 3 ==0
    offset 4 ==0
    offset 5 ==0
    offset 6 ==0
    offset 7 ==1

    我们想把a转换成b
    b对应的ASCII码是 98
    98对应的2进制是01100010

    这时候我们只需要把
    offset 6改成1
    offset 7改成0 即可

    setbit key 6 1
    setbit key 7 0

    之后get key
    结果就是 b

    getbit key offset
    获取key的指定位置的2进制数据

    bitcount key
    查询这个key值中出现了多少个1

    实际应用 用户上线次数统计!

    比如说,每当用户在某一天上线的时候,我们就使用 SETBIT ,以用户名+ID(昵称)作为 key ,将那天所代表的网站的上线日作为 offset 参数,并将这个 offset 上的为设置为 1 。

    举个例子,如果今天是网站上线的第 100 天,而用户 peter 在今天阅览过网站,那么执行命令 SETBIT peter 100 1 ;如果明天 peter 也继续阅览网站,那么执行命令 SETBIT peter 101 1 ,以此类推。

    当要计算 peter 总共以来的上线次数时,就使用 BITCOUNT 命令:执行 BITCOUNT peter ,得出的结果就是 peter 上线的总天数。

    3.2:List类型

       插入操作

    lpush

    可以理解成 从左边开始插入数据

    lpush key v1 v2 v3

    向集合中增加3个元素
    v3
    v2
    v1

    lrange key beginIndex endIndex
    查询key集合中从begin开始到end的所有元素

    先进后出

    结果是
    v3
    v2
    v1

    rpush

    可以理解成 从右边开始插入数据

    rpush key  v4 v5 v6

     

    linsert
    在元素之前或之后新增数据,返回新的长度

    linsert key after v1 22

    在集合key的v1元素之后加入元素22

    linsert key before v1 22

    在集合key的v1元素之前加 入元素22

    查询操作

    lrange key beginIndex endIndex
    查询key集合中从begin开始到end的所有元素

    先进后出

    llen key  查询集合中元素的个数

     

    修改操作

     

    lset 修改

    lset key index value

    修改集合key指定index下标的值为value

    删除操作

    lpop
    从左边弹出一个元素

    lpop key

    rpop

    从右边弹出一个元素

    rpop key

     

    上面两个不能删除指定的!只能从左或者从右开始删除!

    blpop key time (s)

    在指定的时间内从左边清除key的元素
    在time期间 会一直等待
    直到我们的集合中出现数据!或者时间超过了time !

    brpop key time
    在指定的时间内从右边清除key的元素
    在time期间 会一直等待

    lrem

    lrem key count value

    注意点:

    count > 0 : 从表头开始向表尾搜索,移除与 VALUE 相等的元素,数量为 COUNT 。

    count < 0 : 从表尾开始向表头搜索,移除与 VALUE 相等的元素,数量为 COUNT 的绝对值。

    count = 0 : 移除表中所有与 VALUE 相等的值。

    Set类型

     存储的是无序 不重复的数据!

    插入操作

    sadd

    sadd key v1 v2 v3 v1
    保存的是唯一 无序的数据!
    v1只能出现一次!

    smembers key
    查询key中存储的数据

     查询操作

    smembers key
    查询key中的数据

    scard key
    查询key中元素的数量

    删除操作

    spop key

    随机删除key中的一个元素

    srem key v1 删除指定的元素
    删除key中的v1

    五:redis可视化工具

    需要实现在redis.conf文件中修改bind 地址,不然使用工具无法连接

     如连接出现问题请看:https://www.cnblogs.com/luoxionghenku/p/9634859.html

  • 相关阅读:
    有限制的最大连续和问题
    Codevs 5056 潜水员
    Codevs 1958 刺激
    Codevs 3731 寻找道路 2014年 NOIP全国联赛提高组
    [NOIP2014]解方程
    Codevs 3729 飞扬的小鸟
    Codevs 1689 建造高塔
    Codevs 2102 石子归并 2
    C语言基础之进制的那些事(1)
    指针
  • 原文地址:https://www.cnblogs.com/luoxionghenku/p/9634796.html
Copyright © 2020-2023  润新知