• 末学者笔记--Redis数据库及集群


    Redis数据库

    一.概述                                                                                                    

      redis是一种nosql数据库,他的数据是保存在内存中,同时redis可以定时把内存数据同步到磁盘,即可以将数据持久化,并且他比memcached支持更多的数据结构(string,list列表[队列和栈],set[集合],sorted set[有序集合],hash(hash))。相关参考文档:http://redisdoc.com/index.html

     

    二.redis使用场景:                                                  

    登录会话存储:存储在redis中,与memcached相比,数据不会丢失。

    排行版/计数器:比如一些秀场类的项目,经常会有一些前多少名的主播排名。还有一些文章阅读量的技术,或者新浪微博的点赞数等。

    作为消息队列:比如celery就是使用redis作为中间人。

    当前在线人数:还是之前的秀场例子,会显示当前系统有多少在线人数。

    一些常用的数据缓存:比如我们的BBS论坛,板块不会经常变化的,但是每次访问首页都要从mysql中获取,可以在redis中缓存起来,不用每次请求数据库。

    把前200篇文章缓存或者评论缓存:一般用户浏览网站,只会浏览前面一部分文章或者评论,那么可以把前面200篇文章和对应的评论缓存起来。用户访问超过的,就访问数据库,并且以后文章超过200篇,则把之前的文章删除。

    好友关系:微博的好友关系使用redis实现。

    发布和订阅功能:可以用来做聊天软件。

     

    三.redismemcached的比较:                                          

    memcached

    redis

    类型

    纯内存数据库

    内存磁盘同步数据库

    数据类型

    在定义value时就要固定数据类型

    不需要

    虚拟内存

    不支持

    支持

    过期策略

    支持

    支持

    存储数据安全

    不支持

    可以将数据同步到dump.rdb

    灾难恢复

    不支持

    可以将磁盘中的数据恢复到内存中

    分布式

    支持

    主从同步

    订阅与发布(实现异步)

    不支持

    支持

    四.redis日常操作                                                          

    1.安装:

    使用centos7系统

    正常yum install 版本不是最新的。

    最新版本如下:

    ——#wget http://download.redis.io/releases/redis-5.0.0.tar.gz
    ——#tar -zxvf redis-5.0.0.tar.gz


    需要下载编译安装的组件:

    ——#yum install gcc
    ——#yum install gcc-c++

    安装:

    ——#cd redis-5.0.0
    ——#make
    ——#cp src/redis-server  /usr/bin/
    ——#cp src/redis-cli  /usr/bin/

    2.启动redis数据库服务

    1)如果是yum安装直接:

    service redis start

    编译需:

    在redis-5.0.0

    ——#vim redis.conf

    .........................

    bind  192.168.255.27   #需改为本机ip地址

    ........................

    databases  16     #默认数据库个数为16,可改动,最大255

    .......................

    daemonize  yes     #守护进程,默认为no需开启yes;如果不开启,会在前台一直运行,直接卡顿

    ——#redis-server  redis.conf

     

    3.停止redis数据库服务

    service redis stop

    编译:ps -ef | grep redis

    kill -9 pid

    4.连接上redis-server

    redis-cli -p 6379 -h 192.168.255.27

     

    5.添加键与键值:

    set key value

    如:

    set username balabala
    将字符串值value关联到key。如果key已经持有其他值,set命令就覆写旧值,无视其类型。并且默认的过期时间是永久,即永远不会过期。

     

    6.删除:

    del key

      如:del username

     

    7.设置过期时间

    expire key timeout(单位为秒)

    也可以在设置值的时候,一同指定过期时间:

     

    ——>set key value EX timeout

      或:

      setex key timeout value

    如:——>set username feifei ex 50

     

    8.查看过期时间

    ttl key

      如:

    ttl  username

    9.查看当前redis所有的key

    keys *

     

    10.列表操作

    1在列表左边添加元素:

    ——>lpush key value

    将值value插入到列表key的表头。如果key不存在,一个空列表会被创建并执行lpush操作。当key存在但不是列表类型时,将返回一个错误。

     

    2在列表右边添加元素:

    ——>rpush key value

    将值value插入到列表key的表尾。如果key不存在,一个空列表会被创建并执行RPUSH操作。当key存在但不是列表类型时,返回一个错误。

    3查看列表中的元素:

    ——>lrange key start stop

    返回列表key中指定区间内的元素,区间以偏移量startstop指定,如果要左边的第一个到最后的一个lrange key 0 -1

    (0:指第一个键值;-1:指倒数第一个键值

    4移除列表中的元素:

    ·移除并返回列表key的头元素:

      lpop key

    ·移除并返回列表的尾元素:

    rpop key

    5指定返回第几个元素:

    ——>lindex key index

    将返回key这个列表中,索引为index的这个元素。

    如:lindex key 2   #取第三个元素

     

    6获取列表中的元素个数:

    ——>llen key
    如:

    ——>llen languages

    7删除指定的元素:

    ——>lrem key count value

    如:

    ——>lrem languages 3 php   #从上到下删除3个为“php”的元素

    根据参数 count 的值,移除列表中与参数 value 相等的元素。count的值可以是以下几种:

     

    count > 0:从表头开始向表尾搜索,移除与value相等的元素,数量为count

    count < 0:从表尾开始向表头搜索,移除与 value相等的元素,数量为count的绝对值。

    count = 0:移除表中所有与value 相等的值。

     

    11.set集合的操作:

    添加元素:

    ——>sadd set value1 value2....

      如:

    ——>sadd team xiaotuo datuo

    ——>sadd  feige  go python c++ java

     

    查看元素:

      smembers set

      如:

      smembers team

    移除元素:

      srem set member...

      如:

      srem team xiaotuo datuo

    查看集合中的元素个数:

      scard set

      如:

      scard team1

    获取多个集合的交集:

      sinter set1 set2

      如:

      sinter team1 team2

    获取多个集合的并集:

      sunion set1 set2

      如:

      sunion team1 team2

    获取多个集合的差集:

    sdiff set1 set2

    如:

    sdiff team1 team2

    12.hash,哈希操作:

    添加一个新值:

    ——>hset key field value

    即key下有fieldfield下有value

    如:

    ——>hset website baidu baidu.com

     

    将哈希表key中的域field的值设为value

    如果key不存在,一个新的哈希表被创建并进行 HSET操作。如果域 field已经存在于哈希表中,旧值将被覆盖。


    获取哈希中的field对应的值:

      hget key field

      如:

      hget website baidu

    删除field中的某个field

      hdel key field

      如:

      hdel website baidu

    获取某个哈希中所有的fieldvalue

      hgetall key

      如:

      hgetall website

    获取某个哈希中所有的field

      hkeys key

      如:

      hkeys website

    获取某个哈希中所有的值:

    hvals key

    如:

    hvals website

    判断哈希中是否存在某个field

    hexists key field

    如:

    hexists website baidu

    获取哈希中总共的键值对:

    hlen field

    如:

    hlen website

    13. 操作:

    Redis事务可以一次执行多个命令,事务具有以下特征:

    隔离操作:事务中的所有命令都会序列化、按顺序地执行,不会被其他命令打扰。

    原子操作:事务中的命令要么全部被执行,要么全部都不执行。

     

    1开启一个事务:

    multi
    以后执行的所有命令,都在这个事务中执行的。

        

    2执行事务

    exec
    会将在multiexec中的操作一并提交。

    3取消事务:

    discard
    会将multi后的所有命令取消。

     

    4监视一个或者多个key

    watch key...
    监视一个(或多个)key,如果在事务执行之前这个(或这些) key被其他命令所改动,那么事务将被打断。

     

    5取消所有key的监视

    Unwatch

    14.发布/订阅操作:

    给某个频道发布消息:

    publish channel message   #channel:频道,途径

    订阅某个频道的消息:

    subscribe channel    #subscribe:订购,参加

     

    五.持久化                                                          

    redis提供了两种数据备份方式,一种是RDB,另外一种是AOF,以下将详细介绍这两种备份策略:

     

    1.RDB

    1)关闭RDB备份:

    在解压文件下,redis-5.0.0:

    ——#vim  redis.conf

    约在219行,有3个“save”,注释即可

    save 900 1    #900秒内发生一次数据更改就备份一次

    save 300 10    #300秒内发生10次数据更改就备份一次

    save 60 10000    #60秒内发生10000次数据更改就备份一次

    (2)默认备份文件dump.rdb

    内部存放的是具体的值,数据文件进过压缩,恢复快。

     

    2. AOF

    1)开启

    同样在:——#vim  redis.conf

    约在699行:

    appendonly no     #no改成yes,开启

     

    2)备份机制

    ——#vim  redis.conf

    ..................

    # appendfsync always    #每增删改一次就备份一次

    appendfsync everysec    #每一秒备份一次

    # appendfsync no    #跟随操作系统备份(一般半小时一次)

    ..................

    再重启一下redis,会生成文件appendonly.aof,其内备份的是操作的命令。

     

    六.redis搭建主从                                                     

    1.拷贝

    拷贝一份redis配置文件为slave-6380.conf

    cp redis.conf slave-6380.conf

     

    2.编辑文件

    编辑slave-6380.conf文件

    ——#vim slave-6380.conf

    .........................

    bind 192.168.254.41

    slaveof 192.168.254.41 6379   #手动添加行

    .........................

    port 6380

    .........................

    七.redis集群                                                              

    1.集群架构:

    redis集群这里部在2个机器上

     

    第一台:192.168.254.41

    第二台:192.168.254.45

    每一台机器创建3redis配置文件

    2.部署:

    第一台机器配置

    mkdir conf

    touch 7000.conf 7001.conf 7002.conf

    vim 7000.conf     #编辑文件并且把如下内容拷贝进去(剩下的7001.conf7002.conf也是如此,把7000改成70017002即可)

     

    port 7000       #绑定端口

    bind 192.168.254.41   #绑定对外连接提供的ip

    daemonize yes           #开启守护进程

    pidfile 7000.pid          #进程文件名

    cluster-enabled yes    #是否是集群

    cluster-config-file 7000_node.conf    #集群配置文件

    cluster-node-timeout 15000             #集群连接超时时间

    appendonly yes                    #数据持久化类型

     

    第二台机器配置】:

    mkdir conf

    touch 7003.conf 7004.conf 7005.conf

    vim 7000.conf      #编辑文件并且把如下内容拷贝进去(剩下的7004.conf7005.conf也是如此,把7000改成70047005即可)

     

    port 7000       #绑定端口

    bind 192.168.254.45  #绑定对外连接提供的ip

    daemonize yes           #开启守护进程

    pidfile 7000.pid          #进程文件名

    cluster-enabled yes    #是否是集群

    cluster-config-file 7000_node.conf    #集群配置文件

    cluster-node-timeout 15000             #集群连接超时时间

    appendonly yes                    #数据持久化类型

     

    在两台机器上分别执行这3个配置文件

    #192.168.254.41

    redis-server 7000.conf

    redis-server 7001.conf

    redis-server 7002.conf

    #192.168.254.45

    redis-server 7003.conf

    redis-server 7004.conf

    redis-server 7005.conf

    【简易法】:编辑脚本

    ——#vim stat.sh

    #!/bin/bash

    for i in {0..5}

    do

    redis-server 700$i.conf

    done

     

    3.集群相连:

    ——#redis-cli --cluster create 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 127.0.0.1:7006 127.0.0.1:7007 127.0.0.1:7008 --cluster-replicas 1     #1”表示一个从节点,可修改

     

    会出现:Can I set the above configuration? (type 'yes' to accept): 填“yes

    最终:

     

    登录集群:

    不可只以端口节点登录:redis-cli -h 192.168.255.27 -p 7001

    这样进去无法创建,更改。

     

    需:redis-cli -c -h 192.168.255.27 -p 7001

    ——>。。。

    【注】

    集群数据库不支持select切换数据库34....,其只有一个数据库;

    存入数据时,每个数据会切换端口位置,但不影响获取,若有主节点损坏,从点会自动补上。

    ——————————————————————————分割线————————————————————————————

  • 相关阅读:
    百度地图拾取坐标
    调参到脱发(百度大脑)
    git上传到GitHub
    Google搜索
    网络搜索引擎
    函数(函数的分类)
    adb的安装及环境配置
    三大流行数据库(MongoDB、PostgreSQL和Harper)大比拼
    《写给大家看的设计书》,推荐给想了解设计的程序员
    单元测试
  • 原文地址:https://www.cnblogs.com/feige2L/p/10908107.html
Copyright © 2020-2023  润新知