一、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. Clickhosue 强大的函数,argMin() 和argMax()函数

    说实话,我喜欢Clickhouse 的函数,简单操作,功能强大.今天需要给大家介绍两个函数,argMin(),argMax() 1.argMax():计算 ‘arg’ 最大值 ‘val’ 价值. 如果 ...

  2. USACO Training Section 1.3混合牛奶 Mixing Milk

    题目描述 由于乳制品产业利润很低,所以降低原材料(牛奶)价格就变得十分重要.帮助Marry乳业找到最优的牛奶采购方案. Marry乳业从一些奶农手中采购牛奶,并且每一位奶农为乳制品加工企业提供的价格是 ...

  3. 网络流--最大流--Dinic模板矩阵版(当前弧优化+非当前弧优化)

    //非当前弧优化版 #include <iostream> #include <cstdio> #include <math.h> #include <cst ...

  4. 在Jetson TX2上安装OpenCV(3.4.0)

    参考文章:How to Install OpenCV (3.4.0) on Jetson TX2 与参考文章大部分都是相似的,如果不习惯看英文,可以看看我下面的描述 在我们使用python3进行编程时 ...

  5. python 中open文件路径的选择

    一.问题描述 python 中使用open打开某个文件写入时,往往会发现需要写入的文件不在同级目录下.这样就需要根据文件的路径来找到并打开. 但往往有时绝对路径和相对路径,写入不正确就会打开失败. 二 ...

  6. Spring MVC的Controller接受请求方式以及编写请求处理方法

    Controller接受请求参数的常见方法: 1.通过Bean接受请求参数: 创建POJO实体类 创建pojo包,并在该包中创建实体类UserForm,代码: package pojo; public ...

  7. Java通过反射技术动态创建对象(有参、无参构造)

    实现类: package com.ljy; import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTarge ...

  8. turtle库应用实例3-叠加等边三角形绘制(一笔画)

    叠加等边三角形绘制 ‪‬‪‬‪‬‪‬‪‬‮‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‭‬‪‬‪‬‪‬‪‬‪‬ ...

  9. mybatis的关系映射

    一.多对一的映射关系 举例:根据员工编号查询员工所在部门的部门信息 第一步,需要在多的一方也就是员工实体类中持有一的一方部门实体类的引用 第二步,在dao接口中声明方法 第三步,在mapper中实现该 ...

  10. JVM 运行时数据区(二)

    @ 目录 运行时数据区 共享区 堆区 方法区 隔离区 虚拟机栈 栈帧 本地方法栈 程序计数器 运行时数据区 JVM 运行时数据区主要分为5块 方法区 JDK1.8以后叫做元数据区(Metaspace) ...