能干嘛
KV+Cache+Persistence
NoSql=Not Only SQL
泛指非关系型的数据库
这些类型的数据存储不需要固定的模式,无需多余的操作就可以横向扩展
CAP
redis
mongdb
memcached
mysql慢的原因
1、做大数据的时候,cpu慢
2、频繁的访问mysql,io慢
Memcashed(缓存)+mysql+垂直拆分
mysql主从复制读写分离
分表分库+水平拆分+mysql集群
水平拆分降低了单张表的故障发生率和数据的冗余程度
今天我们可以通过第三方平台(如:google,Facebook等)可以很容易的访问和抓取数据。用户的个人信息,社交网络,地理位置,用户生成的数据和用户操作日志已经成倍的增加。我们如果要对这些用户数据进行挖掘,SQL数据库已经不适合这些应用了,NoSql数据库的发展也却能很好的处理这些大数据
3v+3高
大数据时代的3v
海量Volume
多样Variety
实时Velocity
互联网需求的3高
高并发
高可扩
高性能
总结大型互联网应用(大数据、高并发、多样数据类型)的难点和解决方案
难点
数据类型的多样性
数据源多样性和变化结构
数据源改造而数据服务平台不需要大面积重构
解决办法
统一数据访问层
传统的ACID分别是什么
A(Atomicity)原子性
C(Consistency)一致性
I(Isolation)独立性
D(Durability)持久性
CAP
C:Consistency(强一致性)
A:Availability(可用性)
P:Partition tolerance(分区容错性)
CAP的3进2
最多只能同时较好的满足两个
CAP的核心理论是:一个分布式系统不可能同时很好的满足一致性,可用性,和分区容错性这三个需求,因此,根据CAP原理将NoSql数据库分成了满足CA原则,满足CP原则和满足AP原则三大类
CA -- 单点集群,满足一致性,可用性的系统,通常在可扩展性上不太强大
RDBMS
CP -- 满足一致性,分区容错性的系统,通常性能不是特别的高
MongoDB、HBase、Redis
AP -- 满足可用性,分区容忍性的系统,通常可能对一致性要求要低一些
CouchDB、Cassandra、DynamoDB、Riak
分区容忍性是我们必须要实现的
分布式架构的时候必须做出取舍:
一致性和可用性之间必须做出一个平衡。多余大多数web应用,其实并不需要强一致性。
因此牺牲C换取P,这是目前分布式数据库产品的方向
术语
基本可用(Basically Available)
软状态(Soft state)
最终一致(Eventually consistent)
它的思想是通过让系统放松某一时刻数据一致性的要求来换取系统整体伸缩性和性能上的改观
redis
REmote DIctionary Server(远程字典服务器)
完全开源免费的,用C语言编写的,遵守BSD协议,是一个高性能的(Key/Value)分布式内存数据库,基于内存运行并支持持久化的NoSql数据库,是当前最热门的NoSql数据库之一,也被人们称之为数据结构服务器
和其它redis相比三个特点
redis支持数据的持久化,可以将内存中的数据保持在磁盘中,重启的时候可以再次加载进行使用
redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储
redis支持数据的备份,即master-slave模式的数据备份
作用
内存存储和持久化:redis支持异步将内存中的数据写到硬盘上,同时不影响继续服务
会话缓存(session cache)
队列
排名点赞
安装过程
1、解压
2、gcc -v
3、进入redis目录
4、make
5、make install
6、查看默认目录/usr/local/bin
Redis-benchmark:性能测试工具,可以在自己的本子运行,看看自己本子性能如何
Redis-check-aof:修复有问题的AOF文件
Redis-check-dump:修复有问题的dump.rdb文件
Redis-cli:客户端,操作入口
Redis-sentinel:redis集群使用
Redis-server:Redis服务器启动命令
安装错误
1、没有gcc,C语言编译工具
安装gcc
2、安装gcc后再make报没有那个文件或目录
make disclean后再重新装
redis-conf
37行daemonize no改成daemonize yes
查进程ps -ef|grep redis
不显示其它ps -ef|grep redis|grep -v grep
查6379端口是否占用netstat -anp|grep 6379
lsof -i:6379
启动服务端 /usr/local/bin redis-server /myredis/redis.conf
启动客户端 redis-cli -p 6379
ping返回pong就成功了
增删改查
set k1 helloword
get k1
DEL k1
set k1 hellobird
查看所有记录
keys *
退出客户端
quit
关服务器再退出
先SHUTDOWN
再quit
单进程
默认16个数据库,类似数据下标从零开始,初始默认使用零号库
redis.conf
118行 database 16
select 命令切换数据库
启动 select 3 进入4号数据库
删除当前库
FLUSHDB
删全部库命令,清空
FLUSHALL
查看有几条记录
DESIZE
统一密码管理,16个库都是同样密码,要么都OK要么一个也连接不上
redis索引都是从零开始
默认端口都是6379
意大利女歌手merz
key
key *
exists key的名字,判断某个key是否存在
move key db ---> 当前库就没有了,被移除了
expire key 秒钟:为给定的key设置过期时间
ttl key 查看还有多少秒过期,-1表示永不过期,-2表示已过期
type key 查看你的key是什么类型
String(字符串)
认知
redis最基本的类型
二进制安全的,可以包含任何数据,比如jpg图片或者序列化的对象
一个redis字符串value理论最多可以使512m
单值单value
set/get/del/append/strlen
incr/decr/incrby/decrby,一定要是数字才能进行加减
getrange/setrange
获取指定区间范围内的值,类似between....and的关系 ---------> 从零到负一表示全部
setex(set with expire)键秒值/setnx(set if not exist)
mset/mget/msetnx
mset k1 v1 k2 v2
getset 先获取再设置
List(列表)
单值多value
lpush/rpush/lrange
lpush list01 1 2 3 4 5 5 5 5
rpush list03 1 2 3 4 5 5 5 5
lrange list01 0 -1
lpop/rpop
弹出元素
lindex,按照索引下标获得元素(从上到下)
lindex list01 4
llen
lrem key 数字N 给定值v1
解释(删除N个值等于v1的元素)
rpoplpush源列表 目的列表
rpoplpush list01 list04
set key index value
lset list01 0 404
linsert key before/after 已有值 插入的新值
linsert list01 before 404 java
linsert list01 after404 java
它的底层实际上是一个双向链表,对两端的操作性能很高,通过索引下标的操作中间的节点性能会比较差
Set(集合)
单值多value
sadd/smembers/sismember
sadd set01 1 1 12 2
smembers set01
sismember set01 3
scard,获取集合里面的元素个数
srem key value 删除集合中元素
srandmember key 某个随机数(随机出几个数)
spop key 随机出栈
smove key1 key2 在key1里某个值
作用是将key1里已存在的某个值赋给key2
数学集合类
差集:sdiff
交集:sinter
并集:sunion
Hash(哈希,类似java里的map)
KV模式不变,但V是一个键值对
hset/hget/hmset/hmget/hgetall/hdel
hset customer id 11
hset customer name z3
hset customer age 23
hget customer id
hget customer name
hget customer age
hmset customer id 11 name l4 age 11
hmget cistomer id name age
hgetall customer
hdel customer id
hlen
hlen customer
hexists key 在key里面的某个值的key
hkeys/hvals
hkeys customer
hvals customer
hincrby/hincrbyfloat
hincrby customer age 2
hincrbyfloat customer score 0.5
hsetnx
hsetnx customer weixin rrr
Zset(sorted set:有序集合)
zadd/zrange
zadd zset01 60 v1 70 v2 80 v3
zrange zset01 0 -1
zrangebyscore key 开始score 结束score
zrangebyscore zset01 60 90
withscores
zrangebyscore zset01 60 90 withscores
( 不包含
zrangebyscore zset01 (60 90 withscores
limit 作用是返回限制
zrangebyscore zset01 60 90 withscores limit 0 2
0开始后面两个
zerm key 某score下对应的value值,作用是删除元素
zrem zset01 v3
zcard key 获得几个元素
zcard zset01
zcount key score区间
zcount zset01 60 90
zrank key values值,作用是获得下标值
zrank zset01 v3
zscore key 对应值,获得分数
zscore zset01 v1
zrevrank key values值,作用是逆序获得下标值
zrevrank zset01 0 -1
zrevrangebyscore key 结束score 开始score
zrevrangebyscore zset01 90 60
http://redisdoc.com/