php+redis
Last updated
Was this helpful?
Last updated
Was this helpful?
这一段文章参考
在GitHub上下载Windows版,其中早期版本可以在找到(推荐安装),而可以找到更新的版本。
由于wampserver默认没有提供redis扩展,需要自己下载,在wampserver启动后,打开本地页面http://localhost,点击左下角的phpinfo()
查看自己的版本。主要留意这三条数据:
php version : 7.2.10
Architecture : x64
PHP Extension Build : API20170718,TS,VC15
redis扩展是有两个文件的: php_igbinary.dll
和php_redis.dll
。
选择igbinary
在这个找到各个版本的文件,根据自己的参数来选择,php版本是7.0,TS,VC15,cpu是x64,那我们可以选择2.08里面的php_igbinary-2.0.8-7.2-ts-vc15-x64.zip
选择redis
在这个找到各个版本的文件,同样根据自己的参数来选择下载对应的文件。
下载了上面两个文件之后,将他们解压,获取到他们各自的*.dll
文件,将这个文件放到\wamp\bin\php\php7.2.10\ext
中。然后,在任务栏点击wampserver图标,指向php,选择php.ini
,在弹出的txt编辑器里添加:
重启wampserver,如果在phpinfo()
中能看到redis,则说明扩展已经安装成功了。
在Windows本地安装redis的根目录里启动服务
在php程序中测试下面的指令
如果能输出Hello World
则说明redis能正常存取数据了。
在redis安装目录下的名为redis.windows.conf
与redis.windows-service.conf
分别对应客户端和服务器端的配置项。
可以通过redis-cli.exe
客户端输入命令的方式查看与更改。
配置说明:
Redis默认不是以守护进程的方式运行,可以通过该配置项修改,使用yes启用守护进程
daemonize no
当Redis以守护进程方式运行时,Redis默认会把pid写入/var/run/redis.pid文件,可以通过pidfile指定
pidfile /var/run/redis.pid
指定Redis监听端口,默认端口为6379,作者在自己的一篇博文中解释了为什么选用6379作为默认端口,因为6379手机按键上MERZ对应的号码,而MERZ取自意大利歌女Alessia Merz的名字
port 6379
绑定的主机地址
bind 127.0.0.1
当客户端闲置多长时间后关闭连接,如果指定为0,表示关闭该功能
timeout 300
指定日志记录级别,Redis总共支持四个级别:debug、verbose、notice、warning,默认为verbose
loglevel verbose
日志记录方式,默认为标准输出,如果配置Redis为守护进程方式运行,而这里又配置为日志记录方式为标准输出,则日志将会发送给/dev/null
logfile stdout
设置数据库的数量,默认数据库为0,可以使用SELECT <dbid>
命令在连接上指定数据库id
databases 16
指定在多长时间内,有多少次更新操作,就将数据同步到数据文件,可以多个条件配合
save
Redis默认配置文件中提供了三个条件:
save 900 1
save 300 10
save 60 10000
分别表示900秒(15分钟)内有1个更改,300秒(5分钟)内有10个更改以及60秒内有10000个更改。
指定存储至本地数据库时是否压缩数据,默认为yes,Redis采用LZF压缩,如果为了节省CPU时间,可以关闭该选项,但会导致数据库文件变的巨大
rdbcompression yes
RDB文件是否需要CRC64校验, 若为yes,会在生成RDB文件后计算其CRC64并将结果追加至文件尾,同样,Redis启动Load RDB时,也会先计算该文件的CRC64并与dump时的计算结果对比。优点:可以严格保证RDB的完整性及安全性。缺点:会在dump或load时损失10%的性能。如果要最大化Redis的性能,这个配置项应该用no关掉。
rdbchecksum yes
指定本地数据库文件名,默认值为dump.rdb
dbfilename dump.rdb
指定本地数据库存放目录
dir ./
设置当本机为slav服务时,设置master服务的IP地址及端口,在Redis启动时,它会自动从master进行数据同步
slaveof
当master服务设置了密码保护时,slav服务连接master的密码
masterauth
设置Redis连接密码,如果配置了连接密码,客户端在连接Redis时需要通过AUTH <password>
命令提供密码,默认关闭
requirepass foobared
设置同一时间最大客户端连接数,默认无限制,Redis可以同时打开的客户端连接数为Redis进程可以打开的最大文件描述符数,如果设置 maxclients 0,表示不作限制。当客户端连接数到达限制时,Redis会关闭新的连接并向客户端返回max number of clients reached错误信息
maxclients 128
指定Redis最大内存限制,Redis在启动时会把数据加载到内存中,达到最大内存后,Redis会先尝试清除已到期或即将到期的Key,当此方法处理 后,仍然到达最大内存设置,将无法再进行写入操作,但仍然可以进行读取操作。Redis新的vm机制,会把Key存放内存,Value会存放在swap区
maxmemory
指定是否在每次更新操作后进行日志记录,Redis在默认情况下是异步的把数据写入磁盘,如果不开启,可能会在断电时导致一段时间内的数据丢失。因为 redis本身同步数据文件是按上面save条件来同步的,所以有的数据会在一段时间内只存在于内存中。默认为no
appendonly no
指定更新日志文件名,默认为appendonly.aof
appendfilename appendonly.aof
指定更新日志条件,共有3个可选值: no:表示等操作系统进行数据缓存同步到磁盘(快) always:表示每次更新操作后手动调用fsync()将数据写到磁盘(慢,安全) everysec:表示每秒同步一次(折衷,默认值)
appendfsync everysec
指定是否启用虚拟内存机制,默认值为no,简单的介绍一下,VM机制将数据分页存放,由Redis将访问量较少的页即冷数据swap到磁盘上,访问多的页面由磁盘自动换出到内存中(在后面的文章我会仔细分析Redis的VM机制)
vm-enabled no
虚拟内存文件路径,默认值为/tmp/redis.swap,不可多个Redis实例共享
vm-swap-file /tmp/redis.swap
将所有大于vm-max-memory的数据存入虚拟内存,无论vm-max-memory设置多小,所有索引数据都是内存存储的(Redis的索引数据 就是keys),也就是说,当vm-max-memory设置为0的时候,其实是所有value都存在于磁盘。默认值为0
vm-max-memory 0
Redis swap文件分成了很多的page,一个对象可以保存在多个page上面,但一个page上不能被多个对象共享,vm-page-size是要根据存储的 数据大小来设定的,作者建议如果存储很多小对象,page大小最好设置为32或者64bytes;如果存储很大大对象,则可以使用更大的page,如果不 确定,就使用默认值
vm-page-size 32
设置swap文件中的page数量,由于页表(一种表示页面空闲或使用的bitmap)是在放在内存中的,,在磁盘上每8个pages将消耗1byte的内存。
vm-pages 134217728
27 设置访问swap文件的线程数,最好不要超过机器的核数,如果设置为0,那么所有对swap文件的操作都是串行的,可能会造成比较长时间的延迟。默认值为4
28. 设置在向客户端应答时,是否把较小的包合并为一个包发送,默认为开启
29. 指定在超过一定的数量或者最大的元素超过某一临界值时,采用一种特殊的哈希算法
30 指定是否激活重置哈希,默认为开启(后面在介绍Redis的哈希算法时具体介绍)
31. 指定包含其它的配置文件,可以在同一主机上多个Redis实例之间使用同一份配置文件,而同时各个实例又拥有自己的特定配置文件
redis支持两种持久化策略,分别是RDB和AOF。
可以直接手动使用命令save
立即生成一个rdb文件。请注意,这会阻塞服务器进程,直至rdb文件创建完毕。
RDB方式会根据用户在配置项里的 save <seconds> <changes>
来进行自动生成rdb文件,里面任意一项条件成立则触发save
策略。当save条件被触发时,redis会通过子进程异步写盘,所以会增加内存使用。如果项目不需要通过RDB方式进行持久化,将所有save条件注释掉即可。
RDB是Redis数据的一个非常紧凑的单文件时间点表示。RDB文件非常适合备份。例如,您可能希望在最近24小时内每小时归档您的RDB文件,并且每天保存RDB快照30天。这使您可以在服务器发生意外时轻松恢复不同版本的数据集。
RDB非常适合数据恢复,可以将单个压缩文件传输到远端数据中心。
RDB最大限度地提高了Redis的性能,因为Redis父进程会专注于数据库读写操作,而备份操作则会交给子程序进行对磁盘的读写操作。
如果您需要在Redis停止工作时(例如断电后)将数据丢失的可能性降至最低,则RDB并不好。您可以配置生成RDB的不同保存点(例如,在对数据集进行至少五分钟和100次写入之后,但您可以有多个保存点)。但是,您通常每五分钟或更长时间创建一个RDB快照,因此如果Redis因任何原因停止工作而没有正确关闭,您会丢失最新的数据分钟。
RDB经常需要fork才能使用子进程持久存储在磁盘上。如果数据集很大,Fork可能会非常耗时,如果数据集非常大且CPU性能不佳,可能会导致Redis停止服务客户端几毫秒甚至一秒钟。AOF也需要fork,但你可以调整你想要重写日志的频率而不需要对耐久性进行任何权衡。
将配置项里的appendonly
设置为yes
开启AOF持久化,appendfsync
项设置执行同步的时机。
使用AOF Redis更持久:您可以使用不同的fsync策略:根本不使用fsync,每秒执行fsync,每次查询都使用fsync。使用fsync的默认策略,每秒写入性能仍然很好(使用后台线程执行fsync,并且当没有fsync正在进行时,主线程将努力执行写入。)但是您只能丢失一秒的写入。
AOF日志是仅附加日志,因此如果停电,也没有损坏问题。即使由于某种原因(磁盘已满或其他原因)而令文件损坏,redis-check-aof工具也能够轻松修复它。
当Redis太大时,Redis能够在后台自动重写AOF。重写是完全安全的,因为当Redis继续附加到旧文件时,使用创建当前数据集所需的最小操作集生成一个全新的文件,并且一旦第二个文件准备就绪,Redis会切换两个并开始附加到新的那一个。
AOF以易于理解和解析的格式一个接一个地包含所有操作的日志。您甚至可以轻松导出AOF文件。例如,即使您使用FLUSHALL命令刷新了所有错误,如果在此期间未执行重写日志,您仍然可以保存数据集,只需停止服务器,删除最新命令,然后重新启动Redis。
AOF文件通常比同一数据集的等效RDB文件大。
根据确切的fsync策略,AOF可能比RDB慢。一般来说,fsync设置为每秒性能仍然非常高,并且在fsync禁用的情况下,即使在高负载下也应该与RDB一样快。即使在写入负载很大的情况下,RDB仍能够提供有关最大延迟的更多保证。
获取所有key
获取带有key的数据库信息
获取数据库信息
切换当前数据库(*代表要切换到几号数据库)
删除所有数据库的key
查看当前数据库的key数量
SELECT
SELECT index
切换到指定数据库,数据库索引号用数值型表示,默认是在0号数据库
EXISTS
EXISTS key
检测指定key是否存在
**返回值:**若key
存在,返回1
,否则返回0
。
DELETE/UNLINK
DELETE/UNLINK key1 key2...
移除指定key
。
若redis版本大于4.0时,可使用unlink
对key进行
非阻塞的异步删除。
**返回值:**移除key
的数量。unlink由于是异步删除,所以无返回值。
DBSIZE
获取当前数据库的key
的总数。
**返回值:**返回一个当前数据库的key
总数,整数型
GET
GET key
返回值:返回对应key所关联的字符串值,如果key不存在则返回nil
(false),如果key所存储的值不是字符串,则返回一个错误,get
只能处理字符串值。
SET
SET key value
为指定的key
设置字符串value
值,若当前key
已存在,则覆盖旧值。
**返回值:**总是返回OK(TRUE)
,因为SET
不可能失败。
SETNX
SETNX key value
为指定的key
设置字符串value
值,若当前key
已存在,则不做任何动作。
**返回值:**设置成功,返回1
。设置失败,返回0
。
APPEND
APPEND key value
给一个指定的key
的值追加字符。
**返回值:**追加后字符串的长度
GETRANGE
GETRANGE key start end
HSET
HSET key hashKey value
给指定key
设置hashKey
和值。
**返回值:**如果成功则返回1
;如果指定key
已存在,则覆盖旧值并返回0
,否则返回false
。
HSETNX
HSETNX key hashKey value
当指定的key
不存在时,给指定key
设置hashKey
和值
**返回值:**如果指定的key
已存在,则返回false
否则返回ture
。
HGET
HGET key hashKey
获取指定key
的hash格式的key
对应的值。
**返回值:**若成功则返回以字符串格式返回对应的值,否则返回false
。
HLEN
HLEN key
获取指定key
存在的hash键值对的数量
**返回值:**返回指定key
里存在的hash的键值对数量。若指定key
对应的数据不是hash格式或不存在指定key
则返回false
。
HDEL
HDEL key hashKey1 hashKey2...
移除指定key
里指定的hash的key
。
**返回值:**成功则返回成功删除的数量;如果要删除的hash的key
不存在则返回0
;如果指定的key
不是hash格式,则返回false
。
HKEYS
HKEYS key
获取指定key
里的所有hash的key
。
返回值:返回一个关联数组(key
的顺序是随机的)。
HVALS
HVALS key
获取指定key
里的所有hash的value
。
返回值:返回一个关联数组(value
的顺序是随机的)。
HGETALL
HGETALL key
获取指定key
里的hash对象。
返回值:返回一个关联数组(value
的顺序是随机的)。
HEXISTS
HEXISTS key hashKey
检测指定key
中是否含有指定的hash的key
。
**返回值:**如果存在,则返回true
,否则返回false
。
HINCRBY/HINCRBYFLOAT
HINCRBY/HINCRBYFLOAT key hashKey value
为指定的key
的hash的key
增加定量value
。
两者区别在于:HINCRBY
的value
只能是整数型,而HINCRBYFLOAT
只能是浮点型。
**返回值:**新的value
HMSET
HMSET key array
给指定的key
赋值为hash,所有非字符串值都会被转换为字符串值,存储null
值会变为空字符串值。
**返回值:**成功为true
,失败为false
。
HMGET
HMGET key array(hashKey)
获取指定key
中的hash中指定的key
关联的值。
返回值:返回一个关联数组。
HSCAN
HSCAN key iterator [pattern count]
遍历哈希值里的每一项键值对。
参数说明:
key:要遍历的集合名,
iterator:给函数内部运行的迭代器,需要提前声明为null
,
pattern:要匹配的字符(需传入字符串格式),
count:一次要返回的数据条数。
LPUSH
LPUSH key value [value ...]
将一个或多个值插入表头为key
的列表,添加的顺序为在列表左端(头端)加入。
**返回值:**成功则返回列表的长度。若指定的key
已存在且不是列表,则返回false
。
SADD
SADD key value...
将值添加到指定key
中。
**返回值:**若成功则返回这次添加的元素数量,如果值已存在与该集合,则返回false
。
SCARD/SSIZE
SCARD key
SSIZE key
**返回值:**返回集合里存在的元素的数量,若这个key
不是集合类型,则返回0
。
SISMEMBER/SCONTAINS
SISMEMBER key element
SCONTAINS key element
检测指定元素是否存在于指定key
的集合里
**返回值:**存在则返回true
,否则返回false
。
SDIFF
SDIFF key1 key2...
获取多个集合之间的差集
**返回值:**返回一个字符串数组
SINTER
SINTER key1 key2...
返回多个集合之间的交集。如果只传入一个key
则返回这个key
所有的元素。如果传入的key
中有不存在的key
则返回false
。
**返回值:**返回一个字符串数组,如果无向交的内容,则返回空数组。
SMEMBERS/SGETMEMBERS
获取指定集合key
的所有元素
SSCAN
SSCAN key iterator [pattern count]
参数说明:
key:要遍历的集合名,
iterator:给函数内部运行的迭代器,需要提前声明为null
,
pattern:要匹配的字符(需传入字符串格式),
count:一次要返回的数据条数。
**返回值:**返回一个数组或false
MULIT
标记一个事务的开始
EXEC
结束事务标记并开始执行事务
DISCARD
取消事务,放弃事务块内所有的命令
WATCH、UNWATCH
监视一个或多个key
与取消监视一个或多个key
。
如果在watch
和exec
之间修改了被监视的key
,则事务将会失败,返回false
。
**参数说明:**传入一个key
字符串或数组。
参考