NoSQL

Not only SQl:    第二代数据库架构
非关系型,非结构化,半结构化
    缓存数据库:Redis(京东), Memcached, Tair(淘宝,基于Memcached二次开发), ...
    文档类:    MongoDB, ES
    列存储(大数据类):    HBASE...
    图形存储: Neo4J
NoSQL(key-value)
第三代数据库架构转型,主要是分布式架构,云平台,刚开始
例如淘宝数据库会涉及各种关系型数据库和非关系型数据库,
NewSQL
Memcached: 适合多用户访问,每个用户少量读写 
Redis: 适合少用户访问,每个用户大量读写。并发量比较高推荐多实例的环境
Memcached、Redis
vim /etc/profile
# 添加以下一行
export PATH=/usr/local/redis/src:$PATH    # 安装路径
# 生效配置
source /etc/profile
redis环境变量
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...
redis启动
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
redis远程连接
config get *    # 获取redis配置参数

config get requirepas*

config set maxmemory 128M    # 设置redis配置maxmemory,即时生效

config rewrite    # 保存到配置文件
redis设置参数
介绍
    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
redis持久化(内存数据保存到磁盘)
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的多数据类型支持
介绍:为了解决在架构中,资源有效方面提供有效的协调。解决硬件冗余或者闲置。
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事务基于队列实现的,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
redis事务
flushall    清空所有数据
flushdb        清空当前库
monitor        监控实时指令
shutdown    关闭服务器
......    
redis服务管理命令
replication
......
redis主从复制
结合总从复制一起使用
......
redis sentinel高可用集群应用
......
redis Cluster分布式集群
原文地址:https://www.cnblogs.com/xuyaping/p/14040730.html