第一章.Nosql概述
为什么要用Nosql
用户的个人信息,社交网络,地理位置。用户自己产生的数据,用户日志等等爆发式增长!
这时候就需要使用Nosql库,Nosql可以很好的处理以上的情况
什么是NoSQL
NoSQL = Not Only SQL(不仅仅是SQL)
泛指非关系型的数据库
很多数据类型用户的个人信息,社交网络,地理位置,这些数据类型的存储不需要一个固定的格式
NoSQL特点
解耦
- 方便扩展(数据之间没有关系,很好扩展)
- 大数据量高性能(Redis1秒写8万次,读取11万 NoSql的缓存记录级,是一种细粒度的缓存,性能会比较高)
- 数据类型是多样型的(不需要事先设计数据库!随取随用!)
- 传统RDBMS 和NoSQL
- 传统的RDBMS(结构化组织,SQL,数据和关系都存在单独的表中,操作数据定义语言,严格的一致性,基础的事务)
- NoSQL(不仅仅是数据,没有固定的查询语言,键值对存储,列存储,文档存储,图形数据库(社交关系),最终一致性,CAP定理和BASE(异地多活),高性能,高可用,高可扩展性)
了解:3V + 3高
大数据时代的3V:主要是描述问题的
- 海量Volume
- 多样Variety
- 实时Velocity
大数据时代的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作用:
- 内存存储,持久化,内存中是断电即失,所以说持久化很重要(rdb,aof)
- 效率高,可以用于高速缓存
- 发布订阅系统
- 地图信息分析
- 计时器,计数器(浏览量)
Redis特性:
- 多样的数据类型
- 持久化
- 集群
- 事务
Windows安装
Windows 安装:https://github.com/microsoftarchive/redis/releases/tag/win-3.2.100
下载完成后直接解压即可
![$01[Redis入门] - 图1](http://ww1.sinaimg.cn/large/006bYs0Bly1goqvyu0da7j30v90hmwg8.jpg#id=TVWU3&originHeight=634&originWidth=1125&originalType=binary&ratio=1&status=done&style=none)
双击 redis-server.exe
![$01[Redis入门] - 图2](http://ww1.sinaimg.cn/large/006bYs0Bly1goqw0d3044j30r70e8glp.jpg#id=PlFUC&originHeight=512&originWidth=979&originalType=binary&ratio=1&status=done&style=none)
使用Redis客户端来连接Redis
双击redis-cli.exe
![$01[Redis入门] - 图3](http://ww1.sinaimg.cn/large/006bYs0Bly1goqw6lgownj30r70drt8q.jpg#id=S8HEF&originHeight=495&originWidth=979&originalType=binary&ratio=1&status=done&style=none)
Windows下使用简单,但是Redis推荐我们使用Linux去开发使用
Linux安装
- 下载 redis-6.0.6.tar.gz
- 上传到服务器并解压
![$01[Redis入门] - 图4](http://ww1.sinaimg.cn/large/006bYs0Bly1goqwo9vgxej30p7052t8n.jpg#id=v7yc6&originHeight=182&originWidth=907&originalType=binary&ratio=1&status=done&style=none)
- 基本的环境安装
注意这里使用的是redis-6.0.6 需要gcc5以上,需要先升级gcc
sudo yum install centos-release-scl
sudo yum install devtoolset-7-gcc*
scl enable devtoolset-7 bash
后再make
make
make install
- redsi的默认安装路径 /usr/local/bin
![$01[Redis入门] - 图5](http://ww1.sinaimg.cn/large/006bYs0Bly1goqxnhcq2yj30si08mt95.jpg#id=Bl8La&originHeight=310&originWidth=1026&originalType=binary&ratio=1&status=done&style=none)
- 将redis的配置文件复制到当前目录
![$01[Redis入门] - 图6](http://ww1.sinaimg.cn/large/006bYs0Bly1goqxy07jdzj30oy03rwei.jpg#id=oyG93&originHeight=135&originWidth=898&originalType=binary&ratio=1&status=done&style=none)
- redis默认不是后台启动的,修改配置文件
vi redis.conf
按”i”键进入编辑模式,把 daemonize no改为 daemonize yes,按”ESC”键退出,按”:wq!”保存并退出
![$01[Redis入门] - 图7](http://ww1.sinaimg.cn/large/006bYs0Bly1goqylelhx3j30j908hmxe.jpg#id=j1QGK&originHeight=305&originWidth=693&originalType=binary&ratio=1&status=done&style=none)
- 启动redis服务
![$01[Redis入门] - 图8](http://ww1.sinaimg.cn/large/006bYs0Bly1goqysgqk8sj311403tdg2.jpg#id=pASX6&originHeight=137&originWidth=1336&originalType=binary&ratio=1&status=done&style=none)
- 使用redis-cli进行连接测试
![$01[Redis入门] - 图9](http://ww1.sinaimg.cn/large/006bYs0Bly1goqyw9cscdj30t108r0sy.jpg#id=GMd6r&originHeight=315&originWidth=1045&originalType=binary&ratio=1&status=done&style=none)
- 查看redis的进程是否开启
![$01[Redis入门] - 图10](http://ww1.sinaimg.cn/large/006bYs0Bly1goqyzn8nprj30tj08uq37.jpg#id=k4SEA&originHeight=318&originWidth=1063&originalType=binary&ratio=1&status=done&style=none)
- 关闭redis服务
redis-cli shutdown
redis-benchmark 性能测试
redis-benchmark是官方自带的性能测试工具
![$01[Redis入门] - 图11](http://ww1.sinaimg.cn/large/006bYs0Bly1goqz7yicsuj30n00hq753.jpg#id=LS3mL&originHeight=638&originWidth=828&originalType=binary&ratio=1&status=done&style=none)
简单测试
#测试: 100个并发连接, 100000请求redis-benchmark -h localhost -p 6379 -c 100 -n 100000
![$01[Redis入门] - 图12](http://ww1.sinaimg.cn/large/006bYs0Bly1goqzr4qk6aj30rv09j74r.jpg#id=McLYB&originHeight=343&originWidth=1003&originalType=binary&ratio=1&status=done&style=none)
Redis基础知识
Redis有16个数据库,默认使用的是第0个
可以使用select进行切换数据库
127.0.0.1:6379> select 3OK127.0.0.1:6379[3]> DBSIZE(integer) 0127.0.0.1:6379[3]>
清除当前数据库:
127.0.0.1:6379[3]> flushdb
清除全部数据库的内容
127.0.0.1:6379[3]> FLUSHALL
Redis的默认端口号:6379
Redis是单线程的
Redis是很快的,官方表示Redis是基于内存操作,CPU不是Redis性能瓶颈,Redis的瓶颈是根据机器的内存和网络带宽,既然可以使用单线程来实现,就使用单线程了
Redis是C语言写的 官方提供的数据为100000+的QPS,完全不比同样是使用key-value的Memecache差
Redis为什么单线程还这么快?
- 误区1:高性能的服务器一定是多线程的
- 误区2:多线程(CPU上下文会切换)一定比单线程效率高
速度:CPU>内存>硬盘
核心:redis是将所有的数据全部放在内存中,所以说使用单线程去操作效率就是最高的,多线程(CPU上下文会切换:耗时的操作),对于内存系统来说,如果没有上下文切换效率就是最高的!多次读写都是在一个CPU上,在内存情况下,这个就是最佳的答案
第三章.五大数据类型
Redis-Key
![$01[Redis入门] - 图13](http://ww1.sinaimg.cn/large/006bYs0Bly1gor0qbziqkj30mu0ifmy4.jpg#id=RsS0G&originHeight=663&originWidth=822&originalType=binary&ratio=1&status=done&style=none)
![$01[Redis入门] - 图14](http://ww1.sinaimg.cn/large/006bYs0Bly1gor0qkb98xj30n10f6mxt.jpg#id=ig43B&originHeight=546&originWidth=829&originalType=binary&ratio=1&status=done&style=none)
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](/uploads/projects/liuye-6lcqc@gx6gw9/9ed4fb4c076f20c35a8fdaa6182eac10.png)
1K和1kb是不同的,单位的大小写不敏感
2.include
![$01[Redis入门] - 图16](/uploads/projects/liuye-6lcqc@gx6gw9/82e0bc66059b5d853916a355cd786e82.png)
可以把公共的配置放入到一个公共的配置文件中,然后通过子配置文件引入父配置文件的内容
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的数字。 |
