NoSql,泛指非关系型数据库,Nosql数据库得四大分类:
非关系数据库的特点:
1.数据模型比较简单
2.需要灵活性更强的IT系统
3.对数据库性能要求较高
4.不需要高度的数据一致性
5.对于给定的key,比较容易映射复杂值得环境
持久化机制
redis是一个支持持久化的内存数据库,也就是说redis需要经常将内存中的数据同步到硬盘保证持久化.
redis持久化的两种方式;
1snapshotting(快照的方式)默认,将内存中以快照方式写入到二进制文件中。默认为dump.rdb,可以通过配置设置自动做快照的持久化方式。我们可以配置redis在n秒内如果超过m个key则修改就自动做快照
snapshotting
save 900 1 #800秒内超过一个key被修改 测快照报存
save 300 2 #300秒内如果超过十个key被修改侧快照报存
2.append-only file(缩写aop)的方式,(有点类似oracle日志)由于快照一定间隔时间做一次,所以了能发生redis意外down的情况就会丢失最后一次快照后的所有修改的数据。,aof比快照方式有更好的持久化性,是由于在使用aof时,redis会将每一个收到的写的命令通过write函数追加到命令中,当redis重新启动appendonly.aof.aof不是立即写到硬盘的。可以通过配置文件修改强制写到硬盘中。
appendonly yes #启动aof持久化方式
appendfsync always #收到命令理解写道磁盘,效率最慢,但保证完全的持久化
appendfsync everysec#每秒写入磁盘一次,在性能和持久化方面做到了很好的折中
appendfsync no 完全依赖os性能最好,持久化没保证
保证一致性
就算使用集群,也同样不能保证百分百得数据一致性,
假如在主节点挂掉得一两秒,这时从节点没有及时选举,可以会间隔一两秒,这时会产生大量数据不一致
解决方案两种
一种,代码级别处理 代码加入失败重试机制
配置项开启appendfsync always 收到得所有指令全记录日志 保证强一致性
https://www.cnblogs.com/EasonJim/p/7766738.html
技术上处理 Redis主从+KeepAlived实现高可用https://www.cnblogs.com/JeremyWYL/p/8562388.html
三种模式
主从模式
只有一台机器可写,读得时候用两个从节点
哨兵模式
哨兵节点
将他部署到一台机器上,监控这两个从节点
如果挂了,就先据,将从节点推为主节点
集群
redis均摊 将数据分布到 多个节点
redis 不是靠单点体现效果 串执行
多实例
memcache 适合单点 并执行
aof 体现可靠性 多线程并发访问,写的的能力降低了,主要是写得时候会生成一条日志
可以用ssdb 解决, ssdb写得能力很快
前端加一个Lvs+Keepalived+Nginx+Tomcat高可用集群 负载均衡 技术得角度
系统得瓶颈一定在后台,一定在数据库
mysql 主从集群 ,做一些策略
缓存主要解决得是关系型数据库降压,提高性能
String类型
set key value
setnx (not exist) 是否存在 存在不设置
setex (expired) 设置key的有效期
setange 替换字符串
setex color 10 red 设置过期时间10秒
setrange email 10 ww (标识从第十位开始替换)
高性能设计模式
主要数据存储一个对象,条件存储一个单独得key:value键值对形式,key条件类型,value 主要对象得id
例如
主要对象
user{id:1,name:张三,age:20,sex:m}
条件对象就是
取age-20可获取所有主对象年零为20得用户
age-20{id1,id2,id3}
Map
应用场景 使用map存储json
hash 用的比较多
hset myhash key value
expire 设置key过期时间
redis 安装最新版
官网 https://redis.io/download
sudo wget 下载地址
sudo tar -zxvf redis-*.tar.gz -C ./redis
sudo apt-get install gcc
sduo apt-get install make
sudo make MALLOC=libc
sudo make install
reids 集群搭建(3.0才有集群,5.0以后抛弃了ruby)
prot 700*
bind 127.0.0.1(外网访问需要指定外网地址)
dir /usr/local/redis-cluster/700*/(指定数据文件存放位置,必须指定不同的目录,不然会丢失数据)
cluster-enabled yes(启动集群模式)
cluster-config-file nodes700*.conf(这里700x最好和prot对应上)
cluster-node-timeout 5000
appendonly yes
将文件放入各个目录下(7001/redis.conf,7002/redis.conf)
#5.0 以上跳过
apt-get install ruby
apt-get isntall rubygems
gem install redis(安装reis和ruby接口)
启动redis
redis-server 700*/redis.conf(伪代码)
查看是否启动
ps -ef|grep redis
创建集群(集群是通过ruby实现管理的).
3.0到5.0
./redis-trib.rb create --replicas 1 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 127.0.0.1:7006
5.0以上不需要ruby了
--cluster-replicas 2 表示一主两从
redis-cli --cluster create 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 127.0.0.1:7006 --cluster-replicas 2
集群启动脚本 脚本放在 700*文件夹同级
echo '123456' | sudo -S ls
#kill
sudo killall redis-server
sudo rm -rf /usr/local/redis-cluster/*/node*.conf
sudo rm -rf /usr/local/redis-cluster/*/appendonly.aof
sudo rm -rf /usr/local/redis-cluster/*/dump.rdb
#start
sudo redis-server /usr/local/redis-cluster/7001/redis.conf
sudo redis-server /usr/local/redis-cluster/7002/redis.conf
sudo redis-server /usr/local/redis-cluster/7003/redis.conf
sudo redis-server /usr/local/redis-cluster/7004/redis.conf
sudo redis-server /usr/local/redis-cluster/7005/redis.conf
sudo redis-server /usr/local/redis-cluster/7006/redis.conf
#create
sudo redis-cli --cluster create 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 127.0.0.1:7006 --cluster-replicas 1
三、集群客户端命令(redis-cli -c -p port)
集群
cluster info :打印集群的信息
cluster nodes :列出集群当前已知的所有节点( node),以及这些节点的相关信息。
节点
cluster meet :将 ip 和 port 所指定的节点添加到集群当中,让它成为集群的一份子。
cluster forget :从集群中移除 node_id 指定的节点。
cluster replicate :将当前节点设置为 node_id 指定的节点的从节点。
cluster saveconfig :将节点的配置文件保存到硬盘里面。
槽(slot)
cluster addslots [slot ...] :将一个或多个槽( slot)指派( assign)给当前节点。
cluster delslots [slot ...] :移除一个或多个槽对当前节点的指派。
cluster flushslots :移除指派给当前节点的所有槽,让当前节点变成一个没有指派任何槽的节点。
cluster setslot node :将槽 slot 指派给 node_id 指定的节点,如果槽已经指派给
另一个节点,那么先让另一个节点删除该槽>,然后再进行指派。
cluster setslot migrating :将本节点的槽 slot 迁移到 node_id 指定的节点中。
cluster setslot importing :从 node_id 指定的节点中导入槽 slot 到本节点。
cluster setslot stable :取消对槽 slot 的导入( import)或者迁移( migrate)。
键
cluster keyslot :计算键 key 应该被放置在哪个槽上。
cluster countkeysinslot :返回槽 slot 目前包含的键值对数量。
cluster getkeysinslot :返回 count 个 slot 槽中的键