Home  >  Article  >  php教程  >  Redis 学习 - 尼农小道

Redis 学习 - 尼农小道

WBOY
WBOYOriginal
2016-05-20 11:40:571551browse

非关系型数据库Redis V3.0( 6379 端口)

 

端口含义:

 

开发者:

 

国内对NoSQL的使用:

 

 

 

 

 

产品官网:http://redis.io/

参考手册:http://redisdoc.com/

中文文档:http://redisdoc.com/

redis的github地址:https://github.com/antirez/redis

 

Redis is an open source, BSD licensed, advanced key-value cache and store(存储). It is often referred to as a data structure server since keys can contain strings, hashes, lists, sets, sorted sets, bitmaps and hyperloglogs.

Redis是开源,BSD许可,高级的key-value缓存存储系统。 可以用来存储字符串,哈希结构,链表,集合,因此,常用来提供数据结构服务。 通常也叫做 结构化 非关系型数据库

 

缓存:因为redis和memcache一样,也是一个内存缓存系统。

但是它多了一个持久化的功能,可以将内存之中的数据,同步到磁盘上,防止数据的丢失。

一、系统概述

1.环境检查

[root@asion ~]# lsb_release -a

LSB-Version:core-4.0-ia32:core-4.0-noarch:graphics-4.0-ia32:gr    aphics-4.0-noarch:printing-4.0-ia32:printing-4.0-noarch

Distributor ID: CentOS

Description: CentOS release 5.5 (Final)

Release: 5.5

Codename: Final

 

# uname -a ###unix name -a all

 

# cat /etc/issue

 

注意:当获取操作系统信息之后,下载对应操作系统的源码包

 

2. 编译前环境准备(源码编译前需执行如下命令)

[root@asion ~]# yum -y install make apr* autoconf automake

curl-devel gcc gcc-c++ zlib-devel openssl openssl-devel pcre-devel gd kernel keyutils patch     perl kernel-headers compat* mpfr cpp glibc libgomp libstdc++-devel ppl cloog-ppl     keyutils-libs-devel libcom_err-devel libsepol-devel libselinux-devel krb5-devel zlib-devel     libXpm* freetype libjpeg* libpng* php-common php-gd ncurses* libtool* libxml2     libxml2-devel patch cmake

 

注意:安装lamp环境报错?

error libiconv_open undefined

iconv('gb2312','utf8',$data);

 

http://blog.csdn.net/felixit0120/article/details/7454862

二、编译安装

  1. 下载源码到 /usr/local/src/ 目录下

    [root@asion src]# wget http://download.redis.io/releases/redis-3.0.3.tar.gz

     

    2. 解压源码文件

    [root@asion src]# tar -zxvf redis-3.0.3.tar.gz

     

  2. 进入解压目录直接执行 make 命令, (无须执行 ./configure 命令),然后执行 make install (注意设置路径) centos 5.5 (企业版5) (企业版4

    注意:在32位操作系统上报错信息

     

    解决方案:

    在make的时候 指定操作系统位数 CFLAGS='-march=i686' 即可

    如果在源码包内执行过编译,需要先清除一下环境,执行 make clean命令即可

    32位系统安装

    [root@asion src]# cd redis-3.0.3

    [root@asion redis-3.0.3]# make CFLAGS="-march=i686" (在32位系统下需加上该编译参数。64位不需要)

     

    32操作系统:

     

    64位操作系统:

    1. 如果在Linux下不需要执行该命令 可以使 ctrl+c 来换到下一行

    2. 如果在Linux下需要跳转到该命令的开头 可使用 ctrl+a 来跳转到开头

    3. 如果在Linux下需要跳转到该命令的末尾 可以使用 ctrl+e 来跳转到末尾

     

    在make install 的时候指定安装路径:PREFIX 需要大写

    [root@asion src]# make PREFIX=/usr/local/redis/ install

     

    复制redis的配置文件到redis的安装目录下

    [root@asion redis-3.0.3]# cp redis.conf /usr/local/redis/

     

    4. 编译安装完成后,进入安装目录 /usr/local/redis/ 启动服务

    [root@asion redis]# ls

    bin redis.conf

    a. 进入 bin 目录

    [root@asion bin]# ls

    无配置文件运行:

    启动服务:

    显示界面:

    读取配置文件信息启动:

    b. [root@asion bin]# ./redis-server ../redis.conf

    成功运行:

    注意:此时redis的启动占据了终端,只需要

    修改配置redis.conf配置文件,即可让服务在后端运行

     

    需要注意redis.conf文件的位置

    执行启动命令:

     

    查看服务器是否启动:

    # ps aux | grep redis-server

     

    关闭服务

    # pkill -9 redis-server

     

    三、客户端操作

    1. 通过客户端连接到服务器端,并测试

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

    四、Redis相关命令

    > set KEY VALUE //设置KEY 的值为 VALUE

    作用: 设置键的值

     

     

    > get KEY //获取KEY 的值

    作用: 获取键的值

    返回值: 成功返回value ,失败返回 nil

    获取不存在的值

     

    > del KEY1 KEY2 ... KEYn //删除一个和多个键

    作用: 删除1个或多个键

    返回值: 不存在的key忽略掉,返回0;返回真正删除的key的数量

    删除多个:成功则返回删除的个数

     

    > rename KEY NEWKEY //给KEY赋一个新的键名

    作用: 给key赋一个新的key名

    注意:如果newkey已经存在,则newkey的原值被覆盖

    注意:如果原先newname存在,则newname原先的值会被覆盖:

    > renamenx KEY NEWKEY //当键名存在后的改名操作

    作用: 把key改名为newkey

    返回: 发生修改返回1,未发生修改返回0

    注: nx--> not exists, 即newkey不存在时, 作改名动作。存在则不更改

     

     

     

    > select N //选择数据库,N为整数 数据库的名称 默认 redis会有 0 --15个数据库(16个)默认是在第0个数据库

    作用: 更改数据库

     

    > exists KEY //判断key是否存在

    作用: 判断key是否存在,返回1 / 0

     

    > type KEY //查看存储值的类型

    作用: 返回key存储的值的类型

    可能值有string、link、set、order set、 hash

    五、字符串操作

    > set KEY VALUE [ex 秒数] | [px 毫秒数] [nx] | [xx]

     

    例如:

    set name asion ex 10 // 设置key为name,value值为asion,且有效期为10秒

    set age 25 px 9000 // 设置key为age,value值为25,且有效期为 9秒

     

     

    :

    | 代表其中只能使用一个

     

    ② 如果ex、px同时出现的话,以后面的有效期为准

    例如: set age 25 ex 1000 px 9000 // 实际有效期是9000毫秒

     

    ③ nx: 表示key不存在时,执行操作

    xx: 表示key存在时,执行操作

     

     

     

    > mset KEY1 VALUE2 KEY2 VALUE2 // multi set一次性设置多个键值

     

    例如: mset key1 value1 key2 value2 ....

    multiple set 多个设置

     

     

    > get KEY // 获取键为 KEY 的值

     

    例如: get name

     

    > mget key1 key2 ... //获取多个键的值

     

    例如: mget key1 key2 key3

     

    > setrange key offset value //把字符串的offset偏移字节,改成value

     

    作用: 把字符串的offset偏移字节,改成value

    127.0.0.1:6379[1]> set name asion

    OK

    127.0.0.1:6379[1]> setrange name 0 B

    (integer) 5

    127.0.0.1:6379[1]> get name

    "Bsion"

    注意: 如果偏移量 大于 字符长度, 该字符自动补0x00

     

    > append KEY VALUE // 把VALUE追加到KEY的原值上

     

    例如: 把value追加到key的原值上

     

    > getrange KEY start stop //是获取字符串中 [start, stop]范围的值

     

    注意: 对于字符串的下标,左数从0开始,右数从-1开始

    127.0.0.1:6379> set name asion

    OK

    127.0.0.1:6379> getrange name 0 1

    "as"

    注意:

    1: start>=length, 则返回空字符串

    2: stop>=length,则截取至字符结尾

    3: 如果start 所处位置在stop右边, 返回空字符串

     

     

    > getset KEY NEWVALUE //获取并返回旧值,设置新值

     

    127.0.0.1:6379> get name

    "asion"

    127.0.0.1:6379> getset name bill

    "asion"

    127.0.0.1:6379> get name

    "bill"

     

     

    > incr KEY //指定的KEY的值加1,并返回加1后的值

    作用: 指定的key的值加1,并返回加1后的值

    注意:

    1:不存在的key当成0,再incr操作

    2: 范围为64有符号

     

     

    > incrby KEY number

    作用: 将指定key的值增加到设定的 number 整数

     

    > incrbyfloat KEY floatnumber

    作用: 将指定key的值增加到设定的 floatnumber 浮点数

     

    > decr KEY

    作用: 将指定key 的值减少 1

     

    > decrby KEY number

    作用: 将指定key 的值减少指定 number 整数

     

    > getbit KEY offset

    作用:获取值的二进制表示,对应位上的值(从左开始,从0编号)

    127.0.0.1:6379> set char A

    OK

    127.0.0.1:6379> getbit char 1

    (integer) 1

    127.0.0.1:6379> getbit char 0

    (integer) 0

     

    案例使用:位的处理可以用在什么地方?

    解决场景:1010001 签到业务场景

     

    > setbit KEY offset value

    作用: 设置offset对应二进制位上的值

    返回: 该位上的旧值

    注意:

    1:如果offset过大,则会在中间填充0,

    2: offset最大大到多少

    3:offset最大2^32-1,可推出最大的的字符串为512M

     

    > bitop operation destkey key1 [key2 ...]

     

    对key1、key2......keyN 作operation 操作,并将结果保存到 destkey

    operation 可以是 AND 、 OR 、 NOT 、 XOR(相同为0 不同为1)

    注意: 对于NOT操作, key不能多个

     

    六、链表操作

    > lpush KEY VALUE // 把值插入到链接头部 left push

    作用: 把值插入到链接头部 left push

    127.0.0.1:6379> lpush link a b c d

    (integer) 4

    127.0.0.1:6379> lrange link 0 -1 left range 0 -1

    1) "d"

    2) "c"

    3) "b"

    4) "a"

     

     

     

    > rpop KEY //返回并删除链表尾元素 right pop

    作用: 返回并删除链表尾元素

     

    rpush、lpop: 等同

    商品抢购系统:

    商城活动促销进行抢购操作,Redis的链表存了10000人。rpop弹出100个即为商品发放完成。

     

    > lrange KEY start stop //返回链表中[start,stop]内的元素

    作用: 返回链表中[start ,stop]中的元素

    规律: 左数从0开始,右数从-1开始

     

    > lrem KEY count value

    作用: 从key链表中删除 value值

    注: 删除count的绝对值个value后结束

    count>0 从表头删除

    count

     

     

    > ltrim KEY start stop

    作用: 剪切key对应的链接,切[start,stop]一段,并把该段重新赋给key

     

    > lindex KEY index

    作用: 返回index索引上的值,

    127.0.0.1:6379> lrange link 0 -1

    1) "d"

    2) "b"

    3) "a"

    127.0.0.1:6379> lindex link 1

    "b"

     

    > llen key

    作用:计算链接表的元素个数

    127.0.0.1:6379> lrange link 0 -1

    1) "d"

    2) "b"

    3) "a"

    127.0.0.1:6379> llen link

    (integer) 3

     

    > linsert key after|before search value

    作用: 在key链表中寻找'search',并在search值之前|之后,插入value

    注: 一旦找到一个search后,命令就结束了,因此不会插入多个value

    七、集合操作

    集合的性质: 唯一性,无序性,确定性

    唯一性:相同的元素只能在集合里面出现一次

    无序性:集合里面的元素没有位置上的概念

    确定性:集合里面的元素个数和值是确定的

     

    因此想看元素,要么随机先一个,要么全选

    > smembers set1

     

    > sadd KEY value1 value2

    作用: 往集合key中增加元素

     

    > srem sets value1 value2

    作用: 删除集合中集为 value1 value2的元素

    返回值: 忽略不存在的元素后,真正删除掉的元素的个数

     

     

    > spop KEY

    作用: 返回并删除集合中key中1个随机元素

    随机--体现了无序性

     

    > srandmember KEY

    作用: 返回集合key中,随机的1个元素.

     

    > sismember KEY value

    作用: 判断value是否在key集合中

    是返回1,否返回0

     

    > smembers KEY

    作用: 返回集中中所有的元素

     

    > scard KEY

    作用: 返回集合中元素的个数

    八、order set 有序集合

    > zadd KEY score1 value1 score2 value2 ..

    添加元素

     

    > zrem KEY value1 value2 ..

    作用: 删除集合中的元素

     

    > zrange KEY start stop [WITHSCORES]

    把集合排序后,返回名次[start,stop]的元素

    默认是升续排列

    withscores 是把score也打印出来

     

    > zrevrange KEY start stop

    作用:把集合降序排列,取名字[start,stop]之间的元素

     

    > zcard KEY

    返回元素个数

     

  3. hash操作

    注意:redis中的hash可以理解为php里面的关联数组

    $arr = array('key'=>value,'key2'=>value2)

    $arr = array('name'=>'zhangsan','age'=>12)

     

    > hset KEY field value

     

     

    > hmset KEY field1 value1 [field2 value2 field3 value3 ......fieldn valuen]

    作用: 设置field1->N 个域, 对应的值是value1->N

    (对应PHP理解为 $key = array(file1=>value1, field2=>value2 ....fieldN=>valueN))

    > hget KEY field

    作用: 返回key中field域的值

     

    > hmget KEY field1 field2 fieldN

    作用: 返回key中field1 field2 fieldN域的值

    > hgetall KEY

    作用:返回key中,所有域与其值

    > hdel key field

    作用: 删除key中 field域

     

    > hlen key

    作用: 返回key中元素的数量

     

    > hexists key field

    作用: 判断key中有没有field域

     

     

    > hkeys key

    作用: 返回key中所有的field

     

    > hvals key

    作用: 返回key中所有的value

     

    redis里面的集合就是php里面的关联数组

    Redis能保存 string set orderset link hash 所以Redis又叫结构化数据库

    string 保存字符串

    set 主要用作好友推荐场景

    hash 关联数组

    十、php操作redis

  4. 解压文件

  5. 执行phpize命令(绝对路径)

    3. 执行 configure (需要指定 php-config的绝对路径)

  6. 执行make && make install

  7. 生成一个目录

  8. 修改php.ini文件

    /usr/local/php/lib/php.ini

  9. 重启Apache

  10. 在htdocs目录下添加测试文件 phpinfo() ,并启动Apache

  11. php操作redis

    redis.php文件

    浏览器

    十一、redis的权限问题

  12. 修改配置文件

  13. 重启redis

    a. 在登录的时候 使用 -a 参数 增加密码

    不输入密码,则没权限操作:

    b. 在登录之后 使用 auth 命令输入密码:

    c. 使用php来验证密码

     

  14. 当验证成功之后,可以正常使用

    注意:Redis是可以设置密码来访问的,但是Memcache是没有安全密码,所以Memcache在使用的时候,建议在内网使用。或者单独为Memcache也一个防火墙验证规则即可。iptables 学习(防火墙验证规则)

    120.24.68.34 允许这个公网ip访问 ip为 186.23.45.32这台Memcache

     

    注意:如果你自己的虚拟机可以ping通全班的电脑,但是ping不通你自己的电脑?

    可能:自己电脑的防火墙是开着。

    注意:如果你ping不通你的虚拟机,这个时候是虚拟机的防火墙开启

    只需要执行

    # iptables -F

    #iptbales -L 查看防火墙规则

    还有可能是你虚拟机的 selinux 开启了 selinux 是Linux下的一个安全关闭软件(类似防火墙)

    # setenforce 0 即可关闭selinux操作

    # getenforce 查看

     

    注意:在Linux下一定要是 tab 补齐

     

     

     

    注意:网络问题?

  15. 不要修改Linux网络ip获取,让它自动获取即可,千万不要改成static

  16. 经常启动MySQL的时候,然后使用MySQL去连接服务器

    报错/tmp/mysql.sock文件not found

    # 对于的/tmp 目录下 执行

    # touch mysql.sock 创建文件

    # 重启MySQL 重启成不成功

    # ps axu | grep mysqld

    # 重启连接即可

    十二、redis如何实现持久化

    什么是持久化?

    就是将内存的数据保存到磁盘上,形成永久保存的文件。

     

    如何在vim下搜索之后,实现单词的跳动

    # n (next)

    如果不希望在vim出现高亮的语法提示,只需要执行

    # 末行模式

    # noh (no high)

     

  17. 修改配置文件

  18. 测试一下

    在这个命令下 执行 bgsave (background save)也可以实现手工的将数据保存到磁盘上。

    测试,先关闭服务器

    # pkill -9 redis-server

     

    在重写获取

    在对应的安装目录下,多了一个磁盘文件

    注意:文件的后缀是可以修改的。

    注意: 如何保存Redis能完成的持久化数据?

    答:根据实际的业务来规范一个合适的写入时间(写的快),需要测试一段时间来规定这个时间。

    30s 只能执行 10000次操作这个时候就可以将数据写入到磁盘上。

     
Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn