一、NoSQL基础知识

1. NoSQL概念

NoSQL(NoSQL = Not Only SQL ),意即“不仅仅是SQL”,泛指非关系型的数据库。随着互联网web2.0网站的兴起,传统的关系数据库在应付web2.0网站,特别是超大规模和高并发的SNS类型的web2.0纯动态网站,在某些场景下暴露出许多难以解决的问题,如性能瓶颈的问题。NoSQL数据库的产生就是为了解决大规模数据集合多重数据种类带来的挑战,尤其是大数据应用难题,包括超大规模数据的存储。

2. RDBMS vs NoSQL

2.1 二者区别

RDBMS(关系型数据库)

- 高度组织化结构化数据
        - 结构化查询语言(SQL)
        - 数据和关系都存储在单独的表中
        - 数据操纵语言,数据定义语言
        - 严格的一致性
        - 事务遵循ACID特性(原子性、一致性、隔离性、持续性)

NoSQL

- 代表着不仅仅是SQL
        - 没有声明性查询语言
        - 没有预定义的模式,较为灵活
        - key-value对存储,列存储,文档存储,图形数据存储
        - 最终一致性,而非ACID属性
        - 非结构化和不可预知的数据
        - CAP定理(三进二)
        - 高性能、高可用性、可拓展性

2.2 二者联系

当下关系型数据库与NoSQL二者经常是一起使用的,只不过适用的具体场景不同;针对RDBMS,比如电商网站上,商品的基本信息存放在关系型数据库中;针对NoSQL,比如一些热点高频的商品词汇可以放在Redis数据库中,因为Redis是基于内存的,拥有更高的性能;大段的文字描述则可以放在MongoDB(文档型数据库)上,因为MongoDB以BSON存储数据,适合大段文字的存储。

2.3 其他

关系型数据库常常需要多表关联查询,在分布式的情形下效率较低;而NoSQL中,很多采用冗余数据来避免关联查询。如采用BSON形式存储,每项数据都有字段名,就产生了冗余;但是一项数据基本有了该对象所有的信息,就可以避免过多的关联查询操作。

3. NoSQL的数据类型

key-value对(Redis支持该类型)、文档型存储(如Mongo的BSON)、列存储(Hbase)、图关系存储(Neo4j、InfoGrid)

4.CAP原理

CAP含义:

-C(Consistency):强一致性

-A(Available):可用性

-P(Partition tolerance):分区容错性

CAP思想:一个分布式的系统不可能同时很好满足CAP三个要求,最多只能同时较好地满足其中两个特性,即三进二。

CAP的三进二:CA、AP、CP

满足CA:满足强一致性和可用性,可拓展性较弱。

满足CP:满足强一致性和分区容错性,性能不高。

满足AP:满足可用性和分区容错性,对一致性要求较低;(即不需要严格一致性而只要最终一致性)

5. BASE思想

含义:为了解决关系数据库的强一致性导致的可用性降低的问题而提出的一种解决方案。

是下面三个术语的缩写:

- 基本可用(Basically Available)

- 软状态(Soft state)

- 最终一致(Eventually consistency)

它的思想是通过让系统放松对某一时刻数据一致性的要求来换取系统整体伸缩性和性能上改观,特别是分布式系统;只要满足最终一致性即可。

6. 多数据源多数据类型

解决方案:统一数据服务平台:通过映射、封装等手段使各个框架有统一的接口,从而向外服务。

二、Redis基础知识

1.定义

即远程字典服务(Remote Dictionary Server),是完全开源免费的,用C语言编写的,遵守BSD协议,是一个高性能的(key/value)分布式内存数据库,基于内存运行并支持持久化的NoSQL数据库,是当前最热门的NoSql数据库之一,也被人们称为数据结构服务器。

关键字:KV对、基于内存、分布式、支持持久化

2.特点

(1) 高性能:基于内存,所以具体较高的性能。

(2) 支持数据持久化:可用把内存的数据异步保存在磁盘中,下次重启时再次加载即可使用,从而实现了数据的持久化存储。

(3) 支持多类型数据:除了键值对,还支持list、set、zset等数据类型。

(4) 支持数据备份:采用master-slave模式进行数据备份(主从复制)

(Redis与Memcached:Memcached也是基于内存的,但不能实现数据的持久化存储,所以Memcached一般只作缓存数据库;而Redis就支持数据持久化,可以适用于更广泛的场景,如高频热门数据的长时间huan缓存,降低数据库的I/O;此外,Redis比Memcached支持更多的数据类型)

三、Redis实践

1. 安装 略

2. 简单配置

安装完成后,将安装目录下的redis.conf备份,并把conf文件下的对应行修改:daemonzize yes

这样,执行redis-server,redis的服务可以在后台运行。redis-cli则是启动客户端。

3. 杂项

- 单进程:单进程模型来处理客户端的请求。对读写等事件的响应是通过对epoll函数的包装来做到的。Redis的实际处理速度完全依靠主进程的执行效率。

- 16个数据库:默认16个数据库,类似数组下表从零开始(0-15),初始默认使用零号库;通过select可以选择数据库。

- 数据库指令:   select 数字 选择某一个数据库

dbsize 查看当前数据库的key数量

flushdb 清除当前数据库数据

flushall 清除全部数据库

4. Redis数据类型

常用的五大数据类型:String 、Hash、List、Set、ZSet

- String:字符串类型,是最基本的数据类型,且是二进制安全的(可以包含任何数据);一个Redis的字符串最大是512M。

- Hash:是键值对集合;value是一个String类型的field和value的映射表,适合用来存储对象。

- List:是字符串列表,底层实现是链表;链表元素的增删效率都较高。

- Set:是字符串类型的无序集合,集合内元素各不相同;通过HashTable实现。

- ZSet:字符串类型的有序集合;集合里的每一个元素都会关联一个double类型的分数,依据分数从小到大进行排序;元素一定不同,但分数可能相同。

5. 常用指令

  • 键值对指令(简单)
  •  //设k1为一个key,v1为一个value
    //key常用指令的示例 keys * //查看所有存在的key
    set k1 v1 //设置kv值,若k1已经存在则value会覆盖
    get k1
    exists k1 //查看键k1是否存在;存在则返回1
    expire k1 //倒数60s该键失效;失效即从内存清楚
    ttl k1 //查看还有多少秒失效;-1表示永不失效,-2表示已经失效
    persist k1 //使永久化
    type k1
    move k1 //把k1移到2号库;原来的库就没有该键了
    del k1
  • String常用指令
  •  //String常用指令
    
     //赋值、取值
    set k1 abc
    append k1 //append会在k1的值后面追加一些字符
    get k1 //结果:"abc123456" strlen k1 //返回k1的value串的长度 //incr/decr/incrby/decrby 只能对value为数字的key才可使用 set k2
    incr k2 //加1,即1+1=2
    decr k2 //减1
    incrby k2 N //加N;后面的数字是步长
    decrby k2 N //减N set k3 abcdefg
    getrange k3 //返回0、1、2、3四个字符,即"abcd" setrange k3 XXX //k3后面的offset,即偏移值;从偏移值开始,往后进行重新赋值
    get k3 //结果"XXXdefg" set k4 hello //设置k4 10秒后失效;注意先时间,后value
    ttl k4 //setnx(set if not exist) 若对应的key不存在,则设置成功并返回1;
    // 若对应的key存在, 则不设置并返回0;此指令避免覆盖 setnx k1 v1 //若k1已经存在,则返回0 mset k1 v1 k2 v2 k3 v3 ... //设置多个kv对
    mget k1 k2 ... //取多个值;注意只能用空格隔开 msetnx k1 v1 k2 v2 ... //若这些kv都不存在,才设置成功并返回1;
    //如果一个已经存在,则设置失败并返回0.
  • List常用指令(列表;单键多value,或者说单值多value)
  •  //list常用指令
    
     //lpush 从left进行push; rpush 从right进行push; lrange 根据下标查看list
    //对同一个list执行若干次push,会不断增加list的元素 lpush list01 //从左边依次push进去数字,最终在list中是1最后一位,5第一位;类比 栈
    lrange list01 - //“先进后出”
    /* 输出
    1) "5"
    2) "4"
    3) "3"
    4) "2"
    5) "1"
    */ rpush list02 //从右边依次push进去数字,类比 队列
    lrange list02 - //先进先出
    /*
    1) "1"
    2) "2"
    3) "3"
    4) "4"
    5) "5"
    */ lpop list01 //输出"5",从左边pop一个数字
    lrange list01 - //pop一个,剩下4个
    /*
    1) "4"
    2) "3"
    3) "2"
    4) "1"
    */ rpop list01 //输出"1";pop了后剩下3个 //按下标取数 Lindex
    Lindex list01 //输出"3",即 4->3->2的3,下标从0开始 Llen list01 //长度为3 //删除N个value lrem list N value
    rpush list03
    lrem list03 //删除3个6
    lrange list03 -
    /*
    1) "1"
    2) "2"
    3) "3"
    4) "4"
    5) "5"
    6) "6"
    */ //对非空列表的表头插入某一个元素 rpushx 右边作为表头 lpushx 左边作为表头
    rpush list04
    rpushx list04 head
    lrange list04 -
    /*
    1) "1"
    2) "2"
    3) "3"
    4) "4"
    5) "5"
    6) "head"
    */ //截取原来list的一部分给原来的key
    rpush list05
    ltrim list05 //截取0 1 2 3 四个元素
    lrange list05 -
    /*
    1) "1"
    2) "2"
    3) "3"
    4) "4"
    */ //rpoplpush 源list 目的list 从源list右端pop一个数,然后左push进目的list
    /*
    127.0.0.1:6379> rpush list06 1 2 3
    (integer) 3
    127.0.0.1:6379> rpush list07 1 2 3
    (integer) 3
    127.0.0.1:6379> rpoplpush list06 list07
    "3"
    127.0.0.1:6379> lrange list07 0 -1
    1) "3"
    2) "1"
    3) "2"
    4) "3"
    */
    //list06变成2个元素,list07变成4个元素 //在指定位置前或后插入元素
    //linsert key before/after v1 v2 在key的v1前插入v2;after可选 rpush list08 java python scala js
    linsert list08 before python c#
    lrange list08 -
    /*
    1) "java"
    2) "c#"
    3) "python"
    4) "scala"
    5) "js"
    */
  • Set常用指令(集合;单键多value,或者说单值多value)(集合内元素唯一,可去重)
  •  //Set常用指令
    
     //添加集合成员 sadd   查看集合成员 smembers
    sadd set01
    smembers set01
    /*
    1) "1"
    2) "2"
    3) "3"
    */ //查看成员是否属于某一个集合 sismember set member
    sismember set01 //是返回1,不是返回0 //获取集合有多少个元素
    scard set01 //返回个数 //删除集合元素
    srem set01 //成功删除返回1;若不存在此元素返回0 //从集合随机出N个数
    srandmember set N //相当于放回采样 //从集合随机pop出1个数
    spop set //每随机pop一个数,集合set就会减少一个数;相当于不放回采样 //移动
    smove key1 key2 v1[v1属于key1] //将v1由key1移动到key2;
    //这样key1少一个元素,key2多一个元素;若v1不属于key1则返回0 //差集、交集、并集 sdiff sinter sunion sadd set1
    sadd set2 //差集
    sdiff set1 set2
    // 1) "1"
    // 2) "2"
    // 3) "3" //交集
    sinter set1 set2
    // 1) "4"
    // 2) "5" //并集
    sunion set1 set2
    //略
  • Hash常用指令(哈希;kv模式不变,value变成键值对)
  •  //hash常用指令示例
    
     //赋值与取值hset hget
    hset user name wang
    hget user name
    //输出"wang" //多个同时赋值、取值
    hmset student id name wang age
    hmget student id name age
    // 1) "1"
    // 2) "wang"
    // 3) "18" hgetall student
    // 1) "id"
    // 2) "1"
    // 3) "name"
    // 4) "wang"
    // 5) "age"
    // 6) "18" //删除
    hdel student age //删除某一个键值对 //value中是否存在某一个key
    hexists student id //存在返回1,不存在返回0 //查看某一个key的value中所有的key和所有的value
    hkeys student
    // 1) "id"
    // 2) "name"
    hvals student
    // 1) "1"
    // 2) "wang" //改变哈希表中,key的value中的value //Hincrby 只对数字有效;加参数的值;若要减则用负数
    Hincrby student age //原来18
    /*
    127.0.0.1:6379> Hincrby student age 1
    (integer) 19
    127.0.0.1:6379> Hincrby student age 1
    (integer) 20
    */ //Hincrbyfloat 加浮点数的值
    //注意,Hincrby只适用于整数的情况 //避免覆盖
    hsetnx student score //已经存在相应的键,则返回0;反之则设置成功。
  • Zset常用指令(有序集合;多加了socre值用来排序)
  •  //Zset常用指令示例
    
     //普通的set key v1 v2 v3 ...
    //有序的set key score1 v1 score2 v2 score3 v3 ... (score在前,value在后) //添加
    zadd zset1 v3 v2 v1
    //查询
    zrange zset1 - //从小到大排序 zrange zset1 0 -1 withscores带score
    // 1) "v1"
    // 2) "v2"
    // 3) "v3" //按照分数查询
    zrangebyscore zset1
    // 1) "v1"
    // 2) "v2"
    zrangebyscore zset1 ( //加 ( 表示不包括该分数
    // 1) "v1" zrangebyscore zset1 limit // limit offset count 从返回的结果中,再进行限制
    // 1) "v1"
    // 2) "v2" //删除某一个值
    zrem zset1 v3 //参数是value //统计个数
    zcard zset1 //返回value个数
    zcount zset1 最小分数 最大分数 //返回分数区间内元素个数 //取得下标
    zrank zset1 v1 //取得某个value的下标,从0开始
    //取得分数
    zscore zset1 v1 //取得某个value的分数 zrevrange zset1 - //反转;即从大到小排序 zrevrank zset1 v1 //反转后某个value的下标 zrevrangebyscore zset1 大的score 小的score //反转后按照分数取value

Redis学习笔记(1)的更多相关文章

  1. redis 学习笔记(6)-cluster集群搭建

    上次写redis的学习笔记还是2014年,一转眼已经快2年过去了,在段时间里,redis最大的变化之一就是cluster功能的正式发布,以前要搞redis集群,得借助一致性hash来自己搞shardi ...

  2. Redis学习笔记~目录

    回到占占推荐博客索引 百度百科 redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合). ...

  3. Redis学习笔记4-Redis配置详解

    在Redis中直接启动redis-server服务时, 采用的是默认的配置文件.采用redis-server   xxx.conf 这样的方式可以按照指定的配置文件来运行Redis服务.按照本Redi ...

  4. Redis学习笔记7--Redis管道(pipeline)

    redis是一个cs模式的tcp server,使用和http类似的请求响应协议.一个client可以通过一个socket连接发起多个请求命令.每个请求命令发出后client通常会阻塞并等待redis ...

  5. Redis学习笔记一:数据结构与对象

    1. String(SDS) Redis使用自定义的一种字符串结构SDS来作为字符串的表示. 127.0.0.1:6379> set name liushijie OK 在如上操作中,name( ...

  6. Redis学习笔记之ABC

    Redis学习笔记之ABC Redis命令速查 官方帮助文档 中文版本1 中文版本2(反应速度比较慢) 基本操作 字符串操作 set key value get key 哈希 HMSET user:1 ...

  7. (转)redis 学习笔记(1)-编译、启动、停止

    redis 学习笔记(1)-编译.启动.停止   一.下载.编译 redis是以源码方式发行的,先下载源码,然后在linux下编译 1.1 http://www.redis.io/download 先 ...

  8. Redis学习笔记(二)-key相关命令【转载】

    转自 Redis学习笔记(二)-key相关命令 - 点解 - 博客园http://www.cnblogs.com/leny/p/5638764.html Redis支持的各种数据类型包括string, ...

  9. Redis学习笔记(三)Redis支持的5种数据类型的总结

    继续Redis学习笔记(二)来说说剩余的三种数据类型. 三.列表类型(List) 1.介绍 列表类型可以存储一个有序的字符串列表,常用的操作是向列表两端添加元素,或者获得列表的一段片段.列表类型内部是 ...

  10. Redis学习笔记(二)Redis支持的5种数据类型的总结之String和Hash

    引言 在Redis学习笔记(一)中我们已经会安装并且简单使用Redis了,接下来我们一起来学习下Redis支持的5大数据类型. 简介 Redis是REmote DIctionary Server(远程 ...

随机推荐

  1. 10 微信小程序路由跳转

    一.四种跳转方式 API路由详解 除了tabBar这种底部跳转的方法,我们还有路由跳转,以下四种方式: 1. wx.switchTab() :跳转到 tabBar 页面,并关闭其他所有非 tabBar ...

  2. Java——HTTP超详细总结

    HTTP协议概述 HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于从万维网(WWW:World Wide Web )服务器传输超文本到本地浏览器的 ...

  3. Linux目录、文件的管理

    centos目录结构 ls / 查看根目录下有哪些文件或者目录 bin 可执行文件的目录 sbin 存放root用户可执行文件目录 etc 配置文件 boot 引导文件 home 普通用户宿主目录 l ...

  4. Spring官网阅读(九)Spring中Bean的生命周期(上)

    文章目录 生命周期回调 1.Bean初始化回调 2.Bean销毁回调 3.配置默认的初始化及销毁方法 4.执行顺序 5.容器启动或停止回调 Lifecycle 接口 LifecycleProcesso ...

  5. react中redux的理解

    定义 redux可以看作是flux的进阶版,主要用于react中公共状态(数据)的管理 redux底层原理 redux有一个createStore方法,这个方法用户创建公共存储空间,createSto ...

  6. [C#]基础——注意事项

    1. 静态类必须直接继承Object 2. 静态类不能实现接口,不能继承其他类(除了Object) 3.静态类中不能有实体方法 4.实体类中可以有静态方法,使用同 静态类 5.readonly属性可以 ...

  7. linux centos7 和 windows下 部署 .net core 2.0 web应用

    centos7 下部署asp.net core 2.0应用 安装CentOS7 配置网络[可选] 安装.Net core2.0 创建测试Asp.net Core应用程序 正式部署项目 安装VMware ...

  8. python-经典类和新式类区别

    经典类和新式类区别 Eg: class A(object):    def x(self):        print('A')class B(A):    def x(self):        p ...

  9. Redis的几种集群方式分析

    一 单机版 分析: 无论多少用户,都访问这一台服务器 .服务器一旦挂了,所有用户都无法访问.风险很大,一般不会有人使用. 二 主从模式(master/slaver) 分析: 主从模式中, 无论多少用户 ...

  10. pytest——pycharm中右击运行(run)没有问题,在terminal中运行pytest报错:E ModuleNotFoundError: No module named

    参考了这个解决办法:https://blog.csdn.net/qq_36829091/article/details/82180866 我的是Windows,linux的和Windows的解决办法有 ...