欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  php教程

Redis 学习 - 尼农小道

程序员文章站 2022-04-02 13:00:03
...
非关系型数据库Redis V3.0( 6379 端口)

 

端口含义:

 

Redis 学习 - 尼农小道

开发者:

Redis 学习 - 尼农小道

 

国内对NoSQL的使用:

Redis 学习 - 尼农小道

 

 

 

 

 

产品官网: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

    Redis 学习 - 尼农小道

     

    2. 解压源码文件

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

    Redis 学习 - 尼农小道

     

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

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

    Redis 学习 - 尼农小道

     

    解决方案:

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

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

    Redis 学习 - 尼农小道

    32位系统安装

    [root@asion src]# cd redis-3.0.3

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

     

    32操作系统:

    Redis 学习 - 尼农小道

     

    64位操作系统:

    Redis 学习 - 尼农小道

    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

    Redis 学习 - 尼农小道

    无配置文件运行:

    启动服务:

    Redis 学习 - 尼农小道

    显示界面:

    Redis 学习 - 尼农小道

    读取配置文件信息启动:

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

    成功运行:

    Redis 学习 - 尼农小道

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

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

    Redis 学习 - 尼农小道

     

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

    Redis 学习 - 尼农小道

    执行启动命令:

    Redis 学习 - 尼农小道

     

    查看服务器是否启动:

    # ps aux | grep redis-server

     

    关闭服务

    # pkill -9 redis-server

     

    三、客户端操作

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

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

    Redis 学习 - 尼农小道

    四、Redis相关命令

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

    作用: 设置键的值

    Redis 学习 - 尼农小道

     

     

    > get KEY //获取KEY 的值

    作用: 获取键的值

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

    Redis 学习 - 尼农小道

    获取不存在的值

    Redis 学习 - 尼农小道

     

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

    作用: 删除1个或多个键

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

    Redis 学习 - 尼农小道

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

    Redis 学习 - 尼农小道

     

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

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

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

    Redis 学习 - 尼农小道

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

    Redis 学习 - 尼农小道

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

    作用: 把key改名为newkey

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

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

     

    Redis 学习 - 尼农小道

     

     

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

    作用: 更改数据库

    Redis 学习 - 尼农小道

     

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

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

    Redis 学习 - 尼农小道

     

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

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

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

    Redis 学习 - 尼农小道

    五、字符串操作

    > 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存在时,执行操作

     

    Redis 学习 - 尼农小道

     

     

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

     

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

    multiple set 多个设置

    Redis 学习 - 尼农小道

     

     

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

     

    例如: get name

    Redis 学习 - 尼农小道

     

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

     

    例如: mget key1 key2 key3

    Redis 学习 - 尼农小道

     

    > 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

    Redis 学习 - 尼农小道

     

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

     

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

    Redis 学习 - 尼农小道

     

    > 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右边, 返回空字符串

    Redis 学习 - 尼农小道

     

     

    > 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"

     

    Redis 学习 - 尼农小道

     

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

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

    注意:

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

    2: 范围为64有符号

    Redis 学习 - 尼农小道

     

     

    > incrby KEY number

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

    Redis 学习 - 尼农小道

     

    > incrbyfloat KEY floatnumber

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

    Redis 学习 - 尼农小道

     

    > decr KEY

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

    Redis 学习 - 尼农小道

     

    > decrby KEY number

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

    Redis 学习 - 尼农小道

     

    > 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

    Redis 学习 - 尼农小道

     

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

    解决场景: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不能多个

    Redis 学习 - 尼农小道

     

    六、链表操作

    > 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"

    Redis 学习 - 尼农小道

    Redis 学习 - 尼农小道

     

     

     

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

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

     

    rpush、lpop: 等同

    Redis 学习 - 尼农小道

    Redis 学习 - 尼农小道

    商品抢购系统:

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

     

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

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

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

    Redis 学习 - 尼农小道

     

    > lrem KEY count value

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

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

    count>0 从表头删除

    count

    Redis 学习 - 尼农小道

     

     

    > ltrim KEY start stop

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

    Redis 学习 - 尼农小道

     

    > 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"

    Redis 学习 - 尼农小道

     

    > 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

    Redis 学习 - 尼农小道

     

    > linsert key after|before search value

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

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

    Redis 学习 - 尼农小道

    七、集合操作

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

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

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

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

     

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

    > smembers set1

     

    > sadd KEY value1 value2

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

    Redis 学习 - 尼农小道

     

    > srem sets value1 value2

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

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

    Redis 学习 - 尼农小道

     

     

    > spop KEY

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

    Redis 学习 - 尼农小道

    随机--体现了无序性

     

    > srandmember KEY

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

    Redis 学习 - 尼农小道

     

    > sismember KEY value

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

    是返回1,否返回0

    Redis 学习 - 尼农小道

     

    > smembers KEY

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

    Redis 学习 - 尼农小道

     

    > scard KEY

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

    Redis 学习 - 尼农小道

    八、order set 有序集合

    > zadd KEY score1 value1 score2 value2 ..

    添加元素

    Redis 学习 - 尼农小道

     

    > zrem KEY value1 value2 ..

    作用: 删除集合中的元素

    Redis 学习 - 尼农小道

     

    > zrange KEY start stop [WITHSCORES]

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

    默认是升续排列

    withscores 是把score也打印出来

    Redis 学习 - 尼农小道

     

    > zrevrange KEY start stop

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

    Redis 学习 - 尼农小道

     

    > zcard KEY

    返回元素个数

    Redis 学习 - 尼农小道

     

  3. hash操作

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

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

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

     

    > hset KEY field value

     

    Redis 学习 - 尼农小道

     

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

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

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

    Redis 学习 - 尼农小道

    > hget KEY field

    作用: 返回key中field域的值

    Redis 学习 - 尼农小道

     

    > hmget KEY field1 field2 fieldN

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

    Redis 学习 - 尼农小道

    > hgetall KEY

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

    Redis 学习 - 尼农小道

    > hdel key field

    作用: 删除key中 field域

    Redis 学习 - 尼农小道

     

    > hlen key

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

    Redis 学习 - 尼农小道

     

    > hexists key field

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

    Redis 学习 - 尼农小道

     

     

    > hkeys key

    作用: 返回key中所有的field

    Redis 学习 - 尼农小道

     

    > hvals key

    作用: 返回key中所有的value

    Redis 学习 - 尼农小道

     

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

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

    string 保存字符串

    set 主要用作好友推荐场景

    hash 关联数组

    十、php操作redis

  4. 解压文件

    Redis 学习 - 尼农小道

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

    Redis 学习 - 尼农小道3. 执行 configure (需要指定 php-config的绝对路径)

    Redis 学习 - 尼农小道

  6. 执行make && make install

    Redis 学习 - 尼农小道

  7. 生成一个目录

    Redis 学习 - 尼农小道

  8. 修改php.ini文件

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

    Redis 学习 - 尼农小道

  9. 重启Apache

    Redis 学习 - 尼农小道

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

    Redis 学习 - 尼农小道

  11. php操作redis

    redis.php文件

    Redis 学习 - 尼农小道

    浏览器

    Redis 学习 - 尼农小道

    十一、redis的权限问题

  12. 修改配置文件

    Redis 学习 - 尼农小道

  13. 重启redis

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

    Redis 学习 - 尼农小道

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

    Redis 学习 - 尼农小道

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

    Redis 学习 - 尼农小道

    c. 使用php来验证密码

    Redis 学习 - 尼农小道

     

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

    Redis 学习 - 尼农小道

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

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

     

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

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

    Redis 学习 - 尼农小道

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

    只需要执行

    # iptables -F

    #iptbales -L 查看防火墙规则

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

    # setenforce 0 即可关闭selinux操作

    # getenforce 查看

    Redis 学习 - 尼农小道

     

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

     

     

     

    注意:网络问题?

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

    Redis 学习 - 尼农小道

  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. 修改配置文件

    Redis 学习 - 尼农小道

  18. 测试一下

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

    Redis 学习 - 尼农小道

    测试,先关闭服务器

    # pkill -9 redis-server

     

    在重写获取

    Redis 学习 - 尼农小道

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

    Redis 学习 - 尼农小道

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

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

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

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