redis用法分析

本文实例讲述了PHP数据库操作redis用法。分享给大家供大家参考,具体如下:

memcache虽然好用,解决了数据库遇到高并发时的IO问题,但还有很多问题丞待解决:

1、数据持久性问题,memcache用内存进行存储,一旦memcache服务器宕机,那么所存储的数据全部丢失。

2、memcache存储的数据类型单一,只支持key-value型的数据,要存储复杂类型的数据,必然需要PHP脚本的大量逻辑操作。

 

一、redis基本介绍

redis也是一个内存非关系型数据库,它拥有memcache在数据存储上的全部优点,而且在memcache的基础上

增加了数据持久性功能,redis用rdb和aof两种方式实现数据持久性,在服务器突然宕机时也能几乎保留已存的全部数据。

增加了string(字符串)、set(集合)、sorted_set(有序集合)、hash(哈希)、list(链表)数据类型,方便了多类型的存储和数据库操作。
增加了安全验证(可为服务器设置连接密码)。
redis的主从分离等系统更完善(官方开发)。
原生支持发布/订阅、队列、缓存等工具。

当然,相比较memcache,它的数据库操作也较为复杂。

 

二、redis的应用场景和安装

redis除了可以用在memcache能用的地方,它还可以用在:

可以用链表来存储数据,读取其最新信息。
可以用有序列表存储数据,读取其排行榜数据
可以用集合来存储关注/被关注信息。

在官网(http://redis.io/)下载到它的最新版本,直接解压,因为redis官方已经编译过了,直接进行make / make test ,在make install时可以指定其安装路径。

安装完成后,将安装包里的redis的conf文件mv到安装目录的bin目录下,它是配置和启动redis所必需的。

除此,安装目录文件下bin目录里还有如下文件。

redis-benchmark //性能测试工具 -n xxx 表示发出xxx条命令用来测试
redis-check-aof //检查aof日志的工具
redis-check-dump //检查rbd日志的工具
redis-cli       //客户端
redis-server    //redis的服务器进程
redis-sentinel //redis哨兵模式的进程

我们用vim打开redis.conf来简单配置redis服务器。

将daemonize 选项改为yes来后台运行
database n 设置一个redis服务器里有n个服务器,默认为0-15共16个
port n 来设置redis服务器的监听端口
设置requirepass yourpassword来设置密码,客户端连接后用auth password来通过验证

我们使用./redis-server ./redis.conf命令来打开redis服务器。

使用./redis-cli [-p port]来连接服务器(默认6379)。

 

三、redis数据类型的命令

1、string(字符串类型)命令

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

set key n value  //设置值,有效期为n秒

set key value //设置值

get key //获取值

del key //删除值

incr|decr key  //自增|自减key

incrby|decrby key n //将key值自增或自减n

setrange key n value //设置key的原来值从n字符开始,用value代替

mset key1 value1 key2 value2... //设置多个值(成功返回ok,失败返回0,不能覆盖已存在key)

mget key1 key2.. //获取多个key的值

append key value1  //给key的原来value追加value1

strlen key   //获取key长度

select n//选择第n个数据库

ttl key //查询key的过期时间,-1表示永不过期,不存在的为-2

type key //获取key的存储类型

flushdb //清除当前数据库中的值

shutdown [nosave]//关闭服务器[不存储]

2、hash(哈希类型)命令(适用于存储对象,是一个string类型的field和value的映射表)

1

 

2

3

4

5

6

7

8

9

10

11

12

hset hashset(hash表名)key value   //设置hashset表key的值为value(例:hset user:001 name zhangsan)
hget hashset key  //获取hash表的key值

hsetnx hashset key value  //设置hashset表key值为value,如果key不存在,先创建,存在返回0

hmset hashset key1 value1 key2 value2... //设置多个值

hmget hashset key1 key2... //获取多个key值

hincrby|hdecrby hashset key n //将key值自增或自减n

hexists hashset key  //判断hashset表是否存在key

hlen hashset //返回hashset表的key数量

hkeys hashset  //返回hashset表的所有key

hvals hashset  //返回hashset表的所有value

hgetall hashset   //返回hashset表的所有key和value
hdel hashset key  // 删除hash表中的一个key

3、list(链表)命令:既可以作为栈,也可以作为队列(push压入,pop弹出,l头部,r尾部)

(栈:先进后出,队列:先进先出)

1

 

2

3

4

5

6

7

8

9

10

lpush/rpush list value1 [value2 value3...] //将value压入链表头/尾(取出时候都是从头开始依次取出

lpop/rpop list //弹出list链表头/尾的第一个值

llen list //获取链表长度

lrange mylist 0 -1    //从mylist链表中头部第一位取到最后一位

linsert mylist before one two  //如果链表从头到尾已有three,one,先中间插入two

lset mylist n four  //更改链表mylist的下标为n的值改为four

lrem mylist n one   //删除n个链表mylist中值为one的值

ltrim mylist n m   //保留mylist链表的下标从n到m的值

rpoplpush list1 list2  //从list1的尾部弹出最后一个元素,并压入到list2的头部第一个元素上面去

lindex mylist n   //返回mylist链表下标为n的值

4、set(集合[无序类型])命令

1

2

3

4

5

6

 

7

8

9

10

11

12

13

14

sadd myset value //往集合myset中添加value

smembers myset //查看集合myset中的全部数据

srem myset value  //删除集合myset中的元素value

sismember myset value //判断value是否是集合myset中的一个元素(是:返回1,否:返回0)

spop myset  //随机弹出返回集合myset中的一个元素,并删除之

sdiff myset1 myset2  //返回集合myset1和myset2的差集,并且以myset1为标准(返回myset2中没有myset1的元素,谁在前面以谁为标准)

sdiffstore myset3 myset1 myset2  //把集合myset1和myset2的差集存储到集合myset3中

sinter myset1 myset2  //返回集合myset1和myset2的交集

sinterstore  myset3 myset1 myset2  //把集合myset1和myset2的交集存储到集合myset3中

sunion myset1 myset2  //返回集合myset1和myset2的并集

sunionstore  myset3 myset1 myset2  //把集合myset1和myset2的并集存储到集合myset3中

smove myset1 myset2  one  //把集合myset1的one元素移动到集合myset2中去

scard myset  //查看集合myset中的元素个数

srandmember  myset  //随机返回集合myset的一个元素,但不删除

5、sorted set(有序集合)命令

 

1zadd myzset score1 key1 score2 key2 score3 key3... //向有序集合中添加key,并定义其score(整数),集合会用score对其排序(如果key3已经存在,则新的score3将代替之前的score)
2zrange myzset a b [withscores]    //从下标第a到第b显示有序列表中的值 (a为0,b为-1时显示全部),[有withscores时则显示各个值的score]
3

zrank/zrevrank myzset key   //升序/降序显示返回key在有序集合myzset中的位置(即索引值下标,从0开始)

zrangebyscore n m withscores  //返回集合中给定score区间从n到m的元素

4zrem myzset key  // 删除有序集合myzset中的key

5

6

7

8

zcard myzset    //返回有序集合myzset中所有元素的个数

zincrby myzset n "one"  //将集合myset中的key为"one"的score增加n,key没有存在则重新插入集合中

zcount myzset n m   //返回集合myzset中score在给定区间n到m的数量

zremrangebyrank myzset n m   //删除集合myzset在给定索引区间下n到m的元素

           redis命令繁多,这里只列了一点简单的,具体命令可以其官网或其中文站http://www.redis.cn/查看翻译文档

四、redis的常用命令

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

key *  //查看所有的key

key st*   //查看以st开头的key

exist  key  //判断key是否存在(返回1存在,0:不存在)

expire  key  n  //设置key的有效时间为n秒(ttl  key :查看key剩余多少有效时间)

move key n  //移动key到第n个数据库,要先select n选择数据库共有16个数据库(n值:0-15)

persist key  //移除给定key的过期时间

randomkey  //随机返回key空间的一个key

rename  key1 key2  //给key1重新命名为key2

type  key  //返回key的类型

ping  //判断是否连接成功,redis服务是否开始

quit  |  exit  //退出连接

dbsize  //返回当前数据库的key的数目

info  // 获取服务器的信息和统计

config get *  //实时传储收到的请求

flushdb  // 删除当前选择数据库中的所有key

flushall  //删除所有数据库中的所有key

 

五、redis高级应用特性

1、安全性

设置进入redis密码

修改redis.conf文件里面添加

requirepass XXX(密码)

重启redis服务

定位到redis目录下,两种授权方式:

(1)redis-cli -a XXX(密码)进入,不需要每次授权

(2)redis-cli进入后,命名auth XXX(密码)授权

2、redis的主从复制

(Master主机,slave从机)

clone一个虚拟机,先ping一下是否ping通主机,然后在新的虚拟机的redis.conf中加入下面配置:

(ifconfig eth0:查看虚拟机ip,ifconfig eth0 ip地址:重新修改ip地址)

 


主从复制时,主从都要以自己的.conf文件来启动服务器。主服务器可以将rdb关闭,以从服务器来产生rdb,加快主服务器的速度。

从服务器复制一个redis6380.conf文件,设置端口,pid存放文件,只读,主服务器的密码。

1

2

3

4

port 6380

pidfile filename

slave-read-only yes

masterauth password

设置完成后,分别用不同的conf文件打开服务器。

考虑到主服务器宕机的情况,我们用sentinel redis哨兵来监测服务器状态,在主服务器宕机之后做出反应。sentinel是redis集成的,我们只需要将安装包里的sentinel.conf文件拷贝到redis/bin目录下,使用redis-sentinel进程文件来启动服务器即可。

1

2

3

4

5

6

port 26379                    //sentinel监听的端口号

daemonize yes                  //后台启动进程

sentinel monitor mymaster 192.168.100.211 6379 2 //设置主进程ip和端口号,并设置两个哨兵发现主服务器长时间无法连接才判定其宕机

sentinel down-after-milliseconds mymaster 30000 //30000毫秒连接不上判定为无法连接

sentinel parallel-syncs mymaster 1        //一个主服务器打开时,同时复制的从服务器数,太大的话会造成服务器瞬间拥堵

sentinel failover-timeout mymaster 900000    //在90000秒内哨兵不再试图恢复原主服务器

3、redis的事务

redis中的事务与mysql的类似,只有语句有些不同。

1

2

3

4

5

            redis             mysql

开始事务    multi             start transition

                事务中的query语句

执行事务    exec              commit

回滚事务    discard           roll back

(redis事务,当事务中的队列某个命令出错时,不会影响其他命令的进行)


(之前已经改动age为30,这时提交的age为20小于30,提交失败)


对于并发影响,redis有watch语句控制,被watch语句监测的key值一旦在事务提交前发生变化,则事务自动被取消回滚。

watch key1 [key2...]
unwatch 取消所有监测。


4、redis的数据持久化


redis通过rdb和aof两种方式实现数据持久化,两种数据持久化方式都会占用CPU资源,拖慢redis的执行效率,一般两种模式配合使用。

rdb方式的主要原理就是达到某一写入条件后把内存中的所有数据的快照保存一份到磁盘上,数据恢复时用数据快照恢复。

aof方式是通过将每条redis执行命令记录入文本文件,恢复数据时重复执行记录的命令。

 

rdb方式实现数据持久化

用save/bgSave命令可以主动使用rdb方式[后台]存储rdb

修改redis.conf文件进行配置

1

2

3

4

5

6

save m n          //在m秒内有n次修改即进行一次快照,保存点很重要,一般会配置多个条件,满足其中之一就保存

stop-writes-on-bgsave-error yes //在进行快照的过程中如果出错,则停止写入

rdbcompression yes     //设置进行数据压缩

rdbchecksum yes       //导入数据时检查文件是否损坏

dbfilename xxx.rdb     //导出的文件名

dir path          //导出的文件路径

aof方式实现数据持久化

aof持久化的问题在于将每条指令都记录下来,即使是对一个键的反复操作,这样会导致aof文件越来越大,使用aof重写将会大大减小aof文件的体积,因为它是在最后将数据库内数据的状态统一逆化为命令,而不论一个key经过了多少次变化。使用 bgrewrite 命令可手动重写aof文件。

 

配置redis.conf文件:

1

2

3

4

5

noapppendfsync-on-rewrite yes    //设置导出rdb时停止写入aof,aof会被写在内存队列里,dump rdb 完成后统一进行写入操作。

appendfsync everysec        //每秒写入一次

appendfilename           //path/filename.aof

auto-aof-rewrite-percentage 100   //文件大小增长100%时重写

auto-aof-rewrite-min-size 64m    //文件至少达到64m时重写


5、redis原生发布和订阅功能

redis原生发布和订阅功能,它类似于设计模式中的观察者模式,被订阅对象一旦发布了新的消息,那么所有订阅对象都会收到这条消息。使用方式为:

1

2

3

4

subscribe key //订阅某个key,如果这个key发布了新的消息,则会收听到

public key value//发布消息key,值为value,返回值是收到这个消息的人的个数

unsubscribe key //取消监听

psubscribe key1 key2/pattrn //[根据模式]监听多个key

 

6、虚拟内存使用


PHP操作redis服务器

安装好php的redis扩展后(具体可参考前面的文章 Linux下php安装Redis扩展的方法 http://www.jb51.net/article/99775.htm),就可以直接使用redis的类函数库了。

如下是典型的redis应用。

1

2

3

4

5

$redis=new Redis();           //实例化一个Redis对象

$redis->connect('host',port);      //连接redis服务器

$redis->auth('password');        //用密码认证

$redis->set($key,$value[,$expire_time]);//设置一个值

$content=$redis->get($key);       //获取值

具体函数使用可以看官方的文档

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值