• 【网络服务&数据库教程】12 NoSQL 数据库


    1 什么是NoSQL

    NoSQL(NoSQL =Not Only SQL ),意为反SQL运动,是一项全新的数据库革命性运动,2000年前就有人提出,发展至2009年趋势越发高涨。它是指运用非关系型的数据存储,相对于铺天盖地的关系型数据库运用,这一概念无疑是一种全新的思维的注入。

    随着互联网web2.0网站的兴起,传统的关系数据库在应付web2.0网站,特别是超大规模和高并发的SNS类型的web2.0纯动态网站已经显得力不从心,暴露了很多难以克服的问题,而非关系型的数据库则由于其本身的特点得到了非常迅速的发展.NoSQL数据库的产生就是为了解决大规模数据集合多重数据种类带来的挑战,尤其是大数据应用难题。

    分类Examples举例经典应用场景数据模型优点
    键值(key-value)Tokyo、Cabinet / Tyrant、RedisVoldemort、Oracle BDB内容缓存,主要用于处理大量数据的高访问负载,也用于一些日志系统等等Key 指向Value的键值对,通常用hash table 实现查找速度快
    列存储数据库Cassandra、HBase、Riak分布式的文件系统以列簇式存储,将同一列数据存在-起查找速度快,可扩展性强,更容易进行分布式扩展
    文档型数据库CouchDB、MongoDBWeb应用(与Key-Value类似,Value是结构化的,不同的是数据库能够了解 Value的内容)Key-Value 对应的键值对,Value为结构化数据。数据结构要求不严格,表结构可变,不需要像关系型数据库一样需要预先定义表结构。
    图形(Graph)数据厍Neo4J,InfoGrid,Infinite Graph社交网络,推荐系统等。专注于构建关系图消图结构利用图结构相关算法。比如最短路径寻址,N度关系查找等。

    2 NoSQL 的特性?

    NoSQL是key-value 形式存储,和传统的关系型数据库不一样,不一定遵循传统数据库的一些基本要求,比如说遵循SQL标准、ACID属性、表结构等等。

    这类数据库主要有以下特点:

    • 非关系型的、分布式、开源的、水平可扩展的
    • 处理超大量数据。
    • 击碎了性能瓶颈
    • 对数据高并发读写
    • 对海量数据的高效率存储和访问
    • 对数据的高扩展性和高可用性

    3 什么是Redis?

    Redis 是一个开源的,先进的 key-value存储。它通常被称为数据结构服务器,因为键可以包含string(字符串)、hash(哈希)、list(链表)、set(集合)和zset(sorted-set–有序集合)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作。

    Redis 和 Memcached类似,它支持存储的value类型相对更多,与memcached一样,为了保证效率,数据都是缓存在内存中,区别是Redis 会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。

    img

    4 Redis 的安装部署

    imgimg

    Redis的官方网站是:http://redis.io

    下载安装包:

    yum install -y gcc* make
    wget https://download.redis.io/releases/redis-6.2.6.tar.gz
    wget https://download.redis.io/releases/redis-2.8.6.tar.gz
    
    • 1
    • 2
    • 3

    编译安装:

    ~ tar -xvf redis-6.2.6.tar.gz
    ~ cd redis-6.2.6/
    ~ make
    ~ make PREFIX=/usr/local/redis install
    #指定安装位置,如果没有指定安装位置 PREFIX=/usr/local/redis,则make install 会把redis安装到/usr/local/bin/目录下
    ~ mkdir -pv /usr/local/redis/etc
    ~ cp ./redis.conf /usr/local/redis/etc
    #复制Redis的配置文件到/usr/local/redis/etc下,方便于管理
    
    #修改配置文件
    ~ vim /usr/local/redis/etc/redis.conf
    daemonize no #修改为 yes,后台启动
    
    #启动服务
    ~ ln -s /usr/local/redis/bin/* /usr/bin/
    #/usr/local/redis/bin/redis-server [配置文件]
    ~ redis-server /usr/local/redis/etc/redis.conf
    #必须指定配置文件位置,否则会提示警告
    ~ netstat -ntlp | grep 6379
    
    #客户端连接
    ~ redis-cli
    #-h IP			:连接指定的Redis服务器
    #-p 6379		:指定Redis服务器的端口,默认6379端口
    #-a 密码		 :使用密码登录
    #-n 数据库号:指定连接哪个数据库
    #--raw			 :Redis支持存储中文
    
    #停止Redis
    ~ redis-cli shutdown
    或者
    ~ pkill -9 redis
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32

    img

    5 Redis 常用命令

    #开启Redis服务
    redis-server /usr/local/redis/etc/redis.conf
    
    • 1
    • 2

    1)String 类型及操作

    string 是最简单的类型,一个key对应一个value,string类型是二进制安全的。redis的 string可以包含任何数据。

    1. set:设置key对应的值为string 类型

    例如:我们添加一个name=atguigu的键值对应。

    redis-cli

    127.0.0.1:6379>set name atguiguu

    1. setnx:设置 key对应的值为string 类型,如果 key已经存在,返回0,nx是 not exist的意思。

    2. get:获取key 对应的 string 值,如果key不存在返回nil

    3. mset & mget:同时设置和获取多个键值对

    4. incrby:对key的值做加加(指定值)操作,并返回新的值。

    5. del:删除一个已创建的key

    范例:

    ~ redis-cli
    127.0.0.1:6379> set name zhongzhiwei
    OK
    127.0.0.1:6379> get name
    "zhongzhiwei"
    127.0.0.1:6379> set name zhangsan
    OK
    127.0.0.1:6379> get name
    "zhangsan"
    127.0.0.1:6379> setnx name lisi
    (integer) 0
    127.0.0.1:6379> get name
    "zhangsan"
    
    127.0.0.1:6379> mset age 18 sex man
    OK
    127.0.0.1:6379> mget age sex
    1) "18"
    2) "man"
    
    127.0.0.1:6379> incrby age 2
    (integer) 20
    127.0.0.1:6379> mget age
    1) "20"
    127.0.0.1:6379> incrby age -2
    (integer) 18
    127.0.0.1:6379> mget age
    1) "18"
    
    127.0.0.1:6379> keys *
    1) "name"
    2) "sex"
    3) "age"
    127.0.0.1:6379> del age
    (integer) 1
    127.0.0.1:6379> keys *
    1) "name"
    2) "sex"
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38

    2)hash类型及操作

    Redis hash是一个string 类型的 field(字段)和 value 的映射表,它的添加、删除操作都是0(1)平均;hash特别适合用于存储对象,相较于将对象的每个字段存成单个string类型,将一个对象存储在 hash类型中会占用更少的内存,并且可以更方便的存取整个对象。

    1. hset:设置hash field为指定值,如果key不存在,则先创建。·例如:为num1表创建一个叫name字段(key),键值是zhongzw

    redis127.0.0.1:6379>hset tnuml name zhongzw

    img

    1. hget、hmset、hmget意义同上近似

    2. hdel :删除制定表中的某一个键值对

    3. hgetall:列出表中的所有键值对,

    范例:

    127.0.0.1:6379> hset a1 name zhangsan
    (integer) 1
    127.0.0.1:6379> hset a1 sex man
    (integer) 1
    127.0.0.1:6379> hset a2 name laow
    (integer) 1
    127.0.0.1:6379> hset a2 age 20
    (integer) 1
    127.0.0.1:6379> hget a1 name
    "zhangsan"
    127.0.0.1:6379> hmget a1 name sex
    1) "zhangsan"
    2) "man"
    
    127.0.0.1:6379> hgetall a1
    1) "name"
    2) "zhangsan"
    3) "sex"
    4) "man"
    
    127.0.0.1:6379> hdel a2 name
    (integer) 1
    127.0.0.1:6379> hgetall a2
    1) "age"
    2) "20"
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    3)list 类型及操作

    list是一个链表结构,主要功能是push、pop、获取一个范围内的所有值等等,操作中 key理解为链表的名字。Redis 的 list类型其实就是一个每个子元素都是string类型的双向链表。我们可以通过push、pop 操作从链表的头部或尾部添加删除元素。

    img

    1. Ipush:在 key对应 list的头部添加字符串元素。

    redis127.0.0.1:6379> lpush zhangsan zhangsan

    redis127.0.0.1:6379> lpush zhangsan 18

    1. lrange:从指定链表中获取指定范围的元素

    redis127.0.0.1:6379>lrange zhangsan 0 -1

    0 -1:此范围代表全部元素,意为从头到尾

    1. lpush、rpush、lpop、rpop、lrange详见图示,

    img

    范例:

    127.0.0.1:6379> LPUSH zhangsan 18
    (integer) 1
    127.0.0.1:6379> LPUSH zhangsan zhangsan
    (integer) 2
    127.0.0.1:6379> LPUSH zhangsan man
    (integer) 3
    
    #0到-1取所有
    LRANGE zhangsan 0 -1
    1) "man"
    2) "zhangsan"
    3) "18"
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    4)Set 类型及操作

    set 是集合,他是 string 类型的无序集合。Set是通过 hash table实现的,对集合我们可以取并集、交集、差集。通过这些操作我们可以实现社交网站中的好友推荐和 blog 的 tag 功能。集合不允许有重复值。【合集一般很少使用,因为一个集合当中不允许有重复的数值】

    img

    1. sadd:添加一个或多个元素到集合中

    redis127.0.0.1:6379> sadd mset 1 2 3 4

    1. smembers:获取集合里面所有的元素

    redis127.0.0.1:6379> smembers mset

    1. srem:从集合中删除指定的一个或多个元素
    2. spop:随机从集合中删除一个元素,并返回
    3. scard:获取集合里面的元素个数
    4. sdiff:返回集合1与集合2的差集。以集合1为主

    redis127.0.0.1:6379>sdiff mset1 mset2 .

    1. sinter:获得两个集合的交集
    2. sunion:获得指定集合的并集

    范例:

    127.0.0.1:6379> SADD mset 1 2 3 4 5 6
    (integer) 6
    127.0.0.1:6379> SMEMBERS mset
    1) "1"
    2) "2"
    3) "3"
    4) "4"
    5) "5"
    6) "6"
    
    127.0.0.1:6379> SREM mset 2 4 6
    (integer) 3
    127.0.0.1:6379> SMEMBERS mset
    1) "1"
    2) "3"
    3) "5"
    
    127.0.0.1:6379> SPOP mset
    "1"
    127.0.0.1:6379> SMEMBERS mset
    1) "3"
    2) "5"
    
    127.0.0.1:6379> SCARD mset
    (integer) 2
    
    127.0.0.1:6379> SADD mset2 1 2 3 4 5 6
    (integer) 6
    127.0.0.1:6379> SINTER mset mset2
    1) "3"
    2) "5"
    127.0.0.1:6379> SUNION mset mset2
    1) "1"
    2) "2"
    3) "3"
    4) "4"
    5) "5"
    6) "6"
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38

    5)Zset 类型及操作

    zset是 set的一个升级版本,它在set的基础上增加了一个顺序属性,这一属性在添加修改元素的时候可以指定,每次指定后,zset 会自动重新按新的值调整顺序。可以理解为有两列的mysql表,一列存的value,一列存的顺序。操作中 key理解为zset的名字。

    img

    1. zadd:向一个指定的有序集合中添加元素,每一个元素会对应的有一个分数你可以指定多个分数 / 成员组合。如果一个指定的成员已经在对应的有序集合中了,那么其分数就会被更新成最新的,并且该成员会重新调整到正确的位置,以确保集合有序。分数的值必须是一个表示数字的字符串。

    redis127.0.0.1:6379> zadd zset 2 zhangsan 1 lisi 1 wangwu

    1. zrange:返回有序集合中,指定区间内的成员。其中成员按照score(分数)值从小到大排序。具有相同score值的成员按照字典顺序来排列。

    redis127.0.0.1:6379> zrange zset 0 -1 withscores

    注意: withscores返回集合中元素的同时,返回其分数(score)

    1. zrem:删除有序集合中指定的值

    redis127.0.0.1:6379> zrem zset zhangsan

    1. zcard:返回有序集合元素的个数

    范例:

    127.0.0.1:6379> ZADD zset 2 zhangsan 1 lisi 1 wangwu
    (integer) 3
    
    127.0.0.1:6379> ZRANGE zset 0 -1 withscores
    1) "lisi"
    2) "1"
    3) "wangwu"
    4) "1"
    5) "zhangsan"
    6) "2"
    
    127.0.0.1:6379> ZCARD zset
    (integer) 3
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    6)其他相关命令

    1. keys:按照键名查找指定的键。支持通配符(*?等)

    redis127.0.0.1:6379>keys h*llo

    1. exists:确认一个键是否存在(1表示存在)
    2. del:删除一个键(通用)。
    3. expire:设置一个键(已存在)的过期时间,如果键已经过期,将会被自动删除,
    4. ttl:以秒为单位,返回指定键的剩余有效时间,
    • 当key不存在时,返回-2。
    • 当key存在但没有设置剩余生存时间时,返回-1 。
    • 否则,以秒为单位,返回key的剩余生存时间。
    1. select:选择一个数据库,默认连接的数据库是0,可以支持共16个数据库。在配置文件中,通过databases 16关键字定义。类似于MySQL的(use 数据库)
    2. move:将当前数据库的键移动到指定的数据库中
    3. type:返回键的类型。
    4. dbsize:返回当前库中键的数量(所有类型)
    5. save:保存所有的数据。很少在生产环境直接使用SAVE命令,因为它会阻塞所有的客户端的请求,可以使用BGSAVE命令代替.如果在BGSAVE命令的保存数据的子进程发生错误的时,用SAVE命令保存最新的数据是最后的手段。
    6. info:获取服务器的详细信息。
    7. config get:获取redis服务器配置文件中的参数。支持通配符
    8. flushdb:删除当前数据库中所有的数据
    9. flushall:删除所有数据库中的所有数据

    范例:

    127.0.0.1:6379> KEYS *
    1) "zhangsan"
    2) "mset"
    3) "mset2"
    4) "zset"
    5) "a1"
    127.0.0.1:6379> KEYS m*
    1) "mset"
    2) "mset2"
    
    127.0.0.1:6379> EXISTS name
    (integer) 0
    127.0.0.1:6379> EXISTS a1
    (integer) 1
    
    127.0.0.1:6379> SET name zhangsan
    OK
    #没有设置剩余生存时间时,返回-1 
    127.0.0.1:6379> TTL name
    (integer) -1
    127.0.0.1:6379> EXPIRE name 30
    (integer) 1
    127.0.0.1:6379> TTL name
    (integer) 20
    #当key不存在时,返回-2
    127.0.0.1:6379> TTL name
    (integer) -2
    
    127.0.0.1:6379[1]> SELECT 0
    OK
    127.0.0.1:6379> MOVE mset 1
    (integer) 1
    127.0.0.1:6379> SELECT 1
    OK
    127.0.0.1:6379[1]> KEYS *
    1) "mset"
    127.0.0.1:6379[1]> TYPE mset
    set
    
    127.0.0.1:6379[1]> select 0
    OK
    127.0.0.1:6379> DBSIZE
    (integer) 4
    
    127.0.0.1:6379> INFO
    
    127.0.0.1:6379> CONFIG GET *
    #删除当前数据库中所有的数据
    127.0.0.1:6379> FLUSHDB
    OK
    127.0.0.1:6379> KEYS *
    (empty array)
    127.0.0.1:6379> SELECT 1
    OK
    127.0.0.1:6379[1]> KEYS *
    1) "mset"
    #flushall:删除所有数据库中的所有数据
    127.0.0.1:6379[1]> FLUSHALL
    OK
    127.0.0.1:6379[1]> KEYS *
    (empty array)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61

    6 Redis 高级应用

    1)密码保护

    给redis服务器设置密码1、修改配置文件,

    vi /usr/local/redis/etc/redis.conf
    requirepass 123456
    
    • 1
    • 2

    2、重启redis

    pkill redis
    .../bin/redis-server .../etc/redis.conf
    #或者
    redis-cli shutdown
    redis-server /usr/local/redis/etc/redis.conf
    
    • 1
    • 2
    • 3
    • 4
    • 5

    3、客户端登录

    .../bin/redis-cli -a 123456
    
    • 1

    或 交互模式下使用【auth密码】命令

    范例:密码保护

    ~ redis-cli
    127.0.0.1:6379> SET name haha
    (error) NOAUTH Authentication required.
    127.0.0.1:6379> AUTH 123456
    OK
    127.0.0.1:6379> SET name haha
    OK
    127.0.0.1:6379>
    
    ~ redis-cli -a 123456
    Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
    127.0.0.1:6379> SET name hehe
    OK
    127.0.0.1:6379> GET name
    "hehe"
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    img

    2)主从同步

    Redis主从复制过程:

    • Slave 与 master建立连接,发送sync同步命令
    • Master 会启动一个后台进程,将数据库快照保存到文件中,同时master主进程会开始收集新的写命令并缓存。
    • 后台完成保存后,就将此文件发送给slave.Slave将此文件保存到硬盘上
    1. 主服务器给自己设置好密码即可( iptables & SELinux关闭 )
    2. 从服务器修改配置文件,用来连接主服务器,

    老版本:

    从:

    slaveof #主服务器的I和端口

    masterauth #主服务器的密码(主服务器要设置好密码)

    新版本Redis 5.*以上:

    主:

    找到bind 127.0.0.1注释掉,或者修改为本机的IP地址(重启)

    从:

    replicaof #主服务器的IP和端口

    masterauth #主服务器的密码(主服务器要设置好密码)

    1. 重启从服务器,然后测试(可通过 info命令获取当前服务器身份类型)

    范例:主从同步

    #需要两台机器110,111安装Redis6.2.6版本
    #110已经安装Redis完成
    110~ vim /usr/local/redis/etc/redis.conf
    bind 10.0.0.110 -::1
    appendonly yes
    
    #111与110安装类似,配置文件需要修改
    111~ wget https://download.redis.io/releases/redis-6.2.6.tar.gz
    111~ tar -xvf redis-6.2.6.tar.gz
    111~ cd redis-6.2.6/
    111~ make && make PREFIX=/usr/local/redis install
    #指定安装位置,如果没有指定安装位置 PREFIX=/usr/local/redis,则make install 会把redis安装到/usr/local/bin/目录下
    111~ mkdir -pv /usr/local/redis/etc
    111~ cp ./redis.conf /usr/local/redis/etc
    #复制Redis的配置文件到/usr/local/redis/etc下,方便于管理
    
    #修改配置文件
    111~ vim /usr/local/redis/etc/redis.conf
    daemonize no #修改为 yes,后台启动
    #replicaof  
    replicaof 10.0.0.110 6379
    #masterauth 
    masterauth 123456
    
    
    #启动服务
    111~ ln -s /usr/local/redis/bin/* /usr/bin/
    #/usr/local/redis/bin/redis-server [配置文件]
    111~ redis-server /usr/local/redis/etc/redis.conf
    #必须指定配置文件位置,否则会提示警告
    111~ netstat -ntlp | grep 6379
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31

    范例:验证

    110~ 127.0.0.1:6379> SET name zhangsan
    OK
    
    111~ redis-cli
    127.0.0.1:6379> KEYS *
    1) "name"
    127.0.0.1:6379> GET name
    "zhangsan"
    
    127.0.0.1:6379> INFO
    # Replication
    role:slave
    master_host:10.0.0.110
    master_port:6379
    master_link_status:up
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    3)数据持久化

    Redis是一个支持持久化的内存数据库,也就是说需要经常将内存中的数据同步到硬盘来保证持久化。

    snapshotting(快照)-- 默认方式

    RDB持久化方式能够在指定的时间间隔能对你的数据进行快照存储。是默认的持久化方式。这种方式是将内存中数据以快照的方式写入到二进制文件中,默认的文件名为dump.rdb。这种持久化方式被称为快照snapshotting(快照)。

    #过了900秒并且有1个key发生了改变就会触发save动作。

    #过了300秒并且有10个key '发生了改变就会触发save动作。

    #过了60秒并且至少有10000个key发生了改变也会触发save动作。

    结论:在redis.conf文件中 dir .!定义了数据库文件的存放位置,默认是当前目录。所以每次重启redis服务所在的位置不同,将会生成新的dump.rdb文件;建议服务器搭建完成时先修改快照文件保存位置。

    范例:

    110~ mkdir -pv /usr/loca/redis/datadir
    110~ vim /usr/local/redis/etc/redis.conf
    dbfilename dump.rdb
    dir /usr/loca/redis/datadir
    
    • 1
    • 2
    • 3
    • 4

    append-only file(缩写AOF)

    使用AOF 会让你的Redis更加耐久:你可以使用不同的持久化策略:每次写的时候备份、每秒备份、无备份。使用默认的每秒备份策略,Redis 的性能依然很好(备份是由后台线程进行处理的,主线程会尽力处理客户端请求),一旦出现故障,你最多丢失1秒的数据。

    打开redis.conf配置文件开启AOF持久化

    ~ vim /usr/local/redis/etc/redis.conf
    #默认不使用AOF持久化(450行)将no改成yes。
    appendonly no
    ###
    #有写操作,就马上写入磁盘。效率最慢,但是最安全
    appendfsync always
    #默认,每秒钟写入磁盘一次。
    appendfsync everysec
    ###
    #不进行AOF备份,将数据交给操作系统处理。最快,最不安全,
    appendfsync no
    #可以使用 cat 查看
    
    ~ redis-cli -a 123456 shutdown
    ~ redis-server /usr/local/redis/etc/redis.conf
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    测试:重启redis服务,登录client添加一个键值,退出然后ls命令查看下是否生成appendonly.aof

    ~ redis-cli -a 123456
    127.0.0.1:6379> SET password 123456
    OK
    127.0.0.1:6379> SET max man
    OK
    ~ cd /usr/local/redis/datadir/
    ~ ls
    appendonly.aof  dump.rdb
    ~ cat appendonly.aof
    *2
    $6
    SELECT
    $1
    0
    *3
    $3
    SET
    $8
    password
    $6
    123456
    *3
    $3
    SET
    $3
    max
    $3
    man
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28

    7 MySQL + NoSQL(Redis)

    1.安装gcc*

    mkdir -pv /mnt/cdrom
    mount /dev/sr0 /mnt/cdrom
    cat > /etc/yum.repos.d/CentOS-ISO.repo <<EOF
    [CentOS-ISO]
    name=CentOS-ISO
    baseurl=file:///mnt/cdrom
    enabled=1
    gpgcheck=0
    EOF
    yum install -y gcc*
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    2.环境初始化

    2.1 搭建LNMP环境

    环境准备:

    一台 RockyLinux | CentOS 7 最小化安装

    禁用SELinux ,禁用防火墙

    配置 yum 源(阿里源 & 清华源)

    1. 安装相关包
    #LNMP服务器
    yum install -y nginx php-fpm php-json php-mysqlnd mariadb-server
    yum install -y php-devel
    #数据库服务器
    yum install -y mariadb-server
    
    • 1
    • 2
    • 3
    • 4
    • 5
    1. 准备 wordress 文件和设置权限
    wget https://cn.wordpress.org/latest-zh_CN.tar.gz
    tar -xvf latest-zh_CN.tar.gz
    mv wordpress/* /usr/share/nginx/html
    #避免在后续上传资源会报错
    chown -R nginx:nginx /usr/share/nginx/html/
    
    • 1
    • 2
    • 3
    • 4
    • 5
    1. 配置 nginx 服务
    vim /etc/nginx/nginx.conf
    ......
            location / {
                index index.php;
            }
            location ~ \.php$ {
                root            /usr/share/nginx/html;
                fastcgi_pass    127.0.0.1:9000;
                fastcgi_index   index.php;
                fastcgi_param   SCRIPT_FILENAME $document_root$fastcgi_script_name;
                include         fastcgi_params;
            }
    ......
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    1. 配置 php-fpm 服务
    vim /etc/php-fpm.d/www.conf
    ......
    user = nginx
    group = nginx
    ......
    listen = 0.0.0.0:9000
    ##listen = /run/php-fpm/www.sock 可以使用的套接字
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    1. 启动相关服务
    ~ systemctl enable --now nginx php-fpm
    #查看服务是否启动
    #确保nginx , php-fpm 服务成功启动
    ~ systemctl is-active nginx php-fpm
    active
    active
    #查看服务端口
    #查看是否打开相应的端口
    ~ ss -tunlp
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    1. 准备数据库和用户及权限
    #数据库服务器
    ~ systemctl enable --now mariadb
    #systemctl start mariadb ; systemctl enable mariadb
    
    #数据库加固
    ~ mysql_secure_installation
    Set root password? [Y/n] y
    New password: 123456
    Re-enter new password: 123456
    
    Remove anonymous users? [Y/n] y
    Disallow root login remotely? [Y/n] y
    Remove test database and access to it? [Y/n] y
    Reload privilege tables now? [Y/n] y
    
    ~ mysql -uroot -p123456
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    2.2 安装Redis环境

    #!/bin/bash
    #REDIS_VERSION="6.2.6"
    REDIS_VERSION="2.8.6"
    DIR="/usr/local/redis"
    CONFIG="/usr/local/redis/etc"
    yum install -y gcc* make
    
    wget https://download.redis.io/releases/redis-${REDIS_VERSION}.tar.gz
    tar -xvf redis-${REDIS_VERSION}.tar.gz &> /dev/null && rm -rf redis-${REDIS_VERSION}.tar.gz
    
    cd redis-${REDIS_VERSION}/
    make -j 2 && make PREFIX=$DIR install
    mkdir -pv $CONFIG && cp ./redis.conf /usr/local/redis/etc
    
    sed -i.bak -r '/^daemonize/c\daemonize yes' /usr/local/redis/etc/redis.conf
    ln -s /usr/local/redis/bin/* /usr/bin/
    
    redis-server /usr/local/redis/etc/redis.conf
    
    netstat -ntlp | grep 6379
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    3.配置网站

    a.配置网站nginx,并启动nginx

    ~ vim /etc/nginx/nginx.conf
    #主配置文件中没有server区域,需要到这里去
    #大概36行左右
    include /etc/nginx/conf.d/*.conf
    
    
    #以下步骤可不做
    ~ vim /etc/nginx/conf.d/default.conf
    server {
        listen 80;
        #域名
        server_name www.kubesphere.com;
        
        location / {
            #root         /usr/share/nginx/html;
            #网站页面的位置
            root 				 /www;
            #添加一个支持php的功能
            index 			 index.php index.html index.htm;
        }
        
        error_page 500 502 503 504 /50x.html;
        location = /50x.html {
            root         /usr/share/nginx/html;
        }
        location ~ \.php$ {
                root            /www;
                fastcgi_pass    127.0.0.1:9000;
                fastcgi_index   index.php;
                fastcgi_param   SCRIPT_FILENAME /www$fastcgi_script_name;
                include         fastcgi_params;
        }
    }
    
    ~ systemctl restart nginx
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35

    b.vim /etc/php-fpm.d/www.conf

    ~ vim /etc/php-fpm.d/www.conf
    user = nginx
    group = nginx
    
    • 1
    • 2
    • 3

    4.启动php和数据库

    ~ systemctl enable --now nginx php-fpm
    #查看服务是否启动
    #确保nginx , php-fpm 服务成功启动
    ~ systemctl is-active nginx php-fpm
    
    • 1
    • 2
    • 3
    • 4

    img

    5.授权,使得登录数据库时使用"123456"密码

    #数据库服务器
    ~ systemctl enable --now mariadb
    #systemctl start mariadb ; systemctl enable mariadb
    
    #数据库加固
    ~ mysql_secure_installation
    Set root password? [Y/n] y
    New password: 123456
    Re-enter new password: 123456
    
    Remove anonymous users? [Y/n] y
    Disallow root login remotely? [Y/n] y
    Remove test database and access to it? [Y/n] y
    Reload privilege tables now? [Y/n] y
    
    ~ mysql -uroot -p123456
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    img

    img

    6.测试网站和php的连通性

    #mkdir -pv /www
    cat > /usr/share/nginx/html/index.php <<EOF
    
    EOF
    systemctl restart nginx
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    img

    以上搭建了一个LNMP环境

    7.安装 Redis

    注意:之前脚本安装Redis完成,该步可不做!!!

    Redis的官方网站是:http://redis.io

    下载安装包:

    yum install -y gcc* make
    wget https://download.redis.io/releases/redis-6.2.6.tar.gz
    wget https://download.redis.io/releases/redis-2.8.6.tar.gz
    
    • 1
    • 2
    • 3

    编译安装:

    ~ tar -xvf redis-6.2.6.tar.gz
    ~ cd redis-6.2.6/
    ~ make
    ~ make PREFIX=/usr/local/redis install
    #指定安装位置,如果没有指定安装位置 PREFIX=/usr/local/redis,则make install 会把redis安装到/usr/local/bin/目录下
    ~ mkdir -pv /usr/local/redis/etc
    ~ cp ./redis.conf /usr/local/redis/etc
    #复制Redis的配置文件到/usr/local/redis/etc下,方便于管理
    
    #修改配置文件
    ~ vim /usr/local/redis/etc/redis.conf
    daemonize no #修改为 yes,后台启动
    
    #启动服务
    ~ ln -s /usr/local/redis/bin/* /usr/bin/
    #/usr/local/redis/bin/redis-server [配置文件]
    ~ redis-server /usr/local/redis/etc/redis.conf
    #必须指定配置文件位置,否则会提示警告
    ~ netstat -ntlp | grep 6379
    
    #客户端连接
    ~ redis-cli
    #-h IP			:连接指定的Redis服务器
    #-p 6379		:指定Redis服务器的端口,默认6379端口
    #-a 密码		 :使用密码登录
    #-n 数据库号:指定连接哪个数据库
    #--raw			 :Redis支持存储中文
    
    #停止Redis
    ~ redis-cli shutdown
    或者
    ~ pkill -9 redis
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32

    img

    8.安装提供php和redis联系的软件

    phpredis-master.tar.gz下载:https://pan.baidu.com/s/1i37R8TB

    a.解压

    tar -xvf phpredis-master.tar.gz
    yum install -y php-devel
    
    • 1
    • 2

    b.安装

    cd phpredis-master/
    phpize
    ./configure --with-php-config=/usr/bin/php-config
    make -j 2 && make install
    
    #查看php模块
    ll /usr/lib64/php/modules/
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    c.让php支持Redis

    #在php主配置文件中添加redis.so
    ~ vim /etc/php.ini
    #跳转到文件的最后一行
    extension=redis.so
    
    ~ systemctl restart php-fpm.service
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    img

    img

    9.进入mysql插入数据

    ~ mysql -uroot -p123456
    MariaDB [(none)]> CREATE DATABASE mytest;
    Query OK, 1 row affected (0.00 sec)
    
    MariaDB [(none)]> USE mytest;
    Database changed
    
    MariaDB [mytest]> CREATE TABLE test (
        id INT NOT NULL AUTO_INCREMENT,
        name CHAR(20) DEFAULT NULL,
        PRIMARY KEY(id)
    ) ENGINE=innodb AUTO_INCREMENT=10 DEFAULT CHARSET=utf8;
    
    MariaDB [mytest]> DESC test;
    +-------+----------+------+-----+---------+----------------+
    | Field | Type     | Null | Key | Default | Extra          |
    +-------+----------+------+-----+---------+----------------+
    | id    | int(11)  | NO   | PRI | NULL    | auto_increment |
    | name  | char(20) | YES  |     | NULL    |                |
    +-------+----------+------+-----+---------+----------------+
    2 rows in set (0.00 sec)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    img

    MariaDB [mytest]> INSERT INTO test VALUES (1,'a1'),(2,'a2'),(3,'a3'),(4,'a4'),(5,'a5');
    Query OK, 5 rows affected (0.00 sec)
    Records: 5  Duplicates: 0  Warnings: 0
    
    MariaDB [mytest]> SELECT * FROM test;
    +----+------+
    | id | name |
    +----+------+
    |  1 | a1   |
    |  2 | a2   |
    |  3 | a3   |
    |  4 | a4   |
    |  5 | a5   |
    +----+------+
    5 rows in set (0.00 sec)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    img

    10.开启Redis,并编写脚本

    Redis的服务启动,已在之前脚本执行时开启了。该步可不做。

    ~ vim php-redis.php
    <?php
            $redis = new redis();
            $redis->connect('127.0.0.1',6379) or die ("redis not found");
            $query = "select * from test limit 4";
            for ($key=1;$key<5;$key++)
            {
                    if (!$redis->get($key))
                    {
                        $connect = mysql_connect('127.0.0.1','root','123456');
                        mysql_select_db(mytest);
                        $result = mysql_query($query);
                        while ($row = mysql_fetch_assoc($result))
                        {
                            $redis->set($row['id'],$row['name']);
                        }
                        $myserver = 'mysql';
                        break;
                    }
                    else
                    {
                        $myserver = "redis";
                        $data[$key] = $redis->get($key);
                    }
            }
            echo $myserver;
            echo "
    "
    ; for ($key=1;$key<5;$key++) { echo "number is $key"; echo "
    "
    ; echo "name is $data[$key]"; echo "
    "
    ; } ?> ~ cp -a php-redis.php /usr/share/nginx/html/redis.php ~ systemctl restart nginx php-fpm ~ curl 10.0.0.110/redis.php
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39

    测试php-Redis解析页面。浏览器访问http://10.0.0.110/redis.php

    img

    这就完成了PHP-Redis解析页面

    扩展开发版php-redis脚本

    ~ vim php-redis.php
    <?php
            int_set("display_errors", "On");
            error_reporting(E_ALL | E_STRICT);
            //开启debug
            
            //mysql库:mytest表:test
            $redis = new redis();
            $redis->connect('127.0.0.1',6379) or die ("redis not found");
            $query = "select * from test limit 4";
            for ($key=1;$key<5;$key++)
            {
                    if (!$redis->get($key))
                    //判断redis中是否有1 2 3 4 5的键,没有连接数据库查询mytest库的test表,然后插入到redis中
                    {
                        $connect = mysql_connect('127.0.0.1','root','123456');
                        mysql_select_db(mytest);
                        $result = mysql_query($query);
                        while ($row = mysql_fetch_assoc($result))
                        {
                            $redis->set($row['id'],$row['name']);
                            //从MySQL中获取的资源插入到Redis中,并设置有效时间为30s
                        }
                        $myserver = 'mysql';
                        break;
                    }
                    else
                    //判断redis中是否有1 2 3 4 5的键,有直接打印redis中的 1 2 3 4 5 键的值
                    {
                        $myserver = "redis";
                        $data[$key] = $redis->get($key);
                    }
            }
            echo $myserver;
            echo "
    "
    ; for ($key=1;$key<5;$key++) { echo "number is $key"; echo "
    "
    ; echo "name is $data[$key]"; echo "
    "
    ; } ?>
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
  • 相关阅读:
    一次 Jedis 参数异常引发服务雪崩
    拆解美图SaaS:开着飞机换引擎
    孙宇晨式“溢价逻辑”:不局限眼前,为全人类的“星辰大海”大胆下注
    关于埋点上报
    出口美国的电动自行车UL2849测试和GCC检测标准
    npm常用的命令大全(2024-04-21)
    关于web自动化元素定位,你想知道的都在这里
    gradio的基础教程
    使用idea创建SpringBoot工程
    以C之名,解析Xml
  • 原文地址:https://blog.csdn.net/weixin_40274679/article/details/126801276