redis

Redis介绍 

•Redis和Memcached类似,也属于k-v数据存储
• Redis官网redis.io, 当前最新稳定版4.0.1
•支持更多value类型,除了和string外,还支持hash、lists(链表)、sets(集合)和sorted sets(有序集合)
• redis使用了两种文件格式:全量数据(RDB)和增量请求(aof)。全量数据格式是把内存中的数据写入磁盘,便于下次读取文件进行加载。增量请求文件则是把内存中的数据序列化为操作请求,用于读取文件进行replay得到数据,这种类似于mysql binlog。
• redis的存储分为内存存储、磁盘存储和log文件三部分
 

Redis安装

[root@harry-01 ~]# cd /usr/local/src/
[root@harry-01 src]# wget http://download.redis.io/releases/redis-4.0.1.tar.gz 
[root@harry-01 redis-4.0.1]# cd redis-4.0.1.tar.gz 
[root@harry-01 redis-4.0.1]# tar -zxvf redis-4.0.1.tar.gz 
[root@harry-01 redis-4.0.1]# make && make install
[root@harry-01 redis-4.0.1]# cp redis.conf /etc/redis.conf #
[root@harry-01 redis-4.0.1]# vim /etc/re
redhat-release    redis.conf        request-key.conf  request-key.d/    resolv.conf       resolv.conf.save
[root@harry-01 redis-4.0.1]# vim /etc/redis.conf //修改如下配置
daemonize yes
logfile "/var/log/redis.log" 
dir /data/redis_data/
appendonly yes

[root@harry-01 redis-4.0.1]# mkdir /data/redis_data
[root@harry-01 redis-4.0.1]# redis-server /etc/redis.conf //启动redis 
[root@harry-01 redis-4.0.1]# ps aux | grep redis
root       9836  0.0  0.4 145300  7536 ?        Ssl  22:16   0:00 redis-server 127.0.0.1:6379
root       9848  0.0  0.0 112724   988 pts/0    R+   22:17   0:00 grep --color=auto redis
[root@harry-01 redis-4.0.1]# less /var/log/redis.log //查看redis日志 
9836:M 03 Mar 22:17:00.266 # WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.
9836:M 03 Mar 22:17:00.266 # WARNING you have Transparent Huge Pages (THP) support enabled in your kernel. This will create latency and memory usage issues with Redis. To fix this issue run the command 'echo never > /sys/kernel/mm/transparent_hugepage/enabled' as root, and add it to your /etc/rc.local in order to retain the setting after a reboot. Redis must be restarted after THP is disabled.
:
//在日志中有两条警告,当内存比较低的时候建议将'vm.overcommit_memory'的值修改为1。
所以在此修改这以下两条内核参数
sysctl vm.overcommit_memory=1
echo never > /sys/kernel/mm/transparent_hugepage/enabled
并将这两条参数写入/etc/rc.local 中,方便启动时自动生效

Redis持久化

•Redis提供了两种持久化的方式,分别是RDB(Redis DataBase)和AOF(Append Only File)
• RDB,简而言之, 就是在不同的时间点,将redis存储的数据生成快照并存储到磁盘等介质上。
• AOF,则是换了一个角度来实现持久化,那就是 将redis执行过的所有写指令记录下来,在下次redis重新启动时,只要把这些写指令从前到后再重复执行一遍,就可以实现数据恢复了。
• 其实RDB和AOF两种方式也可以同时使用,在这种情况下 ,如果redis重启的话,则会优先采用AOF方式来进行数据恢复,这是因为AOF方式的数据恢复完整度更高。
• 如果你没有数据持久化的需求,也完全可以关闭RDB和AOF方式,这样的话,redis将变成一个纯内存数据库,就像memcache一样。
 

 vim /etc/redis.conf , 查找save会看到以下三个参数: 

5dedad2dda281936c2b2fa4089931c749cd.jpg
save 900 1 #表示每15分钟且至少有1个key改变,就触发一次持久化 
 save 300 10 #表示每5分钟且至少有10个key改变,就触发一次持久化
 save 60 10000 #表示每60秒至少有10000个key改变,就触发一次持久
 save “”  #这样可以禁用rdb持久化
 
737b3cd1465ce8dbe1e522a4baf7320b91b.jpg
 appendonly yes  #如果是yes,则开启aof持久化
 appendfilename “appendonly.aof” # 指定aof文件名字
 appendfsync everysec #指定fsync()调用模式,有三种no(不调用fsync),always(每次写都会调用fsync),everysec(每秒钟调用一次fsync)。第一种最快,第二种数据最安全,但性能会差一些,第三种为这种方案,默认为第三种。
 
 

Redis数据类型

• string为最简单的类型,与Memcached一样的类型,一个key对应一个value,其支持的操作与Memcached的操作类似,它的功能更丰富。设置可以存二进制的对象。

[root@harry-01 ~]# redis-cli
127.0.0.1:6379> set mykey "www.harry.com"
OK
127.0.0.1:6379> get mykey 
"www.harry.com"
127.0.0.1:6379> mset key1 1 key2 a key3 c 
OK
127.0.0.1:6379> mget key1 key2 key3
1) "1"
2) "a"
3) "c"
127.0.0.1:6379> 

list 

•list是一个链表结构,主要功能是push、pop、获取一个范围的所有值等等。操作中key理解为链表的名字。
• 使用 list 结构,我们可以轻松地实现最新消息排行等功能(比如新浪微博的 TimeLine )。list 的另一个应用就是消息队列,可以利用 list 的 push操作,将任务存在 list 中,然后工作线程再用pop操作将任务取出进行执行。
127.0.0.1:6379> LPUSH list1 "Harry" 
(integer) 1
127.0.0.1:6379> LPUSH list1 "1 2 3" 
(integer) 2
127.0.0.1:6379> LPUSH list1 "aaa bbb" 
(integer) 3
127.0.0.1:6379> LRANGE list1 0 -1
1) "aaa bbb"
2) "1 2 3"
3) "Harry"
127.0.0.1:6379> LPOP list1
"aaa bbb"
127.0.0.1:6379> 

set 

•set是集合,和我们数学中的集合概念相似,对集合的操作有添加删除元素,有对多个集合求交并差等操作。操作中key理解为集合的名字。比如在微博应用中,可以将一个用户所有的关注人存在一个集合中,将其所有粉丝存在一个集合。因为 Redis 非常人性化的为集合提供了求交集、并集、差集等操作,那么就可以非常方便的实现如共同关注、共同喜好、二度好友等功能,对上面的所有集合操作,你还可以使用不同的命令选择将结果返回给客户端还是存集到一个新的集合中。
127.0.0.1:6379> SADD set1 a127.0.0.1:6379> SADD set1 b
127.0.0.1:6379> SADD set1 c
127.0.0.1:6379> SADD set1 d127.0.0.1:6379> SMEMBERS set1
1) "d"
2) "b"
3) "a"
4) "c"
127.0.0.1:6379> SREM set1 c//删除元素
127.0.0.1:6379> SADD set2 a 2  b
127.0.0.1:6379> SINTER set1 set2 //交集
127.0.0.1:6379> SUNION set1 set2 //并集
127.0.0.1:6379> SDIFF set1 set2 //差集

sort set 

• sorted set是有序集合,它比set多了一个权重参数score,使得集合中的元素能够按 score 进行有序排列,比如一个存储全班同学成绩的 Sorted Sets,其集合 value 可以是同学的学号,而 score 就可以是其考试得分,这样在数据插入集合的时候,就已经进行了天然的排序。

127.0.0.1:6379> ZADD set3 12 abc127.0.0.1:6379> ZADD set3 2 "cde 123"127.0.0.1:6379> ZADD set3 24 "123-aaa"127.0.0.1:6379> ZADD set3 4 "a123a"127.0.0.1:6379> ZRANGE set3 0 -1
1) "cde 123"
2) "a123a"
3) "abc"
4) "123-aaa"

倒序 
127.0.0.1:6379> ZREVRANGE set3 0 -1
1) "123-aaa"
2) "abc"
3) "a123a"
4) "cde 123"

hash 

•在 Memcached 中,我们经常将一些结构化的信息打包成 hashmap,在客户端序列化后存储为一个字符串的值(一般是 JSON 格式),比如用户的昵称、年龄、性别、积分等。

127.0.0.1:6379> hset hash1 name aming 
127.0.0.1:6379> hget hash1 name "aming"
127.0.0.1:6379> hset hash1  age 30
127.0.0.1:6379> hget hash1 age "30"
127.0.0.1:6379> hgetall hash1 1) "name" 2) "aming" 3) "age" 4) "30"

Redis常用操作

string

set key1 aminglinux
 get key1
 set key1 aming//第二次赋值会覆盖
 setnx key2 aaa //返回1 如果key2不存在直接创建key
 setnx key2 bbb  //如果key2存在,返回0
 setex key3 10 1 //给key3设置过期时间为10s,值为1,若key已经存在,会覆盖新的值

list

127.0.0.1:6379> lpush list2 aaa
(integer) 1
127.0.0.1:6379> lpush list2 bbb 
(integer) 2
127.0.0.1:6379> lrange list2 0 -1
1) "bbb"
2) "aaa"
127.0.0.1:6379> lpop list2
"bbb"
# "bbb"是后添加入的值,却在"aaa"的前面。此时list就如同一个瓶子,后加入的石子会在瓶口。

127.0.0.1:6379> lpush list2 ccc 
(integer) 2
127.0.0.1:6379> lpush list2 ddd
(integer) 3
127.0.0.1:6379> lrange list2 0 -1
1) "ddd"
2) "ccc"
3) "aaa"
127.0.0.1:6379> rpop list2 //从右侧取出第一个元素
"aaa"
127.0.0.1:6379> rpush list2 eee//从右侧加入一个元素
(integer) 3
127.0.0.1:6379> rpop list2//从右侧取出一个元素
"eee"
127.0.0.1:6379> 

set

linsert  lista  before  2 3  //在2的前面插入一个元素为3
 lset lista 4 bbb  //把第5个元素修改为bbb
 lindex lista 0  //查看第1个元素
 lindex lista 3  //查看第4个元素
 llen lista  //查看链表中有几个元素
 sadd seta aaa  //向集合seta中放入元素
 smembers seta   //查看集合中的所有元素 
 srem  seta    aaa //删除元素 
 spop  seta    //随机取出一个元素,删除
 sdiff  seta  setb   //求差集,以seta为标准
 sdiffstore setc seta setb   //求差集并且存储,存储到了setc里 
 sinter seta setb    //求交集
 sinterstore  setd seta setb  //将交集存储setd 
 sunion seta setb  //求并集
 sunionstore sete seta setb   //求并集并存储到sete

zset 有序集合

 sismember seta aaa  //判断一个元素是否属于一个集合
 srandmember  seta  //随机取出一个元素,但不删除
 zadd zseta 11 123 //创建有序集合
 zrange zseta 0 -1   //显示所有元素,按顺序显示
 zrange zseta 0 -1 withscores   //可以带上分值
 zrem zseta 222  //删除指定元素
 zrank zseta  222  //返回元素的索引值,索引值从0开始,按score正向排序
 zrevrank zseta 222   //同上,不同的是,按score反序排序
 zrevrange  zseta  0 -1  反序显示所有元素,并带分值
 zcard zseta  //返回集合中所有元素的个数
 zcount  zseta 1 10  //  返回分值范围1-10的元素个数
 zrangebyscore  zseta 1 10 // 返回分值范围1-10的元素
 zremrangebyrank zseta  0 2  //删除索引范围0-2的元素,按score正向排序
 zremrangebyscore zseta  1 10 //删除分值范围1-10的元素

键值

keys *    //取出所有key
 keys my* //模糊匹配
 exists name  //有name键 返回1 ,否则返回0;
 del  key1 // 删除一个key    //成功返回1 ,否则返回0;
 EXPIRE key1 100  //设置key1 100s后过期
 ttl key // 查看键 还有多长时间过期,单位是s,当 key 不存在时,返回 -2 。 当 key 存在但没有设置剩余生存时间时,返回 -1 。 否则,返回 key 的剩余生存时间。
 select  0  //代表选择当前数据库,默认进入0 数据库
 move age 1  // 把age 移动到1 数据库
 persist key1   //取消key1的过期时间
 randomkey //随机返回一个key
 rename oldname newname //重命名key
 type key1 //返回键的类型

服务

 dbsize  //返回当前数据库中key的数目
 info  //返回redis数据库状态信息
 flushdb //清空当前数据库中所有的键
 flushall    //清空所有数据库中的所有的key
 bgsave //保存数据到 rdb文件中,在后台运行
 save //作用同上,但是在前台运行
 config get * //获取所有配置参数
 config get dir  //获取配置参数
 config set dir  //更改配置参数
数据恢复: 首先定义或者确定dir目录和dbfilename,然后把备份的rdb文件放到dir目录下面,重启redis服务即可恢复数据

Redis安全设置

•设置监听ip
• bind 127.0.0.1  2.2.2.2//可以是多个ip,用空格分隔
• 设置监听端口 
• port 16000
 
设置密码
[root@harry-01 ~]# vim /etc/redis.conf  //打开redis的配置文件

# masterauth <master-password> //查找password ,在下面添加一行
requirepass aming>com //密码

#重新启动redis服务
[root@harry-01 ~]# killall redis-server 
[root@harry-01 ~]# redis-server /etc/redis.conf 

[root@harry-01 ~]# redis-cli
127.0.0.1:6379> keys *
(error) NOAUTH Authentication required. //再次使用key* ,会报错
127.0.0.1:6379> 

[root@harry-01 ~]# redis-cli -a 'aming>com' //使用redis-cli -a 指定密码登录
127.0.0.1:6379> 
将config命令改名
[root@harry-01 ~]# vim /etc/redis.conf  //打开redis的配置文件
查找关键字rename ,并修改config命令
rename-command CONFIG aming
禁掉config命令 
rename-command CONFIG “”

Redis慢查询日志

•编辑配置文件/etc/redis.conf,查找slowlog 
• 针对慢查询日志,可以设置两个参数,一个是执行时长,单位是微秒,另一个是慢查询日志的长度。当一个新的命令被写入日志时,最老的一条会从命令日志队列中被移除。
• slowlog-log-slower-than 1000 //单位ms,表示慢于1000ms则记录日志
• slowlog-max-len 128  //定义日志长度,表示最多存128条
• slowlog get //列出所有的慢查询日志
• slowlog get 2 //只列出2条
• slowlog len //查看慢查询日志条数
[root@harry-01 ~]# vim /etc/redis.conf 
[root@harry-01 ~]# killall redis-server 
[root@harry-01 ~]# redis-server /etc/redis.conf 
[root@harry-01 ~]# redis-cli -a 'aming>com'
127.0.0.1:6379> slowlog get 
(empty list or set)
127.0.0.1:6379> slowget len
(error) ERR unknown command 'slowget'
127.0.0.1:6379> slowlog len
(integer) 0
127.0.0.1:6379> 

PHP中使用redis安装扩展模块

[root@harry-01 ~]# cd /usr/local/src/
[root@harry-01 src]# wget https://coding.net/u/aminglinux/p/yuanke_centos7/git/raw/master/21NOSQL/phpredis.zip
[root@harry-01 src]# unzip phpredis.zip
[root@harry-01 phpredis-develop]# ./configure --with-php-config=/usr/local/php-fpm/bin/php-config
[root@harry-01 phpredis-develop]# make
[root@harry-01 phpredis-develop]# make install

extension=redis.so//增加extension=redis.so
[root@harry-01 ~]# /usr/local/php-fpm/bin/php -m | grep redis 
[root@harry-01 ~]# /etc/init.d/php-fpm restart 
Gracefully shutting down php-fpm . done
Starting php-fpm  done
[root@harry-01 ~]# 

PHP中使用redis存储session

• vim /usr/local/php-fpm/etc/php.ini//更改或增加

session.save_handler = "redis"

session.save_path = "tcp://127.0.0.1:6379"

 

• 或者apache虚拟主机配置文件中也可以这样配置:

php_value session.save_handler " redis"
php_value session.save_path " tcp://127.0.0.1:6379" 

 

• 或者php-fpm配置文件对应的pool中增加:

php_value[session.save_handler] = redis

php_value[session.save_path] = " tcp://127.0.0.1:6379 "

[root@harry-01 php-fpm.d]# vim /usr/local/php-fpm/etc/php-fpm.d/harry.conf 

[harry]
listen = /tmp/harry.sock
listen.mode=666
user = php-fpm
group = php-fpm
pm = dynamic
pm.max_children = 50
pm.start_servers = 20
pm.min_spare_servers = 5
pm.max_spare_servers = 35
pm.max_requests = 500
rlimit_files = 1024

php_value[session.save_handler] = redis 
php_value[session.save_path] = " tcp://192.168.31.137:6379 " 

为了方便实验关闭redis的密码

vim /etc/redis.conf //搜索关键字password 

# masterauth <master-password>
#requirepass aming>com 

测试

[root@harry-01 default]# wget http://study.lishiming.net/.mem_se.txt
[root@harry-01 default]# mv .mem_se.txt /data/wwwroot/default/session.php
[root@harry-01 default]# curl -x127.0.0.1:80 harry.com/test.php

Redis集群

98cdec22e91f001ac69219bc9f21f9ef36f.jpg

• 多个redis节点网络互联,数据共享
• 所有的节点都是一主一从(可以是多个从),其中从不提供服务,仅作为备用
• 不支持同时处理多个键(如mset/mget),因为redis需要把键均匀分布在各个节点上,并发量很高的情况下同时创建键值会降低性能并导致不可预测的行为。
• 支持在线增加、删除节点
• 客户端可以连任何一个主节点进行读写
 

Redis集群配置

• 场景设置:
• 两台机器,分别开启三个Redis服务(端口)
• A机器上三个端口7000,7002,7004,全部为主
• B机器上三个端口7001,7003,7005,全部为从
• 两台机器上都要编译安装redis,然后编辑并复制3个不同的redis.conf,分别设置不同的端口号、dir等参数,还需要增加cluster相关参数,然后分别启动6个redis服务
A机器

[root@harry-01 src]# cd /etc/
[root@harry-01 etc]# vim redis_7000.conf
[root@harry-01 etc]# vim redis_7002.conf
[root@harry-01 etc]# vim redis_7004.conf
//文件内容: (需要修改 port bind pid cluster-config-file)
port 7004
bind 192.168.133.130
daemonize yes
pidfile /var/run/redis_7004.pid
dir /data/redis_data/7004
cluster-enabled yes
cluster-config-file nodes_7004.conf
cluster-node-timeout 10100
appendonly yes

[root@harry-01 ~]# mkdir /data/redis_data/{7000,7002,7004}
[root@harry-01 redis_data]# redis-server /etc/redis
redis2.conf      redis_7000.conf  redis_7002.conf  redis_7004.conf  redis.conf       
[root@harry-01 redis_data]# redis-server /etc/redis
redis2.conf      redis_7000.conf  redis_7002.conf  redis_7004.conf  redis.conf       
[root@harry-01 redis_data]# redis-server /etc/redis_7000.conf 
[root@harry-01 redis_data]# redis-server /etc/redis_7002.conf 
[root@harry-01 redis_data]# redis-server /etc/redis_7004.conf 
[root@harry-01 redis_data]# ps aux | grep redis
root       6860  0.5  0.4 145304  7572 ?        Ssl  11:02   0:00 redis-server 192.168.31.137:7000 [cluster]
root       6872  0.0  0.4 145304  7572 ?        Ssl  11:02   0:00 redis-server 192.168.31.137:7002 [cluster]
root       6884  1.8  0.4 145304  7576 ?        Ssl  11:02   0:00 redis-server 192.168.31.137:7004 [cluster]
root       6896  0.0  0.0 112724   988 pts/0    R+   11:02   0:00 grep --color=auto redis
[root@harry-01 redis_data]# 

B机器同样执行以上步骤
•安装ruby2.2 (只需要一台机器上运行)
• yum -y groupinstall "Development Tools"
• yum -y install gdbm-devel libdb4-devel libffi-devel libyaml libyaml-devel ncurses-devel openssl-devel readline-devel tcl-deve
• cd /root/
• mkdir -p rpmbuild/{BUILD,BUILDROOT,RPMS,SOURCES,SPECS,SRPMS}
• wget http://cache.ruby-lang.org/pub/ruby/2.2/ruby-2.2.3.tar.gz -P rpmbuild/SOURCES
• wget https://raw.githubusercontent.com/tjinjin/automate-ruby-rpm/master/ruby22x.spec -P rpmbuild/SPECS
• rpmbuild -bb rpmbuild/SPECS/ruby22x.spec
• yum -y localinstall rpmbuild/RPMS/x86_64/ruby-2.2.3-1.el7.centos.x86_64.rpm

 gem install redis

• cp /usr/local/src/redis-4.0.1/src/redis-trib.rb  /usr/bin/
• redis-trib.rb create --replicas 1 192.168.133.130:7000 192.168.133.130:7002 192.168.133.130:7004 192.168.133.132:7001 192.168.133.132:7003 192.168.133.132:7005
• redis-cli -c -h 192.168.133.130 -p 7000//-c说明以集群的方式登录
• 任意一个节点都可以创建key,或者查看key(演示)
• redis-trib.rb check  192.168.133.130:7000//检测集群状态
• cluster nodes//列出节点
• cluster info//查看集群信息
• cluster meet ip port //添加节点
• cluster forget node_id //移除某个节点
• cluster replicate node_id//将当前节点设置为指定节点的从
• cluster saveconfig//保存配置文件

转载于:https://my.oschina.net/u/3993226/blog/3020297

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值