第一章.Nosql概述

为什么要用Nosql

用户的个人信息,社交网络,地理位置。用户自己产生的数据,用户日志等等爆发式增长!

这时候就需要使用Nosql库,Nosql可以很好的处理以上的情况

什么是NoSQL

NoSQL = Not Only SQL(不仅仅是SQL)

泛指非关系型的数据库

很多数据类型用户的个人信息,社交网络,地理位置,这些数据类型的存储不需要一个固定的格式

NoSQL特点

解耦

  1. 方便扩展(数据之间没有关系,很好扩展)
  2. 大数据量高性能(Redis1秒写8万次,读取11万 NoSql的缓存记录级,是一种细粒度的缓存,性能会比较高)
  3. 数据类型是多样型的(不需要事先设计数据库!随取随用!)
  4. 传统RDBMS 和NoSQL
    1. 传统的RDBMS(结构化组织,SQL,数据和关系都存在单独的表中,操作数据定义语言,严格的一致性,基础的事务)
    2. NoSQL(不仅仅是数据,没有固定的查询语言,键值对存储,列存储,文档存储,图形数据库(社交关系),最终一致性,CAP定理和BASE(异地多活),高性能,高可用,高可扩展性)

了解:3V + 3高

大数据时代的3V:主要是描述问题的

  1. 海量Volume
  2. 多样Variety
  3. 实时Velocity

大数据时代的3高:主要是对程序的要求

  1. 高并发
  2. 高可扩
  3. 高性能

NoSQL的四大分类

KV键值对:

  • 新浪:Redis
  • 美团:Redis + Tair
  • 阿里,百度:Redis +memecache

文档型数据库(bson格式)

  • MongoDB (一般必须要掌握)
    • MongoDB是一个基于分布式文件存储的数据库,C++编写,主要用来处理大量的文档
    • MongoDB是一个介于关系型数据库和非关系型数据库中间的产品,MongoDB是非关系型数据库中功能最丰富,最像关系型数据库的
  • ConthDB

列存储数据库

  • HBase
  • 分布式文件系统

图关系数据库

  • Neo4J, InfoGrid
  • 社交网络,推荐系统等,专注于构建关系图谱

第二章.Redis入门

概述

Redis(Remote Dictionary Server ) 即远程字典服务

是一个开源的使用ANSI C语言编写,支持网络,可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API ,免费和开源,是当下最热门的NoSQL技术之一,也被人们称之为结构化数据库

Redis作用:

  1. 内存存储,持久化,内存中是断电即失,所以说持久化很重要(rdb,aof)
  2. 效率高,可以用于高速缓存
  3. 发布订阅系统
  4. 地图信息分析
  5. 计时器,计数器(浏览量)

Redis特性:

  1. 多样的数据类型
  2. 持久化
  3. 集群
  4. 事务

Windows安装

Windows 安装:https://github.com/microsoftarchive/redis/releases/tag/win-3.2.100

下载完成后直接解压即可

$01[Redis入门] - 图1

双击 redis-server.exe

$01[Redis入门] - 图2

使用Redis客户端来连接Redis

双击redis-cli.exe

$01[Redis入门] - 图3

Windows下使用简单,但是Redis推荐我们使用Linux去开发使用

Linux安装

  1. 下载 redis-6.0.6.tar.gz
  2. 上传到服务器并解压

$01[Redis入门] - 图4

  1. 基本的环境安装

注意这里使用的是redis-6.0.6 需要gcc5以上,需要先升级gcc

  1. sudo yum install centos-release-scl
  1. sudo yum install devtoolset-7-gcc*
  1. scl enable devtoolset-7 bash

后再make

  1. make
  1. make install
  1. redsi的默认安装路径 /usr/local/bin

$01[Redis入门] - 图5

  1. 将redis的配置文件复制到当前目录

$01[Redis入门] - 图6

  1. redis默认不是后台启动的,修改配置文件
  1. vi redis.conf

按”i”键进入编辑模式,把 daemonize no改为 daemonize yes,按”ESC”键退出,按”:wq!”保存并退出

$01[Redis入门] - 图7

  1. 启动redis服务

$01[Redis入门] - 图8

  1. 使用redis-cli进行连接测试

$01[Redis入门] - 图9

  1. 查看redis的进程是否开启

$01[Redis入门] - 图10

  1. 关闭redis服务
  1. redis-cli shutdown

redis-benchmark 性能测试

redis-benchmark是官方自带的性能测试工具

$01[Redis入门] - 图11

简单测试

  1. #测试: 100个并发连接, 100000请求
  2. redis-benchmark -h localhost -p 6379 -c 100 -n 100000

$01[Redis入门] - 图12

Redis基础知识

Redis有16个数据库,默认使用的是第0个

可以使用select进行切换数据库

  1. 127.0.0.1:6379> select 3
  2. OK
  3. 127.0.0.1:6379[3]> DBSIZE
  4. (integer) 0
  5. 127.0.0.1:6379[3]>

清除当前数据库:

  1. 127.0.0.1:6379[3]> flushdb

清除全部数据库的内容

  1. 127.0.0.1:6379[3]> FLUSHALL

Redis的默认端口号:6379

Redis是单线程的

Redis是很快的,官方表示Redis是基于内存操作,CPU不是Redis性能瓶颈,Redis的瓶颈是根据机器的内存和网络带宽,既然可以使用单线程来实现,就使用单线程了

Redis是C语言写的 官方提供的数据为100000+的QPS,完全不比同样是使用key-value的Memecache差

Redis为什么单线程还这么快?

  1. 误区1:高性能的服务器一定是多线程的
  2. 误区2:多线程(CPU上下文会切换)一定比单线程效率高

速度:CPU>内存>硬盘

核心:redis是将所有的数据全部放在内存中,所以说使用单线程去操作效率就是最高的,多线程(CPU上下文会切换:耗时的操作),对于内存系统来说,如果没有上下文切换效率就是最高的!多次读写都是在一个CPU上,在内存情况下,这个就是最佳的答案

第三章.五大数据类型

Redis-Key

$01[Redis入门] - 图13

$01[Redis入门] - 图14

String(字符串类型)

String类型是Redis中最基本的数据类型,它是key对应的一个单一值

二进制安全,不必担心由于编码等问题导致二进制数据变化,所以redis的string可以包含任何数据,比如jpg图片或者序列化的对象

Redis中一个字符串值的最大容量是512M

指令 说明
SET key value 添加键值对
GET key 查询指定key的值
APPEND key value 将给定的value追加到原值的末尾
STRLEN key 获取值的长度
SETNX key value 只有在key不存在时设置key的值
INCR key 指定key的值自增1,只对数字有效
DECR key 指定key的值自减1,只对数字有效
INCRBY key num 自增num
DECRBY key num 自减num
MSET key1 value1 key2 value2 同时设置多个key-value对
MGET key1 key2 同时获取一个或多个value
MSETNX key1 value1 key2 value2 当key不存在时,设置多个key-value对
GETRANGE key 起始索引 结束索引 获取指定范围的值,都是闭区间
SETRANGE key 起始索引 value 从起始位置开始覆写指定的值
GETSET key value 以新换旧,同时获取旧值
SETEX key 过期时间 value 设置键值的同时,设置过期时间,单位秒

list操作

在java中list一般是单向链表,如常见的ArrayList,只能从一侧插入

在Redis中,list是双向链表,可以从两侧插入

常见操作:

  • 遍历: 遍历的时候,是从左往右取值
  • 删除: 弹栈,POP
  • 添加: 压栈,PUSH

Redis列表是简单的字符串列表,按照插入顺序排序,你可以添加一个元素到列表的头部(左边)或者尾部(右边)它的底层实际是个双向链表,对两端的操作性能很高,通过索引下标的操作中间的节点性能会较差

指令 说明
LPUSH/RPUSH key value1 value2…. 从左边/右边压入一个或多个值,头尾效率高,中间效率低
LPOP/RPOP key 从左边/右边弹出一个值,值在键在,值亡键亡
LRANGE key start stop 查看指定区间的元素,正着数:0,1,2,3… 倒着数:-1,-2,-3…..
LINDEX key index 按照索引下标获取元素(从左到右)
LLEN key 获取列表长度
LINSERT key BEFORE|AFTER value newvalue 在指定value的前后插入newvalue
LREM key n value 从左边删除n个value
LSET key index value 把指定索引位置的元素替换为另一个值
LTRIM key start stop 仅保留指定区间的数据
RPOPLPUSH list1 list2 从list1右边弹出一个值,左侧压入到list2

set操作

set是无序的,且是不可重复的

指令 说明
SADD key member [member…….] 将一个或多个member元素加入到集合key当中,已经存在于集合的member会被忽略
SMEMBERS key 取出该集合的所有值
SISMEMBER key value 判断集合是否为含有该值,有返回1,没有返回0
SCARD key 返回集合中元素的数量
SREM key member [member] 从集合中删除元素
SPOP key [count] 从集合中随机弹出count个元素的数量,count不指定就弹出一个
SRANDMEMBER key [count] 从集合中随机返回count个数量的元素,count不指定就返回一个
SINTER key [key…] 将指定的集合进行交集操作
SINTERSTORE dest key [key …] 取交集,另存为一个set
SUNION key [key …] 将指定的集合执行“并集”操作
SUNIONSTORE dest key [key …] 取并集,另存为set
SDIFF key [key …] 将指定的集合执行“差集”操作
SDIFFSTORE dest key [key …] 取差集,另存为set

hash操作

Hash数据类型的键值对中的值是”单列”的不支持进一步的层次结构

指令 说明
HSET key field value 为key中的field赋值value
HMSET key field value [field value …] 为指定key批量设置field-value
HSETNX key field value 当指定key的field不存在时,设置其value
HGETALL key 获取指定key的所有信息(field和value)
HKEYS key 获取指定key的所有field
HVALS key 获取指定key的所有value
HLEN key 指定key的field个数
HGET key field 从key中根据field取出value
HMGET key field [field …] 为指定key获取多个filed的值
HEXISTS key field 指定key是否有field
HINCRBY key field increment 为指定key的field加上增量increment

zset操作

zset是一种特殊的set(sorted set),在保存value的时候,为每个value多保存了一个score信息,根据score信息,可以进行排序

这个评分(score)是被用来按照从最低分到最高分的方式排序集合中的成员,集合的成员是唯一的,但是评分可以是重复的

指令 说明
ZADD key [score member …] 添加
ZSCORE key member 返回指定值的分数
ZRANGE key start stop [WITHSCORES] 返回指定区间的值,可选择是否一起返回scores
ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count] 在分数的指定区间内返回数据,从小到大排列
ZREVRANGEBYSCORE key max min [WITHSCORES] [LIMIT offset count] 在分数的指定区间内返回数据,从大到小排列
ZCARD key 返回集合中所有的元素的数量
ZCOUNT key min max 统计分数区间内的元素个数
ZREM key member 删除该集合下,指定值的元素
ZRANK key member 返回该值在集合中的排名,从0开始
ZINCRBY key increment member 为元素的score加上增量

第四章.Redis配置文件

1.单位说明

$01[Redis入门] - 图15

1K和1kb是不同的,单位的大小写不敏感

2.include

$01[Redis入门] - 图16

可以把公共的配置放入到一个公共的配置文件中,然后通过子配置文件引入父配置文件的内容

3.network

属性 含义 备注
bind 限定访问的主机地址 如果没有bind,就是任意ip地址都可以访问。生产环境下,需要写自己应用服务器的ip地址。
protected-mode 安全防护模式 如果没有指定bind指令,也没有配置密码,那么保护模式就开启,只允许本机访问。
port 端口号 默认是6379
tcp-backlog 网络连接过程中,某种状态的队列的长度 redis是单线程的,指定高并发时访问时排队的长度。超过后,就呈现阻塞状态。可以理解是一个请求到达后至到接受进程处理前的队列长度。(一般情况下是运维根据集群性能调控)高并发情况下,此值可以适当调高。
timeout 超时时间 默认永不超时
tcp-keepalive 对客户端的心跳检测间隔时间

4.genernal

属性 含义 备注
daemonize 是否为守护进程模式运行 守护进程模式可以在后台运行
pidfile 进程id文件保存的路径 配置PID文件路径,当redis作为守护进程运行的时候,它会把 pid 默认写到 /var/redis/run/redis_6379.pid 文件里面
loglevel 定义日志级别 debug(记录大量日志信息,适用于开发、测试阶段) verbose(较多日志信息) notice(适量日志信息,使用于生产环境) warning(仅有部分重要、关键信息才会被记录)
logfile 日志文件的位置 当指定为空字符串时,为标准输出,如果redis以守护进程模式运行,那么日志将会输出到/dev/null
syslog-enabled 是否记录到系统日志 要想把日志记录到系统日志服务中,就把它改成 yes
syslog-ident 设置系统日志的ID
syslog-facility 指定系统日志设置 必须是 USER 或者是 LOCAL0-LOCAL7 之间的值
databases 设置数据库数量

5.其他

属性 含义 备注
requirepass 设置密码
maxclients 最大连接数
maxmemory 最大占用多少内存 一旦占用内存超限,就开始根据缓存清理策略移除数据如果Redis无法根据移除规则来移除内存中的数据,或者设置了“不允许移除”, 那么Redis则会针对那些需要申请内存的指令返回错误信息,比如SET、LPUSH等。
maxmemory-policy noeviction 缓存清理策略 (1)volatile-lru:使用LRU算法移除key,只对设置了过期时间的键 (2)allkeys-lru:使用LRU算法移除key (3)volatile-random:在过期集合中移除随机的key,只对设置了过期时间的键 (4)allkeys-random:移除随机的key (5)volatile-ttl:移除那些TTL值最小的key,即那些最近要过期的key (6)noeviction:不进行移除。针对写操作,只是返回错误信息
maxmemory-samples 样本数 样本数越小,准确率越低,但是性能越好。LRU算法和最小TTL算法都并非是精确的算法,而是估算值,所以你可以设置样本的大小。一般设置3到7的数字。