NoSQL的四大分类
K-V键值对
- 新浪:Redis
- 美团:Redis+Tair
- 阿里,百度:Redis+memcache
文档型数据库
-
MongoDB(要掌握!)
- MongoDB是一个基于分布式文件存储的数据库,C++编写,主要用来处理大量的文档!
- MongoDB是一个介于关系型数据库和非关系型数据中中间的产品!MongoDB是非关系型数据库中功能最丰富,最像关系型数据库的!
-
ConthDB(了解即可)
列存储数据库
-
HBase
-
分布式文件系统
图关系数据库
- 存放的是关系而不是图形!!比如朋友圈社交网络,广告推荐!
- Neo4j,InfoGrid
Redis基本介绍
Redis(远程服务字典)是一个开源的使用ANSI C语言编写、遵守BSD协议、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。
- 内存是断电即失、所以持久化很重要(rdb、aof)
- 效率高,可以用于高速缓存
- 发布订阅系统
- 地图信息分析
- 计时器,计数器
- …
- 多样的数据类型
- 持久化
- 集群
- 事务
- 。。。
Redis安装
##我是用宝塔面板安装的,具体安装步骤网上可查(比较方便~~)
- 测试连通
- 查看redis的进程是否开启
- 如何关闭redis服务
进程已经消失
Redis入门
是官方自带的性能测试工具
redis 性能测试工具可选参数如下所示:
简单测试:100并发+10W请求
redis-benchmark -h localhost -p 6379 -c 100 -n 100000
redis中默认有16个数据库
刚开始默认进入0号数据库
select [数据库] #切换数据库
DBSIZE #查看当前数据库的大小
key * #查看数据库中所有的key
EXISTS [key] #判断该key存不存在
flushdb #清除当前的数据库
FLUSHALL #清除所有的数据库
Redis为什么单线程还是那么快?
CPU不是它的性能瓶颈;Redis的性能瓶颈是机器的内存和网络带宽
核心:redis是将所有的数据放在内存中,所以说使用单线程去操作效率就是最高的(多线程CPU会上下文切换,十分耗时,对于内存来说,没有上下文切换效率就是最高的)。
所谓的单线程指的是网络请求模块使用了一个线程(所以不需考虑并发安全性),即一个线程处理所有网络请求,其他模块仍用了多个线程。
redis采用多路复用机制:即多个网络socket复用一个io线程,实际是单个线程通过记录跟踪每一个Sock(I/O流)的状态来同时管理多个I/O流.
五大基本类型(API只放常用的)
多看看官方文档
type 【key】 #查看key的类型
incr/decr/incrby/decrby指令
getrange指令
setrange指令(我直接只用set全覆盖了不是更方便?)
setex/setnx/ttl指令
mset/mget指令
getset命令
在redis里面,我们可以把list完成栈、队列,阻塞队列
所有的list命令都是l开头的
lpush/rpush命令
lpop/rpop命令
lindex/llen命令
lrem命令
trim命令
rpoplpush命令
lset/linsert命令
- list实际上是一个链表,有一个Node,有before/after
- 如果key不存在,创建新的链表
- 如果key存在,新增内容
- 如果移除了key,空链表,所有的值都消失了
- 在两边插入或者改动值,效率最高!中间元素效率偏低
所有的set命令都是s开头的
sadd/smembers/sismember
scard(同llen|strlen) / srem
srandmember
spop
smove
sdiff(差集)/sinter(交集)/sunion(并集)
看作是map集合,key-Map(key-(key-value))
所有的hash命令都是以h开头的(命令和String很像)
hset/hget/hmset/hmget/hgetall
声明一个Map,myhash是Map名,field1是map的key,cherrywang是map的value
hdel
hlen
hexists
hkeys/hvals
hincrby/hsetnx
hash常用来做一些变动的信息的保存,比如用户信息。。
所以hash更适合于对象的存储,String更适合字符串存储
在set的基础上增加了一个值
set k1 v1
zset k1 score1 v1
zadd/zrange
zrangebyscore(默认降序)/zrevrange(升序)
zrem/zcard
- set排序,存储班级成绩表,工资表排序…
- 排行榜应用实现,带权重判断。。。
三种特殊数据类型
geospatial 地理位置
geoadd
geopos
geodist
georadius
georadiusbymember
- GEO的底层实现原理就是其实就是Zset!我们可以使用zset命令来操作geo!
基数:不重复的数总共个数
{1,2,3,4,5,5,6}=>{1,2,3,4,5,6},基数为6
Redis Hyperloglog 基数统计的算法 (允许容错就用这个)
网页的UV(一个人访问一个网站多次还算一个人)
pfadd/pfcount/pfmerge
位存储
setbit
getbit/bitcount