redis nosql

21.3 Redis介绍
什么是Redis
Redis和Memcached类似,也是NoSQL的一种,是一个基于内存的高性能key-value(k-v)数据库。
Redis支持string、list、set、zset(sorted set)和hash类型数据,这些数据类型都支持push/pop、add/remove及取交集、并集和差集及更丰富的操作,对这些数据的操作都是原子性的。
与memcached一样,为了保证效率,数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。redis的出现,很大程度补偿了memcached这类key/value存储的不足,在部 分场合可以对关系数据库起到很好的补充作用。它提供了Java,C/C++,C#,PHP,JavaScript,Perl,Object-C,Python,Ruby,Erlang等客户端,使用很方便。
数据可以从主服务器向任意数量的从服务器上同步,从服务器可以是关联其他从服务器的主服务器。这使得Redis可执行单层树复制。存盘可以有意无意的对数据进行写操作。由于完全实现了发布/订阅机制,使得从数据库在任何地方同步树时,可订阅一个频道并接收主服务器完整的消息发布记录。同步对读取操作的可扩展性和数据冗余很有帮助。
此外,Redis使用了两种文件格式:全量数据(RDB)和增量请求(aof)。全量数据格式是把内存中的数据写入磁盘,便于下次读取文件时进行加载;增量请求则是把内存中的数据序列转化为操作请求,用于读取文件进行replay得到数据,这种类似于mysql的binlog。Redis的存储分为内存存储、磁盘存储和log文件三部分。
Redis安装
Redis官网:https://redis.io/ ,最新版本4.0.11
下载redis:
cd /usr/local/src/
wget http://download.redis.io/releases/redis-4.0.11.tar.gz
tar zxf redis-4.0.11.tar.gz
cd redis-4.0.11
make && make install
echo $?
redis- #按两次Tab键出现下面内容就说明安装成功
redis-benchmark redis-check-rdb redis-sentinel
redis-check-aof redis-cli redis-server

#修改配置:
cp redis.conf /etc/redis.conf

vim /etc/redis.conf #做下面更改

daemonize yes #后台启动
logfile "/var/log/redis.log" #设置日志存放路径
dir /data/redis #设置RDB存放目录
appendonly yes

mkdir /data/redis
#启动redis:
redis-server /etc/redis.conf
ps aux |grep redis
less /var/log/redis.log #提示修改内核参数,如果不去修改也没很大影响

11920:M 20 Jul 22:51:40.532 WARNING overcommit_memory is set to 0! Background save may fail under low memory con
dition. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 's
ysctl vm.overcommit_memory=1' for this to take effect.
11920:M 20 Jul 22:51:40.533 WARNING you have Transparent Huge Pages (THP) support enabled in your kernel. This w
ill 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.

vim /etc/rc.local #修改内核参数,并开机执行

sysctl vm.overcommit_memory=1
echo never > /sys/kernel/mm/transparent_hugepage/enabled

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

#决定RDB什么时候将数据写入磁盘是由这些参数决定的。三选一,我们就保持默认即可。
cat /etc/redis.conf

save 900 1 #表示900s内发生了1次更改
save 300 10 #表示300s内发生了10次更改
save 60 10000 #表示60s内发生了10000次更改

#关闭RDB:
cat /etc/redis.conf #做下面更改

save ""
#save 900 1
#save 300 10
#save 60 10000

#AOF也有三种选择:
cat /etc/redis.conf

appendfsync always #一直记录,每次有变更就记录
appendfsync everysec #每秒记录一次
appendfsync no #每隔一段时间记录一次,根据系统里面算法决定,不安全

Redis数据类型
前面已经讲过,Redis的数据类型有五种:string、list、set、zset、hash

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

redis-cli #进入redis命令行
127.0.0.1:6379> set mykey "123"
127.0.0.1:6379> get mykey
127.0.0.1:6379> MSET k1 1 k2 2 k3 3 #支持Tab键将命令可以自动补全
127.0.0.1:6379> mget k1 k2 k3 mykey

list
list是一个链表结构,主要功能是push、pop、获取一个范围的所有值等。操作中key可理解为链表的名字。
使用list结构,可以轻松实现最新消息排行等功能(比如新浪微博的TimeLine)。list的另一个应用就是消息队列,可以利用list的push操作将任务存在list中,然后工作线程再用pop操作将任务取出执行。
127.0.0.1:6379> LPUSH list1 "lzx" #LPUSH表示推进去
127.0.0.1:6379> LPUSH list1 "123"
127.0.0.1:6379> LPUSH list1 "aaa"
#最先推进去的排在后面
127.0.0.1:6379> LRANGE list1 0 -1 #0表示第一位,-1表示最后一位
127.0.0.1:6379> LPOP list1 #LPOP表示取出来,取出最前面的
##取出来的数据就不在list1中了
127.0.0.1:6379> LRANGE list1 0 -1

set
set是集合,和我们数学中的集合概念相似,对集合的操作有添加、删除元素,有对多个集合求交并差等操作。操作中key可理解为集合的名字。
比如在微博应用中,可以将一个用户所有的关注人存在一个集合中,将其所有粉丝存在一个集合中。因为Redis非常人性化地为集合提供了求交集、并集、差集等操作,那么可以很方便地实现如共同关注、共同爱好、二度好友等功能,对上面的所有集合操作,你还可以使用不同的命令选择将结果返回给客户端还是存集到一个新的集合中。

127.0.0.1:6379> SADD set1 a
127.0.0.1:6379> SADD set1 b
127.0.0.1:6379> SADD set1 c
127.0.0.1:6379> SMEMBERS set1
127.0.0.1:6379> SADD set2 1
127.0.0.1:6379> SADD set2 2
127.0.0.1:6379> SADD set2 c
127.0.0.1:6379> SMEMBERS set2
127.0.0.1:6379> SUNION set1 set2 #SUNION表示求并集
127.0.0.1:6379> SINTER set1 set2 #SINTER表示求交集
127.0.0.1:6379> SDIFF set1 set2 #SDIFF表示求差集,针对set1求差集,去除交集的部分
127.0.0.1:6379> SREM set1 b #SREM表示删除元素
127.0.0.1:6379> SMEMBERS set1

zset
zset是有序集合,它比set多了一个权重参数score,使集合中的元素能够按score进行有序排列。
比如一个存储全班同学成绩的Sorted Sets,其集合中value可以是同学的学号,而score就可以是其考试分数,这样在数据插入集合的时候,就已经进行了天然的排序。
127.0.0.1:6379> ZADD set3 12 abc
127.0.0.1:6379> ZADD set3 2 "cde 123"
127.0.0.1:6379> ZADD set3 24 "lzx"
127.0.0.1:6379> ZADD set3 4 "linux"
127.0.0.1:6379> ZRANGE set3 0 -1 #顺序排列set3,0表示第一位,-1表示最后一位
127.0.0.1:6379> ZREVRANGE set3 0 -1 #倒序排列set3

hash
hash,Redis和Memcached类似,在Memcached中,我们经常将一些结构化的信息打包成hashmap,在客户端序列化后存储为一个字符串的值(一般是JSON格式),比如用户的昵称、年龄、性别、积分等。
127.0.0.1:6379> HSET hash1 name lzx
127.0.0.1:6379> HSET hash1 age 20
127.0.0.1:6379> HSET hash1 job it //添加了3对子元素,每一对子元素都可以看做是一个key-value
127.0.0.1:6379> HSET hash1 name lzx
127.0.0.1:6379> HSET hash1 age 20
127.0.0.1:6379> HSET hash1 job it
127.0.0.1:6379> HGET hash1 age
127.0.0.1:6379> HGET hash1 job
127.0.0.1:6379> HGETALL hash1 #查看hash1全部

Redis常用操作
string,list
127.0.0.1:6379> set key1 lzx
127.0.0.1:6379> set key2 123
127.0.0.1:6379> set key1 aaa
##第二次赋值将之前赋值覆盖
127.0.0.1:6379> get key1
127.0.0.1:6379> SETNX key1 linux #key1存在,所以返回0
#并且不改变key1的value
127.0.0.1:6379> get key1
127.0.0.1:6379> SETNX key3 111 #key3不存在,所以直接创建,返回1
127.0.0.1:6379> get key3
127.0.0.1:6379> set key3 111 ex 10 #给key3设置过期时间,为10s,set时ex不可省略
127.0.0.1:6379> get key3 #过10s之后查看,value为空
127.0.0.1:6379> SETEX key3 1000 222 #SETEX设置过期时间为1000s,后面222为value,若key3已存在则覆盖
127.0.0.1:6379> get key3
127.0.0.1:6379> LPUSH list2 aaa
127.0.0.1:6379> LPUSH list2 bbb
127.0.0.1:6379> LPUSH list2 ccc
127.0.0.1:6379> LRANGE list2 0 -1
127.0.0.1:6379> LPOP list2 #取出的是最后加入的值
"ccc"
127.0.0.1:6379> LRANGE list2 0 -1 #取出的值已经不在list2中
127.0.0.1:6379> RPOP list2 #取出最先加入的值,跟LPOP相反
127.0.0.1:6379> LRANGE list2 0 -1
127.0.0.1:6379> LINSERT list2 before bbb 111 #LINSERT表示插入,在bbb前面插入111
127.0.0.1:6379> LINSERT list2 after bbb ddd #在bbb后面插入ddd
127.0.0.1:6379> LINSERT list2 after ddd fff
127.0.0.1:6379> LRANGE list2 0 -1
127.0.0.1:6379> LSET list2 1 123 #LSET表示修改,将第2个值改为123
127.0.0.1:6379> LSET list2 3 abc #将第4个值改为abc
127.0.0.1:6379> LRANGE list2 0 -1
127.0.0.1:6379> LINDEX list2 1 #LINDEX表示查看,查看第2个值
127.0.0.1:6379> LINDEX list2 3 #查看第4个值
127.0.0.1:6379> LLEN list2 #LLEN查看列表中有几个元素

set
127.0.0.1:6379> SADD set1 aaa #SADD表示添加元素,添加元素aaa
127.0.0.1:6379> SADD set1 bbb
127.0.0.1:6379> SADD set1 ccc
127.0.0.1:6379> SMEMBERS set1 #SMEMBERS表示查看集合中所有元素
127.0.0.1:6379> SREM set1 aaa #SREM表示删除元素,删除元素aaa
127.0.0.1:6379> SMEMBERS set1
127.0.0.1:6379> SPOP set1 1 #SPOP表示取出元素,1表示第2个元素
#取出的元素就不再在set1中
127.0.0.1:6379> SMEMBERS set1
127.0.0.1:6379> SADD set1 aaa
127.0.0.1:6379> SADD set1 ccc
127.0.0.1:6379> SADD set1 222
127.0.0.1:6379> SMEMBERS set1
127.0.0.1:6379> SADD set2 aaa
127.0.0.1:6379> SADD set2 ccc
127.0.0.1:6379> SADD set2 111
127.0.0.1:6379> SMEMBERS set2
127.0.0.1:6379> SDIFF set1 set2 #SDIFF表示求差集,set1在前面就是以set1为标准
127.0.0.1:6379> SDIFF set2 set1
127.0.0.1:6379> SDIFFSTORE set3 set1 set2 #SDIFFSTORE表示求出差集并保存到新集合中,set3为新集合
127.0.0.1:6379> SMEMBERS set3
127.0.0.1:6379> SINTER set1 set2 #SINTER表示求交集
127.0.0.1:6379> SINTERSTORE set4 set1 set2 #SINTERSTORE表示求交集并保存到新集合中,set4为新集合
127.0.0.1:6379> SMEMBERS set4
127.0.0.1:6379> SUNION set1 set2 #SUNION表示求并集
127.0.0.1:6379> SUNIONSTORE set5 set1 set2 #SUNIONSTORE表示求并集并保存到新集合中,set5为新集合
127.0.0.1:6379> SMEMBERS set5
#返回0表示不存在
127.0.0.1:6379> SISMEMBER set1 1 #SISMEMBER表示判断一个元素是否在集合中
#返回1表示存在
127.0.0.1:6379> SISMEMBER set1 aaa
127.0.0.1:6379> SRANDMEMBER set1 #SRANDMEMBER表示随机取出元素,但不删除
127.0.0.1:6379> SRANDMEMBER set1 2 #2表示随机取出2个元素
127.0.0.1:6379> SMEMBERS set1

zset
127.0.0.1:6379> ZADD zset1 11 123 #ZADD表示添加元素
127.0.0.1:6379> ZADD zset1 2 lab
127.0.0.1:6379> ZADD zset1 25 k
127.0.0.1:6379> ZRANGE zset1 0 -1 #ZRANGE表示查看元素,按顺序显示,0表示第一位,-1表示最后一位
127.0.0.1:6379> ZREM zset1 123 #ZREM表示删除元素,123为具体的值(输入score(11)则不对)
127.0.0.1:6379> ZRANGE zset1 0 -1
127.0.0.1:6379> ZADD zset1 9 la
127.0.0.1:6379> ZADD zset1 100 sss
127.0.0.1:6379> ZRANGE zset1 0 -1
127.0.0.1:6379> ZRANK zset1 k #ZRANK返回元素的索引值,索引值从0开始,按sore正向排序,score即value前面的值,如la的sore是9,sss的sore为100
127.0.0.1:6379> ZREVRANK zset1 k #ZREVRANK返回元素的索引值,索引值从0开始,按score反向排序
127.0.0.1:6379> ZREVRANGE zset1 0 -1 #ZREVRANGE表示反序排序
127.0.0.1:6379> ZCARD zset1 #ZCARD返回元素个数
127.0.0.1:6379> ZCOUNT zset1 1 10 #ZCOUNT返回score范围中的元素个数,1 10表示范围为1-10
127.0.0.1:6379> ZRANGEBYSCORE zset1 1 10 #ZRANGEBYSCORE返回score范围中的元素
127.0.0.1:6379> ZRANGE zset1 0 -1
127.0.0.1:6379> ZADD zset1 6 111
127.0.0.1:6379> ZADD zset1 31 all
127.0.0.1:6379> ZRANGE zset1 0 -1
127.0.0.1:6379> ZREMRANGEBYSCORE zset1 1 10 #ZREMRANGEBYSCORE表示删除score(分值)范围中的元素,1 10表示范围为1-10
127.0.0.1:6379> ZRANGE zset1 0 -1

hash
127.0.0.1:6379> HSET usera name lzx #HSET建立hash
127.0.0.1:6379> HGET usera name #HGET查看
127.0.0.1:6379> HMSET userb name lzx age 20 job it #HMSET批量创建键值对
127.0.0.1:6379> HMGET userb name age job #HMGET批量查看
127.0.0.1:6379> HGETALL userb #HGETALL查看hash中所有键值对,这样查看也可以
127.0.0.1:6379> HDEL userb age #HDEL删除对应的键值对
#age对应的键值对消失
127.0.0.1:6379> HGETALL userb
127.0.0.1:6379> HKEYS userb #HKEYS显示hash中所有的key
127.0.0.1:6379> HVALS userb #HVALS显示hash中所有的value
127.0.0.1:6379> HLEN userb #HLEN查看hash中有多少个键值对

Redis操作键值
127.0.0.1:6379> KEYS * #KEYS列出redis中所有的key
127.0.0.1:6379> KEYS my* #模糊匹配
127.0.0.1:6379> EXISTS key1 #EXISTS查看是否存在某个键,存在返回1,不存在返回0
127.0.0.1:6379> DEL key1 #DEL删除某个键
127.0.0.1:6379> EXISTS key1
127.0.0.1:6379> EXPIRE k2 10 #EXPIRE给某个键设置过期时间,10表示10s
127.0.0.1:6379> GET k2
127.0.0.1:6379> GET k2 #过10s之后查看,k2的value为空
127.0.0.1:6379> EXPIRE key2 100
127.0.0.1:6379> TTL key2 #TTL查看键的过期时间
127.0.0.1:6379> TTL key2
127.0.0.1:6379> SELECT 1 #SELECT选择库,总共有16个库,默认为0库
127.0.0.1:6379[1]> KEYS * #[1]表示现在在1库
127.0.0.1:6379[1]> SELECT 0
127.0.0.1:6379> KEYS *
127.0.0.1:6379> MOVE set2 1 #MOVE移动数据到另一个库
127.0.0.1:6379> SELECT 1
127.0.0.1:6379[1]> KEYS *
127.0.0.1:6379> EXPIRE set1 100
127.0.0.1:6379> TTL set1
127.0.0.1:6379> PERSIST set1 #PERSIST取消过期时间
#-1表示没有过期时间,即永不过期
127.0.0.1:6379> TTL set1
127.0.0.1:6379> RANDOMKEY #随机返回一个key
127.0.0.1:6379> RANDOMKEY
127.0.0.1:6379> RANDOMKEY
127.0.0.1:6379> RENAME set1 setc #RENAME表示重命名key
127.0.0.1:6379> KEYS set*
127.0.0.1:6379> TYPE zset1 #TYPE查看key类型
127.0.0.1:6379> TYPE list1
127.0.0.1:6379> TYPE setc
127.0.0.1:6379> DBSIZE #DBSIZE返回当前数据库中key的数量
127.0.0.1:6379> INFO #返回redis数据库状态信息
Server
redis_version:4.0.11
redis_git_sha1:00000000
redis_git_dirty:0
redis_build_id:f1b08454f8b4e56c
redis_mode:standalone
os:Linux 3.10.0-693.el7.x86_64 x86_64
arch_bits:64
multiplexing_api:epoll
atomicvar_api:atomic-builtin
gcc_version:4.8.5
process_id:36457
run_id:d580da83e18929d6b37d826991dc705172de928c
tcp_port:6379
uptime_in_seconds:24729
uptime_in_days:0
hz:10
lru_clock:3752638
executable:/usr/local/src/redis-4.0.11/redis-server
config_file:/etc/redis.conf

Clients
connected_clients:1
client_longest_output_list:0
client_biggest_input_buf:0
blocked_clients:0

Memory
used_memory:851096
used_memory_human:831.15K
used_memory_rss:7970816
used_memory_rss_human:7.60M
used_memory_peak:851096
used_memory_peak_human:831.15K
used_memory_peak_perc:100.08%
used_memory_overhead:837134
used_memory_startup:786584
used_memory_dataset:13962
used_memory_dataset_perc:21.64%
total_system_memory:3958075392
total_system_memory_human:3.69G
used_memory_lua:37888
used_memory_lua_human:37.00K
maxmemory:0
maxmemory_human:0B
maxmemory_policy:noeviction
mem_fragmentation_ratio:9.36
mem_allocator:jemalloc-4.0.3
active_defrag_running:0
lazyfree_pending_objects:0

Persistence
loading:0
rdb_changes_since_last_save:3
rdb_bgsave_in_progress:0
rdb_last_save_time:1530478637
rdb_last_bgsave_status:ok
rdb_last_bgsave_time_sec:0
rdb_current_bgsave_time_sec:-1
rdb_last_cow_size:6545408
aof_enabled:1
aof_rewrite_in_progress:0
aof_rewrite_scheduled:0
aof_last_rewrite_time_sec:-1
aof_current_rewrite_time_sec:-1
aof_last_bgrewrite_status:ok
aof_last_write_status:ok
aof_last_cow_size:0
aof_current_size:3560
aof_base_size:0
aof_pending_rewrite:0
aof_buffer_length:0
aof_rewrite_buffer_length:0
aof_pending_bio_fsync:0
aof_delayed_fsync:0

Stats
total_connections_received:2
total_commands_processed:211
instantaneous_ops_per_sec:0
total_net_input_bytes:7390
total_net_output_bytes:24177
instantaneous_input_kbps:0.00
instantaneous_output_kbps:0.00
rejected_connections:0
sync_full:0
sync_partial_ok:0
sync_partial_err:0
expired_keys:4
expired_stale_perc:0.00
expired_time_cap_reached_count:0
evicted_keys:0
keyspace_hits:97
keyspace_misses:10
pubsub_channels:0
pubsub_patterns:0
latest_fork_usec:927
migrate_cached_sockets:0
slave_expires_tracked_keys:0
active_defrag_hits:0
active_defrag_misses:0
active_defrag_key_hits:0
active_defrag_key_misses:0

Replication
role:master
connected_slaves:0
master_replid:91c7968e04d1852516098681ea3bbd3e052b4252
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:0
second_repl_offset:-1
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0

CPU
used_cpu_sys:17.50
used_cpu_user:8.47
used_cpu_sys_children:0.32
used_cpu_user_children:0.00

Cluster
cluster_enabled:0

Keyspace
db0:keys=14,expires=0,avg_ttl=0
db1:keys=1,expires=0,avg_ttl=0
--------------------------------------------------------------------------
127.0.0.1:6379> FLUSHDB #FLUSHDB清空当前数据库中所有的key
127.0.0.1:6379> KEYS *
127.0.0.1:6379> FLUSHALL #FLUSHALL清空所有库中所有的key
127.0.0.1:6379> KEYS *
127.0.0.1:6379> SELECT 1

127.0.0.1:6379[1]> KEYS *
127.0.0.1:6379> BGSAVE #保存数据到磁盘,在后台运行
127.0.0.1:6379> save #保存数据到磁盘,在前台运行
127.0.0.1:6379> CONFIG GET * #获取所有配置参数
127.0.0.1:6379> CONFIG GET dir #获取配置参数
127.0.0.1:6379> CONFIG GET dbfilename
127.0.0.1:6379> CONFIG SET timeout 100 #更改配置参数
#redis数据恢复:首先定义或者确定dir目录和dbfilename,然后把备份的rdb文件放到dir目录下面,重启redis服务即可恢复数据。
127.0.0.1:6379> CONFIG GET timeout

Redis安全设置
#设置监听IP:
vim /etc/redis.conf

bind 127.0.0.1 192.168.1.1 #设置内网IP,可以是多个,用空格分隔

#设置监听端口:
vim /etc/redis.conf

port 16000 #不要设置为默认端口6379

#设置密码:
vim /etc/redis.conf

requirepass 123123 #密码为123123

redis-cli -a '123123' #重启服务之后再次登录redis

#把redis命令行里面的config命令改名:
vim /etc/redis.conf

rename-command CONFIG lzx #把config命令改为lzx命令,保存退出重启服务

#禁掉config命令:
vim /etc/redis.conf

rename-command CONFIG "" #保存退出重启服务

Redis慢查询日志
针对慢查询日志,可以设置两个参数,一个是执行时长,另一个是慢查询日志的长度。当一个新的命令被写入日志时,最老的一条会从命令日志队列中移除出去。
#编辑配置文件:
vim /etc/redis.conf #默认配置

slowlog-log-slower-than 10000 //单位:μs,即10ms
slowlog-max-len 128

#在redis命令行下,
slowlog get #列出所有的慢查询日志
slowlog get 2 #只列出2条
slowlog len #查看慢查询日志条数

#PHP安装redis扩展模块 下载redis:
cd /usr/local/src/
wget https://codeload.github.com/phpredis/phpredis/zip/develop
mv develop phpredis.zip
unzip phpredis.zip
cd phpredis-develop/
/usr/local/php-fpm/bin/phpize
#编译安装:
./configure --with-php-config=/usr/local/php-fpm/bin/php-config
echo $?
0
make
echo $?
0
make install
echo $?
0

vim /usr/local/php-fpm/etc/php.ini #增加一行

extension=redis.so

/usr/local/php-fpm/bin/php -m
[PHP Modules]
Core
ctype
curl
date
dom
ereg
exif
fileinfo
filter
ftp
gd
hash
iconv
json
libxml
mbstring
mcrypt
mysql
openssl
pcre
PDO
pdo_sqlite
Phar
posix
redis #有redis说明没问题
Reflection
session
SimpleXML
soap
SPL
sqlite3
standard
tokenizer
xml
xmlreader
xmlwriter
zlib

[Zend Modules]

/etc/init.d/php-fpm restart #重启php-fpm服务
Gracefully shutting down php-fpm . done
Starting php-fpm done
-----------------------------------------------------------
Redis存储session
#编辑配置文件:
vim /usr/local/php-fpm/etc/php-fpm.conf

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

#编辑存session记录的脚本:
vim session.php #写入下面内容

<?php
session_start();
if (!isset($_SESSION['TEST'])) {
$_SESSION['TEST'] = time();
}
$_SESSION['TEST3'] = time();
print $_SESSION['TEST'];
print "<br><br>";
print $_SESSION['TEST3'];
print "<br><br>";
print session_id();
?>

mv session.php /usr/local/nginx/html/

#进行测试:
curl localhost/session.php
1530489156<br><br>1530489156<br><br>st5k899dgb370g9ul54kalhf14

curl localhost/session.php
1530489158<br><br>1530489158<br><br>nt89nio8q5s81imr51op8as6i4

curl localhost/session.php
1530489159<br><br>1530489159<br><br>fjn7oi5tn0dmus2fds18earvr6

curl localhost/session.php
1530489160<br><br>1530489160<br><br>gpc9vtajh3sdsv7h0hufmembb7

curl localhost/session.php
1530489163<br><br>1530489163<br><br>q03c4qq5j6ts781d5su3lmqr73

redis-cli

127.0.0.1:6379> KEYS *
1) "PHPREDIS_SESSION:gpc9vtajh3sdsv7h0hufmembb7"
2) "PHPREDIS_SESSION:q03c4qq5j6ts781d5su3lmqr73"
3) "PHPREDIS_SESSION:nt89nio8q5s81imr51op8as6i4"
4) "PHPREDIS_SESSION:st5k899dgb370g9ul54kalhf14"
5) "PHPREDIS_SESSION:fjn7oi5tn0dmus2fds18earvr6"

#这就说明,我们上面的配置没有问题,Redis中保存了session。
127.0.0.1:6379> GET PHPREDIS_SESSION:fjn7oi5tn0dmus2fds18earvr6 #查询对应key的value
"TEST|i:1530489159;TEST3|i:1530489159;" #查出来的这个value可以和上面curl出来的对应

原文地址:https://www.cnblogs.com/buffercache/p/12658528.html