Redis介绍
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持久化
vim /etc/redis.conf , 查找save会看到以下三个参数:
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
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
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安全设置
[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>
[root@harry-01 ~]# vim /etc/redis.conf //打开redis的配置文件
查找关键字rename ,并修改config命令
rename-command CONFIG aming
禁掉config命令
rename-command CONFIG “”
Redis慢查询日志
[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
session.save_handler = "redis"
session.save_path = "tcp://127.0.0.1:6379"
php_value session.save_handler " redis"
php_value session.save_path " tcp://127.0.0.1:6379"
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集群
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机器同样执行以上步骤
gem install redis