• 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出来的对应

  • 相关阅读:
    vue和animate动画库实现选项卡
    vue-实现购物车(vue指令、filter过滤器、computed计算属性、Vue.set)
    vue-组件通讯传值(子传父、父传子、兄弟组件)
    vue-双向数据绑定获取表单form所有值
    selenium之处理alert弹出对话框
    selenium之frame操作
    关于selenium中页面元素(Elements)定位思路整理
    Selenium---元素定位之CSS定位
    selenium select下拉选择框定位处理的两种方式
    selenium 通过xpath进行元素定位--By.xpath()
  • 原文地址:https://www.cnblogs.com/buffercache/p/12658528.html
Copyright © 2020-2023  润新知