1.单机Mysql
2.Memcached(缓存)+Mysql+垂直拆分
3.Mysql主从读写分离
4.分表分库+水平拆分+Mydql集群
在Memcached的高速缓存,Mysql的主从复制,读写分离的基础上,这时Mysql主库的写压力开始出现瓶颈,而数据量的持续猛增,由于MYISAM使用表锁,在高并发下会出现严重的锁问题,大量的高并发Mysql应用开始使用InnoDB引擎代替MyISAM。
高并发的操作是不太建议有关联查询
NOsql数据模型
聚合模型
KV
Bson
列族
图
聚合模型
新浪:BerkeleyDB + redis
美团:redis + tair
阿里、百度:memcache + redis
文档型数据库:典型介绍MongoDB
基于分布式文件存储的数据库。
MongoDB
NoSQL数据库的四大分类:
1.KV redis
2.文档型数据库 mongoDB
3.列存储HBase
4.图形Neo4j,
在分布式数据库中CAP原理CAP + BASE
C:Consistency
A: Availablity
P: Partition tolerance
CAP的3进2
经典的CAP图
BASE
分布式 + 集群简介
CAP:
1.Redis(MongoDB)的理念是CP,C强一致性、P分区容错性
2.传统的数据库 CA,C强一致性、A高可用性
3.AP大多数网站架构的选择 + 弱一致性
BASE为了解决关系数据库强一致性引起的问题而引起的可用性降低而提出的解决方案。
BASE:
基本可用Basically Available
软状态Soft state
最终一致 Eventually consistent
分布式
不同的多台服务器上面部署不同的服务模块
集群
不同的多台服务器上面部署相同的服务模块
负载均衡
Redis REmote DIctionary Server
(远程字典服务器)
高性能的key/value分布式内存数据库
1.持久化
2.数据类型丰富
3.数据的备份
能干什么?
1.内存存储和持久化
2.取N个数据的操作
3.发布、订阅消息系统
4.定时器和计数器
Http://redis.io/
Http://www.redis.cn/
tar -zxvf 解压缩
tar -zcvf 压缩
1.在redis 使用make命令(yum install gcc-c++)
2.make distclean 再make
3.make install
启动命令:
redis-server /myredis/redis.conf
redis-cli -p 6379
ping
set k1 hello
shutdown (关闭)
redis-benchmark来看看redis的性能。
单进程
看有多少个库:
redis.conf
选择库:
select 7(换到第8个库)
Dbsize
查看当前数据库的key的数量
keys *
所有key罗列
keys k?
可以查出所有以k开头的key
FLUSHDB 清空当前库
FLUSHALL 清空所有库
=====================================
二进制安全?
意思是String可以包含任何数据,比如jpg图片或者序列化的对象
五大数据类型:
String:最基本的类型,和Memcached一模一样的类型。
Hash:类似Java里面的Map Map<String,Object>
List:列表,
Set:集合,
Zset(有序集合):不同的元素都会关联一个double类型的分数
redis命令参考 http://redisdoc.com/
=====================================key
keys *
查看所有的key
set k1 v1
EXISIS K1
public class Demo01 {
public static void main(String[] args){
Jedis jedis = new Jedis("127.0.0.1",6379);
System.out.println("connection is ok ===>" + jedis.ping());
}
}
将k3移动到库2
move k3 2
为指定的key设置过期时间
expire key
ttl k1 看一下k1的还能活多久
EXISIS k3 10
-1表示永不过期,-2表示已过期
已过期的将被移除
type k1
查看数据类型
=====================================String:单key单value
append k1 12345
strlen k1
INCR k2 自增操作(+1)
DECR k2 自减操作(-1)
INCRBY k2 2(每次增加2)
DECRBY K2 2(每次减少2)
set k1 abcd1234
GETRANGE K1 0 -1
"abcd1234"
GETRANGE K1 0 2
"abc"
SETRANGE K1 0 xxx
"xxxd1234"
setex k4 10 v4
ttl k4
setnx k1 v11
如果不存在,起作用
mset/mget/msetnx
mset k1 v1 k2 v2 k3 v3
mget k1 k2 k3
=====================================List:单key多value
LPUSH list01 1 2 3 4 5
LRANGE list01 0 -1 (全取)
RPUSH list02 12345
LRANGE list01 1 2 3 4 5
LRANGE list01 0 -1 (全取)
lpop list01
rpop list01
LIDNEX list01 4
llen list01
RPUSH list03 1 1 1 2 2 2 3 3 3 4 4 4 5 5 5
LREM list03 2 3 (删除2个3)
LPUSH list01 1 2 3 4 5 6 7 8
LTRIM list01 3 5(开始index结束index,截取指定范围的值后再赋值给key)
rpoplpush list01 list02 (list01 出栈到 list02)
lset key index value
LINSERT key before/after value1 value2
list字符串链表,left和right都可以插入添加
=====================================Set:单key多value
sadd set01 1 1 2 2 3 3
SMEMBERS set01
scard 获取集合里面的元素个数
srem key value 删除集合中的元素
srandmember key 数字(随机出几个数)
spop key 随机出栈
=====================================HasH:KV模式不变,但V是一个键值对
hset user id 11
hget user id
hset user name z3
hdel user name
HEXISTS user name
HKEYS customer (列出customer所有的key)
hvals customer (列出customer所有的value)
HINCRBY customer age 2 (age的值加2)
=====================================ZSet:在set的基础上,加一个score的值,之前的set是 k1 v1 v2 v3,现在zset是 k1 score1 v1 score2 v2 score3 v3
=====================================解析配置文件 redis.conf
设置vim的行号
:set num
四个日志级别:
debug
verbose
notice
warning
redis启动命令:
1.redis-server /myredis/redis.conf
2.redis-cli -p 6389
ping
config get requirepass
config get dir
在哪个路径下启动的,日志就在哪个路径下。
config set requirepass "123456"
auth 123456
LIMITS限制:
Maxclients
Maxmemory
Maxmemory-policy
1>Volatile-lru
2>Allkeys-lru
3>Volatile-random
4>Allkeys-random
5>Volatile-ttl 移除那些TTL最小的key,即那些最近要过期的key
6>noeviction 永不过期
Maxmemory-samples
=====================================持久化=>rdb、aof
技术敏感性
Redis会单独创建一个子进程进行持久化,会先将数据写入到一个临时文件中,待持久化过程都结束了,再用这个临时文件替换上次持久化好的文件。主进程不进行任何IO操作。如果需要进行大规模数据的恢复,且对于数据恢复的完整性不是非常敏感,那么RDB方式要比AOF方式更加的高效。RDB的缺点是最后一次持久化后的数据可能丢失。
Fork的作用是复制一个与当前进程一样的进程。
redis-server /myredis/redis.conf
redis-cli -p 6379
禁用 save ""
set 1122 1122
save
适合大规模的数据恢复
对数据完整性和一致性要求不高
=====================================aof
insert into test_table values()
set k1 100
incr k1
incr k1
incr k1
incr k1
incr k1
incr k1
redis-server /myredis/redis_aof.conf
redis-cli -p 6379
set k1 v1
set k2 v2
set k3 v3
修复aof文件:
redis-check-aof --fix appendonly.aof
打开aof
appendonly yes
appendfilename
appendfsync
Everysec
rewrite命令:
bgrewriteaof
2.Memcached(缓存)+Mysql+垂直拆分
3.Mysql主从读写分离
4.分表分库+水平拆分+Mydql集群
在Memcached的高速缓存,Mysql的主从复制,读写分离的基础上,这时Mysql主库的写压力开始出现瓶颈,而数据量的持续猛增,由于MYISAM使用表锁,在高并发下会出现严重的锁问题,大量的高并发Mysql应用开始使用InnoDB引擎代替MyISAM。
高并发的操作是不太建议有关联查询
NOsql数据模型
聚合模型
KV
Bson
列族
图
聚合模型
新浪:BerkeleyDB + redis
美团:redis + tair
阿里、百度:memcache + redis
文档型数据库:典型介绍MongoDB
基于分布式文件存储的数据库。
MongoDB
NoSQL数据库的四大分类:
1.KV redis
2.文档型数据库 mongoDB
3.列存储HBase
4.图形Neo4j,
在分布式数据库中CAP原理CAP + BASE
C:Consistency
A: Availablity
P: Partition tolerance
CAP的3进2
经典的CAP图
BASE
分布式 + 集群简介
CAP:
1.Redis(MongoDB)的理念是CP,C强一致性、P分区容错性
2.传统的数据库 CA,C强一致性、A高可用性
3.AP大多数网站架构的选择 + 弱一致性
BASE为了解决关系数据库强一致性引起的问题而引起的可用性降低而提出的解决方案。
BASE:
基本可用Basically Available
软状态Soft state
最终一致 Eventually consistent
分布式
不同的多台服务器上面部署不同的服务模块
集群
不同的多台服务器上面部署相同的服务模块
负载均衡
Redis REmote DIctionary Server
(远程字典服务器)
高性能的key/value分布式内存数据库
1.持久化
2.数据类型丰富
3.数据的备份
能干什么?
1.内存存储和持久化
2.取N个数据的操作
3.发布、订阅消息系统
4.定时器和计数器
Http://redis.io/
Http://www.redis.cn/
tar -zxvf 解压缩
tar -zcvf 压缩
1.在redis 使用make命令(yum install gcc-c++)
2.make distclean 再make
3.make install
启动命令:
redis-server /myredis/redis.conf
redis-cli -p 6379
ping
set k1 hello
shutdown (关闭)
redis-benchmark来看看redis的性能。
单进程
看有多少个库:
redis.conf
选择库:
select 7(换到第8个库)
Dbsize
查看当前数据库的key的数量
keys *
所有key罗列
keys k?
可以查出所有以k开头的key
FLUSHDB 清空当前库
FLUSHALL 清空所有库
=====================================
二进制安全?
意思是String可以包含任何数据,比如jpg图片或者序列化的对象
五大数据类型:
String:最基本的类型,和Memcached一模一样的类型。
Hash:类似Java里面的Map Map<String,Object>
List:列表,
Set:集合,
Zset(有序集合):不同的元素都会关联一个double类型的分数
redis命令参考 http://redisdoc.com/
=====================================key
keys *
查看所有的key
set k1 v1
EXISIS K1
public class Demo01 {
public static void main(String[] args){
Jedis jedis = new Jedis("127.0.0.1",6379);
System.out.println("connection is ok ===>" + jedis.ping());
}
}
将k3移动到库2
move k3 2
为指定的key设置过期时间
expire key
ttl k1 看一下k1的还能活多久
EXISIS k3 10
-1表示永不过期,-2表示已过期
已过期的将被移除
type k1
查看数据类型
=====================================String:单key单value
append k1 12345
strlen k1
INCR k2 自增操作(+1)
DECR k2 自减操作(-1)
INCRBY k2 2(每次增加2)
DECRBY K2 2(每次减少2)
set k1 abcd1234
GETRANGE K1 0 -1
"abcd1234"
GETRANGE K1 0 2
"abc"
SETRANGE K1 0 xxx
"xxxd1234"
setex k4 10 v4
ttl k4
setnx k1 v11
如果不存在,起作用
mset/mget/msetnx
mset k1 v1 k2 v2 k3 v3
mget k1 k2 k3
=====================================List:单key多value
LPUSH list01 1 2 3 4 5
LRANGE list01 0 -1 (全取)
RPUSH list02 12345
LRANGE list01 1 2 3 4 5
LRANGE list01 0 -1 (全取)
lpop list01
rpop list01
LIDNEX list01 4
llen list01
RPUSH list03 1 1 1 2 2 2 3 3 3 4 4 4 5 5 5
LREM list03 2 3 (删除2个3)
LPUSH list01 1 2 3 4 5 6 7 8
LTRIM list01 3 5(开始index结束index,截取指定范围的值后再赋值给key)
rpoplpush list01 list02 (list01 出栈到 list02)
lset key index value
LINSERT key before/after value1 value2
list字符串链表,left和right都可以插入添加
=====================================Set:单key多value
sadd set01 1 1 2 2 3 3
SMEMBERS set01
scard 获取集合里面的元素个数
srem key value 删除集合中的元素
srandmember key 数字(随机出几个数)
spop key 随机出栈
=====================================HasH:KV模式不变,但V是一个键值对
hset user id 11
hget user id
hset user name z3
hdel user name
HEXISTS user name
HKEYS customer (列出customer所有的key)
hvals customer (列出customer所有的value)
HINCRBY customer age 2 (age的值加2)
=====================================ZSet:在set的基础上,加一个score的值,之前的set是 k1 v1 v2 v3,现在zset是 k1 score1 v1 score2 v2 score3 v3
=====================================解析配置文件 redis.conf
设置vim的行号
:set num
四个日志级别:
debug
verbose
notice
warning
redis启动命令:
1.redis-server /myredis/redis.conf
2.redis-cli -p 6389
ping
config get requirepass
config get dir
在哪个路径下启动的,日志就在哪个路径下。
config set requirepass "123456"
auth 123456
LIMITS限制:
Maxclients
Maxmemory
Maxmemory-policy
1>Volatile-lru
2>Allkeys-lru
3>Volatile-random
4>Allkeys-random
5>Volatile-ttl 移除那些TTL最小的key,即那些最近要过期的key
6>noeviction 永不过期
Maxmemory-samples
=====================================持久化=>rdb、aof
技术敏感性
Redis会单独创建一个子进程进行持久化,会先将数据写入到一个临时文件中,待持久化过程都结束了,再用这个临时文件替换上次持久化好的文件。主进程不进行任何IO操作。如果需要进行大规模数据的恢复,且对于数据恢复的完整性不是非常敏感,那么RDB方式要比AOF方式更加的高效。RDB的缺点是最后一次持久化后的数据可能丢失。
Fork的作用是复制一个与当前进程一样的进程。
redis-server /myredis/redis.conf
redis-cli -p 6379
禁用 save ""
set 1122 1122
save
适合大规模的数据恢复
对数据完整性和一致性要求不高
=====================================aof
insert into test_table values()
set k1 100
incr k1
incr k1
incr k1
incr k1
incr k1
incr k1
redis-server /myredis/redis_aof.conf
redis-cli -p 6379
set k1 v1
set k2 v2
set k3 v3
修复aof文件:
redis-check-aof --fix appendonly.aof
打开aof
appendonly yes
appendfilename
appendfsync
Everysec
rewrite命令:
bgrewriteaof