zoukankan      html  css  js  c++  java
  • redis 第一节 redis安装、PHP扩展 、主从

    NoSQL概述  not only sql  属于非关系型数据库

    nosql产品:MongoDB 、Redis

    存储类型:四大分类

    1、键值对(Key-Value)存储的数据库

    2、列存储

    3、文档数据库

    4、图形数据库

    特点:

    1、易扩展

    2、灵活的数据模型

    3、大数据量,高性能

    4、高可用

    redis支持五种数据类型:string(字符串)、hash(哈希),list(列表),set(集合)和zset(sorted set:有序集合)。

    String类型是二进制安全的,意思是redis的string可以包含任何数据,比如jpg图片或者序列化的对象。

    string类型是Redis最基本的数据类型,一个键最大能存储512MB

    Hash(哈希)

    redis hash是一个键值(key=>value)对集合。

    redis hash是一个string类型的field和value的映射表,hash特别适合用于存储对象。

     

     list(列表)

    redis列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)

    实例:

     1 127.0.0.1:6379> lpush runoob shidong #左侧插入
     2 (integer) 5
     3 127.0.0.1:6379> lpush runoob zhangmeilin
     4 (integer) 6
     5 127.0.0.1:6379> 
     6 127.0.0.1:6379> lrange runoob 0 5
     7 1) "zhangmeilin"
     8 2) "shidong"
     9 3) "eku"
    10 4) "rabitmq"
    11 5) "mongodb"
    12 6) "redis"
    13 127.0.0.1:6379> rpush runoob yuinsa  #右侧插入
    14 (integer) 7
    15 127.0.0.1:6379> lrange runoob 0 5
    16 1) "zhangmeilin"
    17 2) "shidong"
    18 3) "eku"
    19 4) "rabitmq"
    20 5) "mongodb"
    21 6) "redis"
    22 127.0.0.1:6379> lrange runoob 0 6
    23 1) "zhangmeilin"
    24 2) "shidong"
    25 3) "eku"
    26 4) "rabitmq"
    27 5) "mongodb"
    28 6) "redis"
    29 7) "yuinsa"
    View Code

    列表最多可存储2的32次方减1元素(每个列表最多可存储40多亿)

    set(集合)

    redis的set是string类型的无序集合。

    集合是通过哈希表实现的,所以添加、删除、查找的复杂度是O(1)

    sadd命令

    添加一个string元素到,key对应的set集合中,成功返回1,如果元素已经在集合中返回0,key对应的set不存在返回错误

    实例:

     1 127.0.0.1:6379> sadd eku redis  #集合添加元素用sadd
     2 (integer) 1    #添加成功返回1    
     3 127.0.0.1:6379> sadd eku mongodb
     4 (integer) 1   
     5 127.0.0.1:6379> smembers runoob  #集合不存在报错返回error
     6 (error) WRONGTYPE Operation against a key holding the wrong kind of value
     7 127.0.0.1:6379> smembers eku   #查看集合中的元素    
     8 1) "mongodb"
     9 2) "redis"
    10 127.0.0.1:6379> sadd eku mongodb
    11 (integer) 0    #添加失败返回0
    View Code

    注意:以上实例中MongoDB添加了两次,但根据集合内元素的唯一性,第二次插入的元素将被忽略。

    集合中最大的成员数为232 - 1(4294967295, 每个集合可存储40多亿个成员)。

    zset (sorted  set :有序集合)

    redis zset 和set一样也是string类型元素的集合,且不允许重复的成员

    不同的是每个元素都会关联一个double类型的分数,redis正事通过分数来为集合汇总的成员进行从小到大的排序。

    zset的成员是唯一的,但分数(score)却可以重复。

    zadd命令

    添加元素到集合,元素在集合中存在则更新对应score

    实例:

    127.0.0.1:6379> zadd name 0 redis#添加元素
    (integer) 1
    127.0.0.1:6379> zadd name 0 mongodb
    (integer) 1
    127.0.0.1:6379> zadd name 0 linux
    (integer) 1
    127.0.0.1:6379> zadd name 0 linux
    (integer) 0
    127.0.0.1:6379> zrangebyscore name 0 5 #查看集合元素
    1) "linux"
    2) "mongodb"
    3) "redis"
    127.0.0.1:6379> zadd name 1 linux
    (integer) 0
    127.0.0.1:6379> zadd name 1 shidong
    (integer) 1
    127.0.0.1:6379> zadd name 20 eku
    (integer) 1
    127.0.0.1:6379> zrangebyscore name 0 10
    1) "mongodb"
    2) "redis"
    3) "linux"
    4) "shidong"
    View Code

     redis连接远程服务器:

    用redis-cli连接:

    [root@bogon redis]# ./bin/redis-cli -h 192.168.1.222 -p 6379 
    192.168.1.222:6379> keys *
    1) "mykey"
    192.168.1.222:6379> set name shidong
    OK
    192.168.1.222:6379> keys *
    1) "mykey"
    2) "name"
    View Code

    连接成功,并能进行远程操作

    redis 键 (key)

    redis键命令用于管理redis的键

    基本语法:

    redis 192.168.222:6379> COMMAND KEY_NAME

    redis  Dump命令

    基本语法:

    DUMP KEY_NAME

    如果key不存在,那么返回nil,否则,返回序列化之后的值。

    实例:

    1 127.0.0.1:6379> set name "Hello,dumping world!"
    2 OK
    3 127.0.0.1:6379> dump name  #序列化键值
    4 "x00x14Hello,dumping world!x06x00xc8	xdex97xb4xb1xbaW"
    5 127.0.0.1:6379> get name
    6 "Hello,dumping world!"
    7 127.0.0.1:6379> dump not-exists-key #如果序列化的键值不存在,则返回nil
    8 (nil)
    View Code

    EXISTS命令:

    redis exist是命令用于检查给定key是否存在。

    语法:基本语法如下

    EXISTS KEY_NAME

    可用版本 :>=1.0.0

    返回值:若key存在返回1,否则返回0.

    实例:

    1 127.0.0.1:6379> exists name#检查key是否存在,如果存在返回1
    2 (integer) 1
    3 127.0.0.1:6379> exists no#如果key不存在返回0
    4 (integer) 0
    View Code

    EXPIRE key seconds命令 为给定key设置过期时间。

    redis  Expire基本语法:

    Expire KEY_NAME TIME_IN_SECONDS

    可用版本 :>=1.00

    返回值:设置成功返回1,当key不存在或者不能为key设置过期时间时(比如在低于2.1.3版本的redis中你尝试更新key的过期时间),返回0

    实例:

    1 127.0.0.1:6379> get name
    2 "Hello,dumping world!"
    3 127.0.0.1:6379> EXPIRE name 10#设定过期时间为10S
    4 (integer) 1
    5 127.0.0.1:6379> get name
    6 "Hello,dumping world!"
    7 127.0.0.1:6379> get name#10秒后查看,键值name已经被删除了
    8 (nil)
    View Code

    EXPIREAT 命令

    expireat的作用和expire类似,都用于为key设置过期时间内,不同在于expireat命令接受的时间参数是UNIX时间戳

    (unix timestamp)

    基本语法如下:

    expireat   KEY_NAME TIME_IN_UNIX_TIMESTAMP

    返回值:设置成功返回1,当key不存在或者不能为key设置过期时间时(比如在低于2.1.3版本的redis中你尝试更改redis的过期时间)返回0.

    实例:

    1 127.0.0.1:6379> set runoobkey redis
    2 OK
    3 127.0.0.1:6379> expireat runoobkey 1293840000#设置超时时间
    4 (integer) 1
    5 127.0.0.1:6379> get runoobkey #超时后自动删除
    6 (nil)
    View Code

    PEXPIRE命令

    redis Pexpire命令和expire命令的作用类似,但是他是以毫秒为单位设置key的生存时间,而不像expire命令那样是以秒为单位。

    基本语法:PEXPIRE key milliseconds

    key不存在或设置失败,返回0

    实例:

    1 127.0.0.1:6379> set runoobkey redis
    2 OK
    3 127.0.0.1:6379> pexpire runoobkey 10000 #设置时间为1万毫秒
    4 (integer) 1
    5 127.0.0.1:6379> get runoobkey #查询键值还存在
    6 "redis"
    7 127.0.0.1:6379> get runoobkey #1万毫秒(十秒)后键值不存在
    8 (nil)
    View Code

    PEXPIREAT命令

    基本语法:PEXPIREAT   KEY_NAME   TIME_IN_MILLISECONDS_IN_UNIX_TIMESTAMP

    用于设置key的过期时间,以毫秒计,key过期后将不在可用,设置成功返回1,当key不存在或者不能为key设置过期时间时返回0 。设置key过期时间的时间戳(unix timestamp)以毫秒计。

    1 127.0.0.1:6379> set name redis
    2 OK
    3 127.0.0.1:6379> pexpireat name 1555555555005#Unix时间戳
    4 (integer) 1
    5 127.0.0.1:6379> get name
    6 "redis"
    View Code

    KEYS pattern

    查找所有符合给定模式(pattern)的key。

    redis KEYS命令基本语法如下:

    KEYS   PATTERN

    返回值:符合给定模式的key列表(Array)

    实例:首先创建一些key,并附上对应值:

     1 127.0.0.1:6379> set name redis
     2 OK
     3 127.0.0.1:6379> set name1 mysql
     4 OK
     5 127.0.0.1:6379> set name2 mongodb
     6 OK
     7 127.0.0.1:6379> keys name*    #查找以name开头的键值key
     8 1) "name1"
     9 2) "name2"
    10 3) "name"
    View Code

    move命令

    redis  move命令用于将当前数据库的key移动到给定的数据库db当中。

    move命令基本语法如下:

    MOVE   KEY_NAME   DESTINATION_DATABASE

    返回值:移动成功返回1,失败返回0.

    实例1:把键值移动到另外一个数据库

     1 127.0.0.1:6379> set song "secret base -Zone" #设置键值
     2 OK
     3 127.0.0.1:6379> move song 1  #移动键值到数据库1
     4 (integer) 1
     5 127.0.0.1:6379> exists song #在数据库0中键值song已经不存在
     6 (integer) 0
     7 127.0.0.1:6379> select 1 #选择数据库1
     8 OK
     9 127.0.0.1:6379[1]> exists song #查看数据库1中键值song是否存在
    10 (integer) 1
    11 127.0.0.1:6379[1]> get song  #查看键值song存在
    12 "secret base -Zone"
    View Code

    实例2:当两个数据库中存在相同的key时

     1 127.0.0.1:6379[1]> select 0  #选择数据库0
     2 OK
     3 127.0.0.1:6379> set fruit "banana" #设置key fruit
     4 OK
     5 127.0.0.1:6379> selct 1 #选择数据库1
     6 OK
     7 127.0.0.1:6379[1]> set fruit "apple" #设置key fruit
     8 OK
     9 127.0.0.1:6379[1]> select 0 # 选择数据库0
    10 OK
    11 127.0.0.1:6379> move fruit 1 #移动key fruit 到数据库1
    12 (integer) 0
    13 127.0.0.1:6379> get fruit  #查看数据库0 的fruit 发现value没变
    14 "banana"
    15 127.0.0.1:6379> select 1 #切换到数据1 
    16 OK
    17 127.0.0.1:6379[1]> get fruit #查看数据库1 的fruit 发现也没有变化
    18 "apple"
    View Code

    PERSIST key  命令

     作用:移除给定key的过期时间,key将持久保持不过期

    语法命令: PERSIST KEY_NAME

    返回值:当过期时间移除成功时,返回1,如果key不存在或key没有设置过期时间,返回0.

    实例:

    1 127.0.0.1:6379[1]> set name "helo" #设置key-value值
    2 OK
    3 127.0.0.1:6379[1]> expire name 20 #设定过期时间20秒
    4 (integer) 1
    5 127.0.0.1:6379[1]> persist name #移除给定key name的过期时间
    6 (integer) 1
    7 127.0.0.1:6379[1]> get name  #查看key name,name存在
    8 "helo"
    View Code

    Pttl 命令

    redis pttl命令以毫秒为单位返回key的剩余过期时间。

    返回值:当key不存在时,返回-2 当key存在但没有设置剩余时间时,返回-1。否则,以毫秒为单位返回key的剩余生存时间。

    注意:在redis2.8以前,当key不存在,或者key没有设置剩余生存时间呢时,命令都返回-1。

    实例:

     1 127.0.0.1:6379[1]> flushdb  #清楚redis数据库
     2 OK
     3 127.0.0.1:6379[1]> pttl key #查看key的剩余过期时间,发现key不存在
     4 (integer) -2
     5 127.0.0.1:6379[1]> keys *
     6 (empty list or set)
     7 127.0.0.1:6379[1]> set key value
     8 OK
     9 127.0.0.1:6379[1]> keys *
    10 1) "key"
    11 127.0.0.1:6379[1]> get key
    12 "value"
    13 127.0.0.1:6379[1]> pttl key #没有设置过期时间,但是键值存在返回-1
    14 (integer) -1
    15 127.0.0.1:6379[1]> pexpire key 10086 #给key设置过期时间
    16 (integer) 1
    17 127.0.0.1:6379[1]> pttl key #查看剩余时间
    18 (integer) 4551
    19 127.0.0.1:6379[1]> pttl key
    20 (integer) 2671
    21 127.0.0.1:6379[1]> pttl key
    22 (integer) 1158
    23 127.0.0.1:6379[1]> pttl key
    24 (integer) 382
    25 127.0.0.1:6379[1]> pttl key #剩余时间一到,键值已被删除,返回-2
    26 (integer) -2
    27 127.0.0.1:6379[1]> get key #查看键值已经不存在
    28 (nil)
    View Code

    TTL命令

    ttl命令以毫秒为单位返回key的剩余过期时间

    ttl命令基本语法:TTL  KEY_NAME

    返回值:当key不存在时,返回-2,当key存在,但是没有剩余生存时间时,返回-1,否则,以秒为单位,返回key的剩余时间。

    实例:

     1 127.0.0.1:6379[1]> ttl name #没有key时,查看剩余时间,返回-2
     2 (integer) -2
     3 127.0.0.1:6379[1]> set name "Hello World"
     4 OK
     5 127.0.0.1:6379[1]> ttl name#key存在,但是没有过期时间,返回-1
     6 (integer) -1
     7 127.0.0.1:6379[1]> expire name 20#设置key剩余时间
     8 (integer) 1
     9 127.0.0.1:6379[1]> ttl name #查看key并返回剩余时间
    10 (integer) 14
    11 127.0.0.1:6379[1]> ttl name #剩余时间已过,key已被删除,返回-2
    12 (integer) -2
    13 127.0.0.1:6379[1]> get name #查看key是否存在,发现key已经被移除了
    14 (nil)
    View Code

     RANDOMKEY命令

    基本语法:RANDOMKEY

    返回值:当数据库不为空时,返回一个key,当数据库为空时,返回nil。

    实例1:

     1 127.0.0.1:6379> mset fruit "apple" drink "beer" food "cookies"
     2 OK                      #mset同时设置一个或多个key—value值
     3 127.0.0.1:6379> randomkey #随机取出一个键值,并不删除
     4 "drink"
     5 127.0.0.1:6379> randomkey 
     6 "fruit"
     7 127.0.0.1:6379> keys * #查看所有的键值
     8 1) "food"
     9 2) "fruit"
    10 3) "drink"
    11 #数据库为空
    12 127.0.0.1:6379> flushdb  #删除当前数据库所有key
    13 OK
    14 127.0.0.1:6379> randomkey #随机取出,查看结果取出为空,证明所有的key已经被删除
    15 (nil)
    View Code

    redis Rename命令

    rename命令用于修改key的名称。

    基本语法如下:RENAME  OLD_KEY_NAME  NEW_KEY_NAME

    返回值:改名成功时提示OK,失败时候返回一个错误,当OLD_KEY_NAME 和NEW_KEY_NAME相同,或者OLD_KEY_NAME不存在时,

    返回一个错误,当NEW_KEY_NAME时已经存在时,RENAME命令将覆盖旧值。

    实例1:

    127.0.0.1:6379> set message "Hello world"
    OK
    127.0.0.1:6379> rename message greeting #给key重命名
    OK
    127.0.0.1:6379> keys *
    1) "greeting"
    127.0.0.1:6379> get greeting
    "Hello world"
    127.0.0.1:6379> get message
    (nil)
    127.0.0.1:6379> rename fake never_exists#为不存在的key重命名,则报错
    (error) ERR no such key
    View Code

    实例2:当newkey已经存在时,那么要更改名字的key会改名为新key,已经存在的旧的new_key则会被覆盖掉。

     1 1 127.0.0.1:6379> set pc "lenovo"
     2  2 OK
     3  3 127.0.0.1:6379> set preson "dell"
     4  4 OK
     5  5 127.0.0.1:6379> rename pc preson
     6  6 OK
     7  7 127.0.0.1:6379> get pc   #pc键值已经不存在
     8  8 (nil)
     9  9 127.0.0.1:6379> get preson #旧的person被覆盖掉
    10 10 "lenovo"
    View Code

    RENAMENX key newkey命令

    作用:该命令用于在新的key不存在时修改key的名称。如果新的key已经存在,那么则修改失败

    基本语法: RENAMENX  OLD_KEY_NAME   NEW_KEY_NAME

    返回值:修改成功时,返回1,如果new_key_name已经存在,返回0.

    实例:newkey不存在,改名成功

    127.0.0.1:6379> set player "KOF"
    OK
    127.0.0.1:6379> exists best #键best不存在
    (integer) 0
    127.0.0.1:6379> renamenx player best #更名成功
    (integer) 1
    127.0.0.1:6379> exists player
    (integer) 0
    127.0.0.1:6379> exists best
    (integer) 1

    实例:newkey存在,更名失败

     1 127.0.0.1:6379> get best
     2 "KOF"
     3 127.0.0.1:6379> set player "Hello"
     4 OK
     5 127.0.0.1:6379> reanmenx best player #更名为已经存在的newkey则报错
     6 (error) ERR unknown command 'reanmenx'
     7 127.0.0.1:6379> renamenx best player
     8 (integer) 0
     9 127.0.0.1:6379> keys *
    10 1) "best"
    11 2) "player"
    View Code

    type命令

     作用:该命令用于返回key所储存的值的类型。

    基本语法:TYPE  KEY_NAME

    返回值:返回key的数据类型,类型有:

    none(key不存在)

    string(字符串)

    list(列表)

    set(集合)

    zset(有序集合)

    hash(哈希表)

     1 127.0.0.1:6379> set weater "sunny"  #字符串
     2 OK
     3 127.0.0.1:6379> type weater  
     4 string
     5 127.0.0.1:6379> lpush bool "Hello"  #列表
     6 (integer) 1
     7 127.0.0.1:6379> type bool
     8 list
     9 127.0.0.1:6379> sadd pat "dog" #集合
    10 (integer) 1
    11 127.0.0.1:6379> type pat
    12 set
    View Code

    Redis安装:

    Redis是C语言编写的,安装在linux上,需要先安装gcc-c++进行编译。

    1、tar zxf redis-3.0.7.tar.gz

    2、cd redis-3.0.7

    3、make  #编译

    4、安装:

    make  PREFIX=/usr/local/redis install

    5、后台启动:

    (1)首先修改redis配置文件

    daemonize no  改为

    daemonize yes

    (2)启动

    ./bin/redis-server ./redis.conf

    redis扩展

    1、解压压缩包

    unzip phpredis-master.zip

    2、进入解压出来的包

    cd phpredis-master

    (找到PHP安装目录中的phpize进行扩展)

    /home/php/bin/phpize

    ./configure --with-php-config=/home/php/bin/php-config

    make

    make install (安装之后会返回目录)

    把目录加入到PHP的安装目录中的php.ini中:

    extension_dir = ''

    extension = redis.so

    3、重启PHP

    service php-fpm restart

    重启nginx

    4、浏览器中访问192.168.1.251:/info.php

    这样PHP成功扩展redis

    redis 主从配置

    拷贝已经安装的redis的配置文件

    cp  redis.conf     redis_6380.conf

    cp  redis.conf   redis_6381.conf

    进入redis_6380.conf修改:

    daemonize  yes

    port 6380

    pidfile   /var/run/redis_6380.pid

    slaveof  127.0.0.1(主ip)  6379(主端口)

    进入redis_6381.conf修改:

    daemonize  yes

    port 6381

    pidfile   /var/run/redis_6381.pid

    slaveof  127.0.0.1(主ip)  6379(主端口)

    启动redis主、从即可

    ./bin/redis-server  ./redis_6380.conf

    ./bin/redis-server  ./redis_6381.conf

    这时在redis主库写入数据,那么从库也会同步过来了

    主库:

    [root@bogon redis]# ./bin/redis-cli

    从库(1):

    从库(2):

    到此一台服务器配置多个redis实例并且完成redis主从配置

    redis-3.0.7 主从高可用 详细配置

    部署规划:

    192.168.1.246  主节点

    192.168.1.245  从节点

    主机节点:

    主节点redis.conf配置

    daemonize yes                         #让redis后台运行
    pidfile /apps/run/redis/redis.pid     #指定redis的pid文件存放位置
    port 6379                             #redis使用端口                                           
    logfile "/apps/logs/redis/redis.log"  #log文件的位置。如果为空,则默认打印到/dev/null
    requirepass 123456                    #redis的密码,如果不需要密码验证,则可以不做修改
    masterauth 123456                     #如果上面设置了redis的密码,则这里必须设置,而且要和他一样。当该节点作为从节点连接主节点时,要用到这个密码和主节点做校验。
    View Code

    启动redis:

    ./bin/redis-server ./redis.conf

    查看当前主从状态

    ./bin/redis-cli -h 192.168.1.246 -p 6379  -a 123456

    role:master

    可以看到,192.168.1.246为主,当前的192.168.1.245为slave(因为已经做好了所以显示192.168.1.245为slave,如刚开始做则connected_slaves为0)

    接下来就是配置sentinel.conf了(把sentinel.conf从源文件中,拷贝到redis安装目录下边,并进行如下配置):

     要修改的就是上面几项,一定要特别注意sentinel auth-pass这一项,别忘记改,修改好后,先拷贝一个备份

    启动sentinel

    ./bin/redis-sentinel sentinel.conf

    查看sentinel日志:

    第一个表示当前的sentinel 的ID,第二行显示当前的主节点是192.168.1.246

    查看sentinel的状态:

    ./bin/redis-cli -h 192.168.1.246 -a 12345 -p 26379

    从节点

     redis.conf的配置与主节点只有一点不同,增加下面一行:

    slaveof  192.168.1.246  6379

    启动redis

    ./bin/redis-server redis.conf

    在从节点上查看主从状态:

    可以看到当前节点为slave。

    sentinel的配置和主节点保持一致就可以,启动sentinel:

    ./bin/redis-sentine sentinel.conf

    查看sentinel log:

     查看下sentinel状态:

    可以看出,当前有两个sentinels,一个为slave。

    到此,redis主从高可用就算配置结束了,验证就不写啦,下班喽

    jedis 入门

    jedis就是连接redis的基本操作

    jedis 是redis官方首选的Java客户端开发包

    127.0.0.1:6379[1]> ttl name
    (integer) -2
    127.0.0.1:6379[1]> set name "Hello World"
    OK
    127.0.0.1:6379[1]> ttl name
    (integer) -1
    127.0.0.1:6379[1]> expire name 20
    (integer) 1
    127.0.0.1:6379[1]> ttl name
    (integer) 14
    127.0.0.1:6379[1]> ttl name
    (integer) -2
    127.0.0.1:6379[1]> get name
    (nil)

  • 相关阅读:
    也用一下Windows Live Writer
    常用16种iOS视图切换动画
    iPad平板电脑程序开发基础规则(源址:http://www.cocoachina.com/bbs/simple/?t82559.html)
    NSXMLParser详解
    UIScrollView用法
    使用UIActivityIndicatorView 和多线程
    为视图加边框
    iPhone SDK开发基础之iPhone程序框架
    NSXMLParser详解(事例)
    iOS开发 小知识点
  • 原文地址:https://www.cnblogs.com/sd880413/p/8127114.html
Copyright © 2011-2022 走看看