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)

原文地址:https://www.cnblogs.com/sd880413/p/8127114.html