Not only SQl: 第二代数据库架构
非关系型,非结构化,半结构化
缓存数据库:Redis(京东), Memcached, Tair(淘宝,基于Memcached二次开发), ...
文档类: MongoDB, ES
列存储(大数据类): HBASE...
图形存储: Neo4J
第三代数据库架构转型,主要是分布式架构,云平台,刚开始
例如淘宝数据库会涉及各种关系型数据库和非关系型数据库,
Memcached: 适合多用户访问,每个用户少量读写
Redis: 适合少用户访问,每个用户大量读写。并发量比较高推荐多实例的环境
vim /etc/profile # 添加以下一行 export PATH=/usr/local/redis/src:$PATH # 安装路径 # 生效配置 source /etc/profile
redis-server & redis-server /usr/local/redis/redis.conf # 启动配置文件 (base) xyp-iMac:~ xyp$ redis-cli 127.0.0.1:6379> set xyp nb OK 127.0.0.1:6379> get xyp "nb" 127.0.0.1:6379> set xyp 牛逼 OK 127.0.0.1:6379> get xyp "xe7x89x9bxe9x80xbc" 127.0.0.1:6379> quit (base) xyp-iMac:~ xyp$ redis-cli --raw # 显示中文 127.0.0.1:6379> get xyp 牛逼 127.0.0.1:6379> shutdown # 关闭 1073:M 02 Sep 2020 11:27:07.879 # User requested shutdown... 1073:M 02 Sep 2020 11:27:07.879 * Saving the final RDB snapshot before exiting. 1073:M 02 Sep 2020 11:27:07.895 * DB saved on disk 1073:M 02 Sep 2020 11:27:07.895 # Redis is now ready to exit, bye bye...
vim redis.conf bind 127.0.0.1 10.0.0.51 requirepass 123456 此时不管远程还是本地连接redis都要验证密码 方法一: redis-cli -h 10.0.0.52 -p 6379 -a 123456 # 远程连接命令 redis-cli -a 123456 # 本地连接命令 方法二: # 远程连接命令 redis-cli -h 10.0.0.52 -p 6379 auth 123456 # 本地连接命令 redis-cli auth 123456
config get * # 获取redis配置参数 config get requirepas* config set maxmemory 128M # 设置redis配置maxmemory,即时生效 config rewrite # 保存到配置文件
介绍 RDB持久化 基于时间点快照一种持久化方式,内存里所有的键值对保存在一个文件里,速度快,可做备份,会有数据丢失 AOF持久化 记录服务器执行的所有写操作命令,最大程度保证数据不丢失,日志记录量级比较大,持久化时间较长 优先使用AOF 配置持久化 RDB持久化 方法一: 127.0.0.1:6379> save OK /usr/local/redis目录下保存dump.rdb文件 方法二: 修改配置文件redis.conf,写入下列 save 900 1 # 900s内有1个更改 save 300 10 # 300s内有10个更改 save 60 1000 # 60s内有10000个更改 save bgsave:共同点都能实现RDB持久化功能 save:前台,阻塞redis正常写入,直到持久化完成。 bgsave:后台,开启子线程,异步的持久化功能,不会阻塞redis正常写入。 AOF持久化配置 修改配置文件redis.conf,写入下列 appendonly yes appdendfsync always # 要求很高 appdendfsync everysec # 要求一般,要求更低点用RDB持久化就行 总结: redis持久化方式和区别: rdb:基于快照持久化,速度更快,一般用作备份,主从复制也是依赖于rdb持久化功能 aof:以追加的方式记录redis操作日志的文件。可以最大程度保证redis数据安全,类似于mysql的binlog
mysql和redis数据同步工具canal 介绍:基于value值类型 string :字符串类型 hash :字典类型 list :列表类型 set :集合类型 sortset :有序集合 各种数据类型应用场景 string:会话缓存、计数器 计数器: 127.0.0.1:6379> incr num (integer) 1 127.0.0.1:6379> incr num (integer) 2 127.0.0.1:6379> incr num (integer) 3 127.0.0.1:6379> decr num (integer) 2 127.0.0.1:6379> decr num (integer) 1 127.0.0.1:6379> incrby num 1000 (integer) 1001 127.0.0.1:6379> decrby num 500 (integer) 501 hash:数据库缓存 127.0.0.1:6379> hmset stu_1 id 1 name zhangsan age 10 OK 127.0.0.1:6379> hmget stu_1 id name age 1) "1" 2) "zhangsan" 3) "10" mysql灌入redis通过程序实现,以下为手工模拟mysql灌入redis hash类型, 1.mysql中拼接hmset语句 select concat('hmset t1_',id,'id',id,'num',num,'k1',k1,'k2',k2) from t1 limit 1000 into outfile '/tmp/redis.txt'; 2.将数据导入redis cat /tmp/redis.txt | redis-cli -a password &>/tmp/in.log 3.检查数据 keys * # 数据量大时不行,会死机 list:微信朋友圈,即时消息展示,每次看到朋友圈都是最新消息。 127.0.0.1:6379> LPUSH list 1 (integer) 1 127.0.0.1:6379> LPUSH list 2 (integer) 2 127.0.0.1:6379> LPUSH list 3 (integer) 3 127.0.0.1:6379> lrange list 0 -1 # 0 -1下标索引 1) "3" 2) "2" 3) "1" 127.0.0.1:6379> lrange list 0 2 1) "3" 2) "2" 3) "1" 127.0.0.1:6379> lrange list 0 1 1) "3" 2) "2" set:社交类平台好友系统。共同好友,二度好友。 127.0.0.1:6379> sadd lxl pg1 oynn lqx xyp (integer) 4 127.0.0.1:6379> sadd jnl oynn xyp wyz jcw (integer) 4 127.0.0.1:6379> SUNION lxl jnl # 并集 1) "lqx" 2) "wyz" 3) "xyp" 4) "jcw" 5) "oynn" 6) "pg1" 127.0.0.1:6379> SINTER lxl jnl # 交集 1) "xyp" 2) "oynn" 127.0.0.1:6379> SDIFF jnl lxl # 差集 1) "wyz" 2) "jcw" sortset:排行榜应用 127.0.0.1:6379> zadd phb 5 thebestforyou 10 tobehappy 8 tellmeyoudooto (integer) 3 127.0.0.1:6379> ZINCRBY phb 100 thebestforyou "105" 127.0.0.1:6379> ZINCRBY phb 500 tobehappy "510" 127.0.0.1:6379> ZINCRBY phb 200 tellmeyoudooto "208" 127.0.0.1:6379> ZREVRANGE phb 0 -1 1) "tobehappy" 2) "tellmeyoudooto" 3) "thebestforyou" 127.0.0.1:6379> ZREVRANGE phb 0 -1 withscores 1) "tobehappy" 2) "510" 3) "tellmeyoudooto" 4) "208" 5) "thebestforyou" 6) "105"
介绍:为了解决在架构中,资源有效方面提供有效的协调。解决硬件冗余或者闲置。 redis消息模式:消息队列,发布订阅。 发布订阅功能: pulisher 发布者 channel 频道 subscriber 订阅者 redis客户端A订阅者: subscribe fm1039 Reading messages... (press Ctrl-C to quit) 1) "subscribe" 2) "fm1039" 3) (integer) 1 redis客户端B发布者: 127.0.0.1:6379> publish fm1039 hi (integer) 1 然后A收到订阅消息最后一行: 127.0.0.1:6379> subscribe fm1039 Reading messages... (press Ctrl-C to quit) 1) "subscribe" 2) "fm1039" 3) (integer) 1 1) "message" 2) "fm1039" 3) "hi"
redis事务基于队列实现的,redis是乐观锁机制,仅实现原子性的保证,属于弱事务支持。 mysql事务基于事务日志、悲观锁机制、MVCC、ISOLASTION等机制一起保证,强事务支持。 redis事务只是把操作放到队列中,exex执行后才成功 127.0.0.1:6379> multi OK 127.0.0.1:6379> set a 10 QUEUED 127.0.0.1:6379> set b 20 QUEUED 127.0.0.1:6379> 127.0.0.1:6379> exec 1) OK 2) OK
flushall 清空所有数据
flushdb 清空当前库
monitor 监控实时指令
shutdown 关闭服务器
......
replication
......
结合总从复制一起使用
......
......