zoukankan      html  css  js  c++  java
  • Redis数据库

    Redis数据库

    数据库类型:
    	关系型数据库	MySQL, mariadb-server, oracle 
    	非关系型数据库   NoSQL 
    		以键值key-value对方式的存储数据
    		
    		redis, mongodb, memcached, memcachedDB
    		
    
    NoSQL(Not Only SQL)数据库
    
    	高性能、高并发
    
    
    
    NoSQL数据库类型:
    
    	键值(key-value)存储数据库, redis 
    	面向列存储数据库	HBase
    	面向文档存储数据库  MongoDB
    	图形数据库
    	
    	
    	
    
    开源数据库
    配置简单
    支持内存存储数据
    支持持久化存储数据
    	datafile 数据文件   *.rdb 
    	aof(append only file)文件,日志文件 
    支持多实例部署
    支持主从复制、集群
    支持事务transaction
    以key-value键值对的方式存储
    	value类型:string字符串、list列表、set集合、sorted_set有序集合、hash值
    

    Redis数据库安装及启动

    [root@redis01 ~]# yum install -y gcc
    [root@redis01 ~]# tar xf redis-3.2.9.tar.gz
    [root@redis01 ~]# cd redis-3.2.9/
    [root@redis01 redis-3.2.9]# make
    [root@redis01 redis-3.2.9]# make PREFIX=/usr/local/redis install
    [root@redis01 ~]# ls /usr/local/redis/
    bin

    命令解释:

    1、redis-server 启动redis服务
    2、redis-cli redis客户端工具
    3、redis-benchmark redis性能测试
    4、redis-check-rdb 检测rdb文件
    5、redis-check-aof 检测aof日志文件

    [root@redis01 ~]# mkdir /usr/local/redis/conf
    [root@redis01 ~]# cd redis-3.2.9/
    [root@redis01 redis-3.2.9]# cp redis.conf /usr/local/redis/conf/

    [root@redis01 ~]# /usr/local/redis/bin/redis-server /usr/local/redis/conf/redis.conf &
    [root@redis01 ~]# ss -antp | grep :6379
    LISTEN 0 128 127.0.0.1:6379 : users:(("redis-server",pid=9612,fd=4))
    [root@redis01 ~]#

    启动服务时内核参数说明:

    1、/proc/sys/net/core/somaxconn

    定义了系统中每一个端口最大的监听队列的长度,默认为128. 对于大多数需要处理高并发连接的应用来说,该值太小,建议修改为1024或者更大
    

    2、overcommit_memory

    规定决定是否接受超大内存请求的条件。这个参数有三个可能的值:
    	0 — 默认设置。内核执行启发式内存过量使用处理,方法是估算可用内存量,并拒绝明显无效的请求。遗憾的是因为内存是使用启发式而非准确算法计算进行部署,这个设置有时可能会造成系统中的可用内存超载。
    	1 — 内核执行无内存过量使用处理。使用这个设置会增大内存超载的可能性,但也可以增强大量使用内存任务的性能。
    	2 — 内存拒绝等于或者大于总可用 swap 大小以及 overcommit_ratio 指定的物理 RAM 比例的内存请求。如果您希望减小内存过度使用的风险,这个设置就是最好的。
    

    3、/sys/kernel/mm/transparent_hugepage/enabled

    禁止使用huge page 
    

    [root@redis01 redis]# tail -n 1 /etc/profile
    export PATH=$PATH:/usr/local/redis/bin
    [root@redis01 redis]#
    [root@redis01 redis]# source /etc/profile

    测试redis存储、读取数据:

    [root@redis01 ~]# redis-cli
    127.0.0.1:6379>
    127.0.0.1:6379> set name martin
    OK
    127.0.0.1:6379> get name
    "martin"
    127.0.0.1:6379>

    Redis服务的启动与关闭

    1. 启动服务

    [root@redis01 ~]# redis-server /usr/local/redis/conf/redis.conf &

    编辑rc.local文件,实现开机自启动

    1. 关闭服务

    [root@redis01 ~]# redis-cli shutdown

    Redis常规操作:

    [root@redis01 ~]# redis-cli

    127.0.0.1:6379> set age 16
    OK
    127.0.0.1:6379> get age
    "16"
    127.0.0.1:6379> set name martin
    OK
    127.0.0.1:6379> get name
    "martin"
    127.0.0.1:6379>
    127.0.0.1:6379> keys *

    1. "age"
    2. "name"
      127.0.0.1:6379> del age
      (integer) 1
      127.0.0.1:6379> get age
      (nil)
      127.0.0.1:6379>

    字符串string数据类型操作

    127.0.0.1:6379> set name martin
    OK
    127.0.0.1:6379> get name
    "martin"
    127.0.0.1:6379> mset name tom age 15 sex male
    OK
    127.0.0.1:6379> mget name age sex

    1. "tom"
    2. "15"
    3. "male"
      127.0.0.1:6379>

    127.0.0.1:6379> strlen name
    (integer) 3
    127.0.0.1:6379>

    127.0.0.1:6379> set count 1
    OK
    127.0.0.1:6379> incr count
    (integer) 2
    127.0.0.1:6379> incr count
    (integer) 3
    127.0.0.1:6379> incr count
    (integer) 4
    127.0.0.1:6379> get count
    "4"
    127.0.0.1:6379> decr count
    (integer) 3
    127.0.0.1:6379> get count
    "3"
    127.0.0.1:6379>

    127.0.0.1:6379> set count 1
    OK
    127.0.0.1:6379> incrby count 3
    (integer) 4
    127.0.0.1:6379> get count
    "4"
    127.0.0.1:6379> decrby count 2
    (integer) 2
    127.0.0.1:6379> get count
    "2"
    127.0.0.1:6379>

    Redis安全设置:

    1. 设置密码

    [root@redis01 ~]# grep "^require" /usr/local/redis/conf/redis.conf
    requirepass redhat

    重启redis

    使用密码连接操作redis

    方法1)

    [root@redis01 ~]# redis-cli
    127.0.0.1:6379>
    127.0.0.1:6379> set name jerry
    (error) NOAUTH Authentication required.
    127.0.0.1:6379>
    127.0.0.1:6379> AUTH redhat
    OK
    127.0.0.1:6379> set name jerry
    OK
    127.0.0.1:6379> get name
    "jerry"
    127.0.0.1:6379>

    方法2)

    [root@redis01 ~]# redis-cli -a redhat
    127.0.0.1:6379> set age 10
    OK
    127.0.0.1:6379> get age
    "10"
    127.0.0.1:6379>

    2、设置命令别名

    [root@redis01 ~]# grep "^rename" /usr/local/redis/conf/redis.conf
    rename-command set uplooking
    [root@redis01 ~]#

    [root@redis01 ~]# redis-cli -a redhat
    127.0.0.1:6379>
    127.0.0.1:6379>
    127.0.0.1:6379> set age 10
    (error) ERR unknown command 'set'
    127.0.0.1:6379>
    127.0.0.1:6379> uplooking age 10
    OK
    127.0.0.1:6379> get age
    "10"
    127.0.0.1:6379>

    redis事务

    保证多个操作同时成功执行,在一个事务中,任何一个操作发生error,所有操作都会回滚 
    

    192.168.122.102:6379> set count 1
    OK
    192.168.122.102:6379> multi
    OK
    192.168.122.102:6379> incr count
    QUEUED
    192.168.122.102:6379> incr count
    QUEUED
    192.168.122.102:6379> exec

    1. (integer) 2
    2. (integer) 3
      192.168.122.102:6379>
      192.168.122.102:6379> get count
      "3"
      192.168.122.102:6379>

    192.168.122.102:6379> set number 1
    OK
    192.168.122.102:6379> MULTI
    OK
    192.168.122.102:6379> incr number
    QUEUED
    192.168.122.102:6379> incre number
    (error) ERR unknown command 'incre'
    192.168.122.102:6379>
    192.168.122.102:6379> exec
    (error) EXECABORT Transaction discarded because of previous errors.
    192.168.122.102:6379>
    192.168.122.102:6379>
    192.168.122.102:6379>
    192.168.122.102:6379> get number
    "1"
    192.168.122.102:6379>

    redis配置文件 redis.conf

    1、指定额外的配置文件

    include /path/to/local.conf

    include /path/to/other.conf

    2、设置redis监听的IP地址

    bind 192.168.122.101

    3、设置redis进程接收的TCP队列长度

    tcp-backlog 511

    同时修改内核参数/proc/sys/net/core/somaxconn

    4、设置客户端空闲连接超时时间, 0表示不设置

    timeout 0

    5、设置redis启动时作为后台服务运行

    daemonize yes

    6、指定pid文件

    pidfile /var/run/redis_6379.pid

    7、设置日志级别及日志文件

    loglevel notice
    logfile ""

    8、设置数据库的数量 0--15

    databases 16

    9、设置redis保存数据的频率

    save 900 1
    save 300 10
    save 60 10000

    redis保存数据的方式:
    	save, 会阻塞(block)客户端连接请求
    	bgsave
    

    10、当bgsave发生error时,停止写操作

    stop-writes-on-bgsave-error yes

    11、启用压缩

    rdbcompression yes

    12、设置rdb数据文件名称及存放目录

    dbfilename dump.rdb
    dir /usr/local/redis/data

    13、设置并发连接

    maxclients 10000

    14、设置redis最大使用的内存

    maxmemory //建议为物理内存的3/5

    15、启用redis aof功能

    appendonly yes
    appendfilename "appendonly.aof"

    一、为PHP添加redis模块

    1. 安装lamp平台

    [root@redis01 ~]# yum install -y httpd mariadb-server php php-gd php-mysql gd php-devel

    [root@redis01 ~]# systemctl start httpd
    [root@redis01 ~]# systemctl enable httpd

    [root@redis01 ~]# systemctl start mariadb
    [root@redis01 ~]# systemctl enable mariadb.service
    Created symlink from /etc/systemd/system/multi-user.target.wants/mariadb.service to /usr/lib/systemd/system/mariadb.service.

    1. 安装php模块

    [root@redis01 ~]# tar xf redis-3.1.2.tgz
    [root@redis01 ~]# cd redis-3.1.2/
    [root@redis01 redis-3.1.2]# /usr/bin/phpize
    Configuring for:
    PHP Api Version: 20100412
    Zend Module Api No: 20100525
    Zend Extension Api No: 220100525
    [root@redis01 redis-3.1.2]#

    [root@redis01 redis-3.1.2]# ./configure --enable-redis --with-php-config=/usr/bin/php-config
    [root@redis01 redis-3.1.2]# make && make install

    安装完成后,提示redis.so模块的安装路径 Installing shared extensions: /usr/lib64/php/modules/

    1. 编辑php配置文件,加载redis.so模块

    vim /etc/php.ini

    extension = /usr/lib64/php/modules/redis.so

    [root@redis01 redis-3.1.2]# systemctl restart httpd

    1. 编辑php页面,测试php连接redis的效果

    [root@redis01 html]# cat /var/www/html/b.php

    connect("192.168.122.101",6379); $redis -> auth("redhat"); $redis -> set("name","Tome"); $var = $redis -> get("name"); echo "$var"; ?>

    二、为Python添加redis模块

    [root@redis01 ~]# tar xf redis-2.9.1.tar.gz
    [root@redis01 ~]# cd redis-2.9.1/
    [root@redis01 redis-2.9.1]# python setup.py install

    通过python测试连接redis

    import redis
    r = redis.Redis(host='192.168.122.101',port=6379,password='redhat')
    r.set('foo','bar')
    True
    value = r.get('foo')
    print value
    bar

    三、配置redis多实例

    Instance01		6380端口		
    Instance02		6381端口 
    
    1. 为每个实例创建目录

    [root@redis01 ~]# mkdir /app/{6380,6381} -p
    [root@redis01 ~]# mkdir /app/6380/data
    [root@redis01 ~]# mkdir /app/6381/data

    1. 为每个实例准备配置文件

    [root@redis01 ~]# cp /usr/local/redis/conf/redis.conf /app/6380/
    [root@redis01 ~]# cp /usr/local/redis/conf/redis.conf /app/6381/

    1. 编辑实例6380的配置文件

    [root@redis01 ~]# vim /app/6380/redis.conf

    bind 192.168.122.101
    daemonize yes
    port 6380
    pidfile /var/run/redis_6380.pid
    dir /app/redis/instance/6380/data

    同样的方法编辑另一个实例的配置文件

    1. 分别启动实例

    [root@redis01 ~]# redis-server /app/6380/redis.conf
    [root@redis01 ~]# redis-server /app/6381/redis.conf

    [root@redis01 ~]# ss -antp | grep redis
    LISTEN 0 128 192.168.122.101:6380 : users:(("redis-server",pid=23687,fd=4))
    LISTEN 0 128 192.168.122.101:6381 : users:(("redis-server",pid=23695,fd=4))
    [root@redis01 ~]#

    1. 分别连接两个实例,进行数据读写验证

    [root@redis01 ~]# redis-cli -a redhat -h 192.168.122.101 -p 6380
    192.168.122.101:6380> set name martin
    OK
    192.168.122.101:6380> get name
    "martin"
    192.168.122.101:6380> quit

    [root@redis01 ~]# redis-cli -a redhat -h 192.168.122.101 -p 6381
    192.168.122.101:6381> set age 18
    OK
    192.168.122.101:6381> get age
    "18"
    192.168.122.101:6381> get name
    (nil)
    192.168.122.101:6381>

    Redis主从复制

    1、采用异步的方式进行数据同步
    3、支持级联复制, 某一个slave服务器可以作为另外slave服务器的主
    4、进行主从复制时,master/slave不会阻塞客户端访问请求
    5、自redis 2.6版本后,slave服务器默认工作在只读模式
    

    配置案例

    环境描述:
    node02 192.168.122.102 Master
    node03 192.168.122.103 Slave

    1. 分别在两个节点安装redis,并启动

    2. 编辑slave服务器的配置文件

    [root@node03 redis-3.2.9]# vim /usr/local/redis/conf/redis.conf

    slaveof 192.168.122.102 6379
    masterauth redhat
    
    1. 启动slave

    [root@node03 ~]# redis-server /usr/local/redis/conf/redis.conf &

    1. 查看复制状态

    192.168.122.103:6379> info replication

    Replication

    role:slave
    master_host:192.168.122.102
    master_port:6379
    master_link_status:up
    master_last_io_seconds_ago:10
    master_sync_in_progress:0
    slave_repl_offset:127
    slave_priority:100
    slave_read_only:1
    connected_slaves:0
    master_repl_offset:0
    repl_backlog_active:0
    repl_backlog_size:1048576
    repl_backlog_first_byte_offset:0
    repl_backlog_histlen:0
    192.168.122.103:6379>

    1. 测试复制

    [root@node02 ~]# redis-cli -h 192.168.122.102
    192.168.122.102:6379>
    192.168.122.102:6379> AUTH redhat
    OK
    192.168.122.102:6379>
    192.168.122.102:6379> set name martin
    OK
    192.168.122.102:6379> get name
    "martin"
    192.168.122.102:6379>

    192.168.122.103:6379> get name
    "martin"
    192.168.122.103:6379>

    Redis集群cluster

    Redis 集群是一个提供在多个Redis间节点间共享数据
    
    Redis集群通过分区shared来提供一定程度的可用性,在实际环境中当某个节点宕机或者不可达的情况下继续处理命令. 
    
    Redis 集群的优势:
    	自动分割数据到不同的节点上。
    	整个集群的部分节点失败或者不可达的情况下能够继续处理命令。
    

    Redis集群的数据分片

    Redis 集群使用哈希槽slot进行数据分片
    
    Redis集群有16384个哈希槽,每个key通过CRC16校验后对16384取模来决定放置哪个槽.集群的每个节点负责一部分hash槽,举个例子,比如当前集群有3个节点,那么:
    
    	节点 A 包含 0 到 5500号哈希槽.
    	节点 B 包含5501 到 11000 号哈希槽.
    	节点 C 包含11001 到 16384号哈希槽.
    
    数据究竟存放到哪个槽上?
    	
    		数据做hash运算除以16384除余
    

    部署redis集群

    环境描述:
    	192.168.122.101	node01	3个集群模式的实例	7000, 7001, 7002
    	192.168.122.102	node02	3个集群模式的实例 	7003, 7004, 7005
    

    1、分别在两个节点安装redis

    2、为了方便使用创建集群命令,将其复制/usr/local/bin

    [root@node01 src]# cp redis-trib.rb /usr/local/bin/

    [root@node02 ~]# cd redis-4.0.2/src/
    [root@node02 src]# cp redis-trib.rb /usr/local/bin/

    3、在node01上创建3个集群模式的实例

    [root@node01 ~]# mkdir -p /app/redis/cluster/{7000,7001,7002}

    [root@node01 ~]# cd redis-4.0.2/
    [root@node01 redis-4.0.2]# cp redis.conf /app/redis/cluster/7000/
    [root@node01 redis-4.0.2]# cp redis.conf /app/redis/cluster/7001/
    [root@node01 redis-4.0.2]# cp redis.conf /app/redis/cluster/7002/

    [root@node01 ~]# vim /app/redis/cluster/7000/redis.conf

    bind 192.168.122.101
    port 7000
    daemonize yes
    pidfile /var/run/redis_7000.pid
    cluster-enabled yes
    cluster-config-file nodes-7000.conf
    cluster-node-timeout 5000
    appendonly yes
    

    其他实例参照以上修改

    4、分别启动实例

    [root@node01 ~]# redis-server /app/redis/cluster/7000/redis.conf
    [root@node01 ~]# redis-server /app/redis/cluster/7001/redis.conf
    [root@node01 ~]# redis-server /app/redis/cluster/7002/redis.conf

    [root@node02 ~]# redis-server /app/redis/cluster/7003/redis.conf
    [root@node02 ~]# redis-server /app/redis/cluster/7004/redis.conf
    [root@node02 ~]# redis-server /app/redis/cluster/7005/redis.conf

    [root@node01 ~]# netstat -antp | grep redis
    tcp 0 0 192.168.122.101:17000 0.0.0.0:* LISTEN 14045/redis-server
    tcp 0 0 192.168.122.101:17001 0.0.0.0:* LISTEN 14050/redis-server
    tcp 0 0 192.168.122.101:17002 0.0.0.0:* LISTEN 14055/redis-server
    tcp 0 0 192.168.122.101:7000 0.0.0.0:* LISTEN 14045/redis-server
    tcp 0 0 192.168.122.101:7001 0.0.0.0:* LISTEN 14050/redis-server
    tcp 0 0 192.168.122.101:7002 0.0.0.0:* LISTEN 14055/redis-server
    [root@node01 ~]#
    [root@node01 ~]# ps aux | grep redis
    root 14045 0.1 0.4 147308 9608 ? Ssl 14:24 0:00 redis-server 192.168.122.101:7000 [cluster]
    root 14050 0.1 0.4 147308 9608 ? Ssl 14:24 0:00 redis-server 192.168.122.101:7001 [cluster]
    root 14055 0.1 0.4 147308 9608 ? Ssl 14:24 0:00 redis-server 192.168.122.101:7002 [cluster]

    5、创建集群

    创建集群时需要使用redis-trib.rb工具,该工具是由ruby语言编写,因此需要机器有ruby环境		
    

    [root@node01 ~]# yum install -y ruby ruby-devel rubygems rpm-build

    [root@node01 ~]# gem install redis
    Fetching: redis-4.0.0.gem (100%)
    ERROR: Error installing redis:
    redis requires Ruby version >= 2.2.2.
    [root@node01 ~]#
    [root@node01 ~]# rpm -q ruby
    ruby-2.0.0.648-30.el7.x86_64

    redis需要ruby 2.2版本以上的支持,使用工具rvm(ruby version manager)安装ruby

    以下是使用rvm安装ruby的过程

    1. 安装rvm

    [root@node01 ~]# gpg2 --keyserver hkp://keys.gnupg.net --recv-keys D39DC0E3
    [root@node01 ~]# curl -L get.rvm.io | bash -s stable
    [root@node01 ~]# source /usr/local/rvm/scripts/rvm

    1. 查看可用的ruby版本

    [root@node01 ~]# rvm list known

    1. 安装2.3.4版本的ruby

    [root@node01 ~]# rvm install 2.3.4

    1. 配置系统使用ruby 2.3.4

    [root@node01 ~]# rvm use 2.3.4
    Using /usr/local/rvm/gems/ruby-2.3.4
    [root@node01 ~]# rvm use 2.3.4 --default
    Using /usr/local/rvm/gems/ruby-2.3.4
    [root@node01 ~]#
    [root@node01 ~]# rvm remove 2.0.0
    ruby-2.0.0-p648 - #already gone
    Using /usr/local/rvm/gems/ruby-2.3.4
    [root@node01 ~]#
    [root@node01 ~]# ruby --version
    ruby 2.3.4p301 (2017-03-30 revision 58214) [x86_64-linux]
    [root@node01 ~]#

    1. 再次安装redis gem

    [root@node01 ~]# gem install redis

    创建集群

    [root@node01 ~]# redis-trib.rb create --replicas 1

    192.168.122.101:7000
    192.168.122.101:7001
    192.168.122.101:7002
    192.168.122.102:7003
    192.168.122.102:7004
    192.168.122.102:7005

    集群创建完毕后会有以下提示

    [OK] All 16384 slots covered.

    选项:

    --replicas 1	为集群里的每个master节点配备一个slave节点 
    

    6、向集群当中储存数据

    [root@node01 ~]# redis-cli -h 192.168.122.101 -p 7000 -c
    192.168.122.101:7000> set a 10
    -> Redirected to slot [15495] located at 192.168.122.101:7001
    OK
    192.168.122.101:7001> set b 10
    -> Redirected to slot [3300] located at 192.168.122.101:7000
    OK
    192.168.122.101:7000>

    [root@node02 ~]# redis-cli -h 192.168.122.102 -p 7003 -c
    192.168.122.102:7003>
    192.168.122.102:7003>
    192.168.122.102:7003> get a
    -> Redirected to slot [15495] located at 192.168.122.101:7001
    "10"
    192.168.122.101:7001> get b
    -> Redirected to slot [3300] located at 192.168.122.101:7000
    "10"
    192.168.122.101:7000> set name martin
    -> Redirected to slot [5798] located at 192.168.122.102:7003
    OK
    192.168.122.102:7003> set age 10
    -> Redirected to slot [741] located at 192.168.122.101:7000
    OK
    192.168.122.101:7000>

    有志者,事竟成,破釜沉舟,百二秦关终属楚; 苦心人,天不负,卧薪尝胆,三千越甲可吞吴。 想到与得到中间还有两个字——做到。
  • 相关阅读:
    vitual box 虚拟机调整磁盘大小 resize partiton of vitual os
    单向链表逆转
    搭建公司的React开发环境
    2018 ICPC 沈阳网络预赛 Fantastic Graph (优先队列)
    背包问题初探
    HDU 2588 GCD (欧拉函数)
    ZOJ
    ZOJ
    ZOJ
    HDU
  • 原文地址:https://www.cnblogs.com/huoxc/p/12844950.html
Copyright © 2011-2022 走看看