NoSQL概述、部署Redis服务、Redis数据类型、Redi

2021-08-18  本文已影响0人  秋天丢了李姑娘

NoSQL概述

数据库类型

RDBMS

NoSQL:Not Only SQL

部署Redis服务

在redis1(192.168.1.11)上部署redis

[root@redis1 ~]# yum install -y gcc
[root@redis1 ~]# tar xf redis-4.0.8.tar.gz
[root@redis1 ~]# cd redis-4.0.8

# 修改安装目录为/usr/local/redis
[root@redis1 redis-4.0.8]# vim +27 src/Makefile
PREFIX?=/usr/local/redis

# 编译安装
[root@redis1 redis-4.0.8]# make && make install

# 将redis命令目录添加至PATH环境变量
[root@redis1 redis-4.0.8]# vim /etc/bashrc   # 尾部追加
export PATH=$PATH:/usr/local/redis/bin
[root@redis1 redis-4.0.8]# source /etc/bashrc

# 初始化redis服务
[root@redis1 redis-4.0.8]# ./utils/install_server.sh  # 全部问题直接回车采用默认值
Welcome to the redis service installer
This script will help you easily set up a running redis server

Please select the redis port for this instance: [6379]
Selecting default: 6379
Please select the redis config file name [/etc/redis/6379.conf]
Selected default - /etc/redis/6379.conf
Please select the redis log file name [/var/log/redis_6379.log]
Selected default - /var/log/redis_6379.log
Please select the data directory for this instance [/var/lib/redis/6379]
Selected default - /var/lib/redis/6379
Please select the redis executable path [/usr/local/redis/bin/redis-server]
Selected config:
Port           : 6379
Config file    : /etc/redis/6379.conf
Log file       : /var/log/redis_6379.log
Data dir       : /var/lib/redis/6379
Executable     : /usr/local/redis/bin/redis-server
Cli Executable : /usr/local/redis/bin/redis-cli
Is this ok? Then press ENTER to go on or Ctrl-C to abort.
Copied /tmp/6379.conf => /etc/init.d/redis_6379
Installing service...
Successfully added to chkconfig!
Successfully added to runlevels 345!
Starting Redis server...
Installation successful!
# 查看服务状态
[root@redis1 ~]# /etc/init.d/redis_6379 status
Redis is running (10023)
# 也可以使用以下方式查看服务状态
[root@redis1 ~]# service redis_6379 status
Redis is running (10023)

[root@redis1 ~]# ss -tlnp | grep :6379
LISTEN     0      128    127.0.0.1:6379                     *:*                   users:(("redis-server",pid=10023,fd=6))

# 关闭服务
[root@redis1 ~]# service redis_6379 stop
Stopping ...
Redis stopped
# 也可以使用以下方式关闭服务
[root@redis1 ~]# /etc/init.d/redis_6379 stop

# 启动服务
[root@redis1 ~]# service redis_6379 start
Starting Redis server...
# 也可以使用以下方式启动服务
[root@redis1 ~]# /etc/init.d/redis_6379 start

# 重启服务
[root@redis1 ~]# service redis_6379 restart
Stopping ...
Redis stopped
Starting Redis server...
# 也可以使用以下方式重启服务
[root@redis1 ~]# /etc/init.d/redis_6379 restart

# 连接redis
[root@redis1 ~]# redis-cli
127.0.0.1:6379> ping  # 测试服务,正常返回PONG
PONG
127.0.0.1:6379> exit

Redis数据类型

字符串

字符串操作命令

# 赋值
SET key value

# 取值
GET key
127.0.0.1:6379> SET username tom
OK

127.0.0.1:6379> GET username
"tom"

127.0.0.1:6379> GET password    # 当键不存在时会返回空结果。
(nil)
# 当要操作的键不存在时会默认键值为0,所以第一次递增后的结果是1。
127.0.0.1:6379> INCR num
(integer) 1

127.0.0.1:6379> INCR num
(integer) 2

127.0.0.1:6379> GET num
"2"
127.0.0.1:6379> SET foo bar
OK

127.0.0.1:6379> INCR foo
(error) ERR value is not an integer or out of range
127.0.0.1:6379> INCRBY num 2
(integer) 4

127.0.0.1:6379> INCRBY num 2
(integer) 6
127.0.0.1:6379> DECR num
(integer) 5

127.0.0.1:6379> DECRBY num 2
(integer) 3
127.0.0.1:6379> SET hi Hello
OK

127.0.0.1:6379> APPEND hi " World"   # 因为字符串包含空格,需要使用引号
(integer) 11        # 返回值为hi的总长度

127.0.0.1:6379> GET hi
"Hello World"
127.0.0.1:6379> STRLEN hi
(integer) 11
127.0.0.1:6379> SET name 张三
OK

127.0.0.1:6379> STRLEN name
(integer) 6   # UTF-8编码的中文,由于“张”和“三”两个字的UTF-8编码的长度都是3,所以此例中会返回6。
127.0.0.1:6379> MSET username tom password tedu.cn
OK

127.0.0.1:6379> MGET username password
1) "tom"
2) "tedu.cn"
127.0.0.1:6379> EXISTS num
(integer) 1

127.0.0.1:6379> EXISTS number
(integer) 0
127.0.0.1:6379> SETNX number 100
(integer) 1

127.0.0.1:6379> GET number
"100"
127.0.0.1:6379> KEYS *
127.0.0.1:6379> DEL number
(integer) 1

127.0.0.1:6379> DEL number
(integer) 0
127.0.0.1:6379> TYPE name
string

字符串实践

# 有用户访问文章ID号为42的博文,则将其访问计数加1
127.0.0.1:6379> INCR post:42:page.view
(integer) 1

127.0.0.1:6379> GET post:42:page.view
"1"

127.0.0.1:6379> INCR post:42:page.view
(integer) 2

127.0.0.1:6379> GET post:42:page.view
"2"

散列类型

散列类型操作命令

# 设置单个字段
127.0.0.1:6379> HSET user1 name bob
(integer) 1

127.0.0.1:6379> HSET user1 gender male
(integer) 1

127.0.0.1:6379> HGET user1 name
"bob"

127.0.0.1:6379> HGET user1 gender
"male"


# 设置多个字段
127.0.0.1:6379> HMSET user1 email bob@tedu.cn phone 13412345678
OK
127.0.0.1:6379> HMGET user1 email phone
1) "bob@tedu.cn"
2) "13412345678"

# 获取所有字段
127.0.0.1:6379> HGETALL user1
1) "name"
2) "bob"
3) "gender"
4) "male"
5) "email"
6) "bob@tedu.cn"
7) "phone"
8) "13412345678"
# 判断字段是否存在
127.0.0.1:6379> HEXISTS user1 address
(integer) 0

127.0.0.1:6379> HEXISTS user1 name
(integer) 1

# 当字段不存在时赋值
127.0.0.1:6379> HSETNX user1 address beijing
(integer) 1

127.0.0.1:6379> HSETNX user1 address shanghai
(integer) 0
127.0.0.1:6379> HINCRBY user1 age 20
(integer) 20

127.0.0.1:6379> HINCRBY user1 age 1
(integer) 21
127.0.0.1:6379> HDEL user1 age
(integer) 1
127.0.0.1:6379> HKEYS user1
1) "name"
2) "gender"
3) "email"
4) "phone"
5) "address"
127.0.0.1:6379> HVALS user1
1) "bob"
2) "male"
3) "bob@tedu.cn"
4) "13412345678"
5) "beijing"
127.0.0.1:6379> HLEN user1
(integer) 5

散列类型实践

127.0.0.1:6379> HSET post:10 title 例解Python
(integer) 1

127.0.0.1:6379> HGETALL post:10
1) "title"
2) "\xe4\xbe\x8b\xe8\xa7\xa3Python"

127.0.0.1:6379> HSET post:10 author ZhangZhiGang
(integer) 1


127.0.0.1:6379> HMSET post:10 date 2021-05-01 summary 'Python Programming'
OK

127.0.0.1:6379> HGETALL post:10
1) "title"
2) "\xe4\xbe\x8b\xe8\xa7\xa3Python"
3) "author"
4) "ZhangZhiGang"
5) "date"
6) "2021-05-01"
7) "summary"
8) "Python Programming"

列表类型

列表类型操作命令

127.0.0.1:6379> LPUSH numbers 1
(integer) 1

127.0.0.1:6379> LPUSH numbers 2 3
(integer) 3
127.0.0.1:6379> LRANGE numbers 0 -1  # 起始下标为0,结束下标为-1
1) "3"
2) "2"
3) "1"
127.0.0.1:6379> RPUSH numbers 0 -1
(integer) 5

127.0.0.1:6379> LRANGE numbers 0 -1
1) "3"
2) "2"
3) "1"
4) "0"
5) "-1"
127.0.0.1:6379> LPOP numbers
"3"
127.0.0.1:6379> LRANGE numbers 0 -1
1) "2"
2) "1"
3) "0"
4) "-1"

127.0.0.1:6379> RPOP numbers
"-1"

127.0.0.1:6379> LRANGE numbers 0 -1
1) "2"
2) "1"
3) "0"
127.0.0.1:6379> LLEN numbers
(integer) 3
# 语法
LREM key count value
#LREM命令会删除列表中前count个值为value的元素,返回值是实际删除的元素个数。根据count值的不同,LREM命令的执行方式会略有差异。
#(1)当 count > 0时 LREM 命令会从列表左边开始删除前 count 个值为 value的元素。
#(2)当 count < 0时 LREM 命令会从列表右边开始删除前 count 个值为 value 的元素。
#(3)当 count = 0是 LREM命令会删除所有值为 value的元素。

127.0.0.1:6379> LPUSH numbers 0 1 2 0 1 2 0 1 2
(integer) 12

127.0.0.1:6379> RPUSH numbers 2 1 0 2 1 0 2 1 0
(integer) 21

127.0.0.1:6379> LRANGE numbers 0 -1
 1) "2"
 2) "1"
 3) "0"
 4) "2"
 5) "1"
 6) "0"
 7) "2"
 8) "1"
 9) "0"
10) "2"
11) "1"
12) "0"
13) "2"
14) "1"
15) "0"
16) "2"
17) "1"
18) "0"
19) "2"
20) "1"
21) "0"

# 
127.0.0.1:6379> LREM numbers 2 1   # 从左侧开始删除2个1
(integer) 2

127.0.0.1:6379> LRANGE numbers 0 -1
 1) "2"
 2) "0"
 3) "2"
 4) "0"
 5) "2"
 6) "1"
 7) "0"
 8) "2"
 9) "1"
10) "0"
11) "2"
12) "1"
13) "0"
14) "2"
15) "1"
16) "0"
17) "2"
18) "1"
19) "0"

# 从右侧开始删除2个0
127.0.0.1:6379> LREM numbers -2 0
(integer) 2

127.0.0.1:6379> LRANGE numbers 0 -1
 1) "2"
 2) "0"
 3) "2"
 4) "0"
 5) "2"
 6) "1"
 7) "0"
 8) "2"
 9) "1"
10) "0"
11) "2"
12) "1"
13) "0"
14) "2"
15) "1"
16) "2"
17) "1"

# 删除所有的0
127.0.0.1:6379> LREM numbers 0 0
(integer) 5
127.0.0.1:6379> LRANGE numbers 0 -1
 1) "2"
 2) "2"
 3) "2"
 4) "1"
 5) "2"
 6) "1"
 7) "2"
 8) "1"
 9) "2"
10) "1"
11) "2"
12) "1"
# 获取numbers列表中下标为0的值
127.0.0.1:6379> LINDEX numbers 0
"2"

# 设置下标为1的值为10
127.0.0.1:6379> LSET numbers 1 10
OK

127.0.0.1:6379> LRANGE numbers 0 -1
 1) "2"
 2) "10"
 3) "2"
 4) "1"
 5) "2"
 6) "1"
 7) "2"
 8) "1"
 9) "2"
10) "1"
11) "2"
12) "1"
127.0.0.1:6379> LTRIM numbers 0 2
OK

127.0.0.1:6379> LRANGE numbers 0 -1
1) "2"
2) "10"
3) "2"
# 在2的前面插入20
127.0.0.1:6379> LINSERT numbers BEFORE 2 20
(integer) 4

127.0.0.1:6379> LRANGE numbers 0 -1
1) "20"
2) "2"
3) "10"
4) "2"

# 在2的后面插入30
127.0.0.1:6379> LINSERT numbers AFTER 2 30
(integer) 5
127.0.0.1:6379> LRANGE numbers 0 -1
1) "20"
2) "2"
3) "30"
4) "10"
5) "2"

列表类型实践

127.0.0.1:6379> LPUSH posts:list 11 12 13
(integer) 3

127.0.0.1:6379> LRANGE posts:list 0 -1
1) "13"
2) "12"
3) "11"

集合类型

127.0.0.1:6379> SADD letters a b c
(integer) 3

127.0.0.1:6379> SADD letters b c d
(integer) 1

127.0.0.1:6379> SMEMBERS letters
1) "d"
2) "b"
3) "a"
4) "c"

127.0.0.1:6379> SREM letters a c
(integer) 2

127.0.0.1:6379> SMEMBERS letters
1) "d"
2) "b"
127.0.0.1:6379> SISMEMBER letters a
(integer) 0

127.0.0.1:6379> SISMEMBER letters b
(integer) 1
127.0.0.1:6379> SADD s1 a b c
(integer) 3

127.0.0.1:6379> SADD s2 b c d
(integer) 3

127.0.0.1:6379> SINTER s1 s2
1) "b"
2) "c"

127.0.0.1:6379> SUNION s1 s2
1) "a"
2) "c"
3) "b"
4) "d"

127.0.0.1:6379> SDIFF s1 s2
1) "a"
127.0.0.1:6379> SCARD letters
(integer) 2
# 在集合s1中随机取出两个不同元素。
127.0.0.1:6379> SRANDMEMBER s1 2
1) "b"
2) "c"

# 在集合s1中随机取出两个有可能相同元素。
127.0.0.1:6379> SRANDMEMBER s1 -2
1) "c"
2) "c"

127.0.0.1:6379> SRANDMEMBER s1 -2
1) "a"
2) "b"
127.0.0.1:6379> SPOP s1
"a"

127.0.0.1:6379> SMEMBERS s1
1) "b"
2) "c"

集合实践

127.0.0.1:6379> SADD post:10:tags python redis nginx
(integer) 3

127.0.0.1:6379> SMEMBERS post:10:tags
1) "python"
2) "nginx"
3) "redis"

有序集合类型

有序集合类型操作

127.0.0.1:6379> ZADD scores 88 tom 90 jerry 75 bob 92 alice
(integer) 4

127.0.0.1:6379> ZRANGE scores 0 -1
1) "bob"
2) "tom"
3) "jerry"
4) "alice"

127.0.0.1:6379> ZRANGE scores 0 -1 WITHSCORES
1) "bob"
2) "75"
3) "tom"
4) "88"
5) "jerry"
6) "90"
7) "alice"
8) "92"

127.0.0.1:6379> ZADD scores 85 jerry
(integer) 0

127.0.0.1:6379> ZRANGE scores 0 -1 WITHSCORES
1) "bob"
2) "75"
3) "jerry"
4) "85"
5) "tom"
6) "88"
7) "alice"
8) "92"
127.0.0.1:6379> ZSCORE scores tom
"88"
127.0.0.1:6379> ZRANGEBYSCORE scores 80 90 WITHSCORES
1) "jerry"
2) "85"
3) "tom"
4) "88"
127.0.0.1:6379> ZINCRBY scores 3 bob
"78"

127.0.0.1:6379> ZSCORE scores bob
"78"
127.0.0.1:6379> ZCARD scores
(integer) 4
127.0.0.1:6379> ZCOUNT scores 80 90
(integer) 2
127.0.0.1:6379> ZREM scores bob
(integer) 1
127.0.0.1:6379> ZRANK scores tom   # 获取tom的排名
(integer) 1   # 升序排列,从0开始计数

127.0.0.1:6379> ZREVRANK scores alice   # 获取alice的排名
(integer) 0   # 降序排列,从0开始计数

有序集合类型实践

127.0.0.1:6379> ZADD posts:page.view 0 post:10:page.view
(integer) 1

127.0.0.1:6379> ZINCRBY posts:page.view 1 post:10:page.view
"1"

127.0.0.1:6379> ZRANGE posts:page.view 0 -1 WITHSCORES
1) "post:10:page.view"
2) "1"

Redis其他操作命令

数据操作命令

127.0.0.1:6379> TTL name
(integer) -1    # -1 表示永不过期

# 创建key的同时,设置它的过期时间。key是user1:login,value是235124,超时时间60秒
127.0.0.1:6379> SET user1:login 235124 ex 60
OK
127.0.0.1:6379> EXPIRE password 20
(integer) 1

127.0.0.1:6379> TTL password
(integer) 15

127.0.0.1:6379> TTL password
(integer) -2   # -2表示已过期
127.0.0.1:6379> EXISTS password
(integer) 0
127.0.0.1:6379> SAVE
OK

数据库操作命令

127.0.0.1:6379> MOVE name 1
(integer) 1
127.0.0.1:6379> SELECT 1
OK

127.0.0.1:6379[1]> KEYS *
1) "name"
# 清除当前库
127.0.0.1:6379[1]> FLUSHDB
OK

127.0.0.1:6379[1]> KEYS *
(empty list or set)

# 清除所有库
127.0.0.1:6379[1]> SELECT 0
OK

127.0.0.1:6379> KEYS *
 1) "numbers"
 2) "2"
 3) "posts:list"
 4) "letters"
 5) "posts:page.view"
 6) "scores"
 7) "post:10:tags"
 8) "foo"
 9) "s1"
10) "s2"
11) "num"
12) "post:10"
13) "user1"
14) "username"
15) "hi"
16) "post:42:page.view"

127.0.0.1:6379> SELECT 1
OK

127.0.0.1:6379[1]> FLUSHALL
OK

127.0.0.1:6379[1]> SELECT 1
OK

127.0.0.1:6379[1]> KEYS *
(empty list or set)
127.0.0.1:6379> SHUTDOWN
not connected> exit

修改Redis服务运行参数

常用参数

[root@redis1 ~]# vim /etc/redis/6379.conf 
protected-mode no        # 关闭保护模式,以允许不指定服务绑定在哪个地址
# bind 127.0.0.1         # 注释此行,运行在0.0.0.0上
port 6379                # 端口号
requirepass tedu.cn      # 密码
[root@redis1 ~]# vim +43 /etc/init.d/redis_6379 
... ...
            $CLIEXEC -p $REDISPORT -a tedu.cn shutdown
... ...
[root@redis1 ~]# service redis_6379 start
Starting Redis server...

[root@redis1 ~]# redis-cli -h 192.168.1.11 -p 6379 -a tedu.cn
192.168.1.11:6379> PING
PONG

附:python操作redis

# 安装redis模块
[root@zzgrhel8 ~]# pip3 install redis

# 操作
[root@zzgrhel8 ~]# python3
>>> import redis
>>> help(redis.Redis)
>>> r = redis.Redis(host='192.168.1.11', db=0, password='tedu.cn')
# 操作字符串类型数据
>>> r.set('name', 'tom')

# 更多操作参见:https://www.cnblogs.com/melonjiang/p/5342505.html

部署支持php和Redis的Nginx服务器

安装并配置Nginx服务器

# 安装编译器
[root@nginx1 ~]# yum install -y gcc pcre-devel zlib-devel

# 编译安装nginx
[root@nginx1 ~]# tar xf nginx-1.12.2.tar.gz 
[root@nginx1 ~]# cd nginx-1.12.2
[root@nginx1 nginx-1.12.2]# ./configure 
[root@nginx1 nginx-1.12.2]# make && make install
[root@nginx1 ~]# yum install -y php-fpm

[root@nginx1 ~]# systemctl start php-fpm

[root@nginx1 ~]# ss -tlnp | grep :9000
LISTEN     0      128    127.0.0.1:9000                     *:*                   users:(("php-fpm",pid=11310,fd=0),("php-fpm",pid=11309,fd=0),("php-fpm",pid=11308,fd=0),("php-fpm",pid=11307,fd=0),("php-fpm",pid=11306,fd=0),("php-fpm",pid=11305,fd=6))
[root@nginx1 ~]# vim +65 /usr/local/nginx/conf/nginx.conf
        location ~ \.php$ {
            root           html;
            fastcgi_pass   127.0.0.1:9000;
            fastcgi_index  index.php;
        #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
            include        fastcgi.conf;
        }
[root@nginx1 ~]# /usr/local/nginx/sbin/nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful

[root@nginx1 ~]# /usr/local/nginx/sbin/nginx

[root@nginx1 ~]# ss -tlnp | grep :80
LISTEN     0      128          *:80                       *:*                   users:(("nginx",pid=11376,fd=6),("nginx",pid=11375,fd=6))
[root@nginx1 ~]# vim /usr/local/nginx/html/test.php
<?php
    echo "Hello World!\n";
    phpinfo();
?>

[root@nginx1 ~]# curl http://127.0.0.1/test.php
Hello World!
... ...

配置PHP支持Redis

[root@nginx1 ~]# yum install -y php-devel automake autoconf
[root@nginx1 ~]# tar xf redis-cluster-4.3.0.tgz
[root@nginx1 ~]# cd redis-4.3.0/
[root@nginx1 redis-4.3.0]# phpize 
[root@nginx1 redis-4.3.0]# ./configure --with-php-config=/usr/bin/php-config 
[root@nginx1 redis-4.3.0]# make && make install

[root@nginx1 redis-4.3.0]# ls /usr/lib64/php/modules/redis.so 
/usr/lib64/php/modules/redis.so
[root@nginx1 redis-4.3.0]# vim /etc/php.ini   # 在730行下添加
extension_dir = "/usr/lib64/php/modules"
extension = "redis.so"

[root@nginx1 ~]# systemctl restart php-fpm
# 创建脚本,写入redis数据库
[root@nginx1 ~]# vim /usr/local/nginx/html/set_redis.php
<?php
    $redis = new redis();
    $redis->connect("192.168.1.11", "6379");
    $redis->auth("tedu.cn");
    $redis->set("username", "tom");
?>

# 创建脚本,读取redis数据
[root@nginx1 ~]# vim /usr/local/nginx/html/get_redis.php
<?php
    $redis = new redis();
    $redis->connect("192.168.1.11", "6379");
    $redis->auth("tedu.cn");
    echo $redis->get("username");
?>

# 访问测试页面
[root@nginx1 ~]# curl http://127.0.0.1/set_redis.php
[root@nginx1 ~]# curl http://127.0.0.1/get_redis.php
tom

# 在redis数据库上查看
[root@redis1 ~]# redis-cli -a tedu.cn
127.0.0.1:6379> KEYS *
1) "username"
127.0.0.1:6379> GET username
"tom"

附加练习:参见【tedu_nsd/software/php_redis_mysql_bbs/】

上一篇 下一篇

猜你喜欢

热点阅读