redis也是一个内存非关系型数据库,它拥有memcache在数据存储上的所有优势,并且在memcache的基础上增长了数据持久性功能,redis用rdb和aof两种方式实现数据持久性,在服务器忽然宕机时也能几乎保留已存的所有数据。php
固然,相比较memcache,它的数据库操做也较为复杂。python
redis除了能够用在memcache能用的地方,它还能够用在:mysql
在官网(http://redis.io/)下载到它的最新版本,直接解压,由于redis官方已经编译过了,直接进行make / make test ,在make install时能够指定其安装路径。redis
$ wget http://download.redis.io/releases/redis-4.0.8.tar.gz $ tar xzf redis-4.0.8.tar.gz $ cd redis-4.0.8 $ make
也可使用对应平台的安装包工具进行安装。sql
安装完成后,将安装包里的redis的conf文件mv到安装目录的bin目录下,它是配置和启动redis所必需的。数据库
除此,安装目录文件下src目录里还有以下文件。vim
redis-benchmark //性能测试工具 -n xxx 表示发出xxx条命令用来测试
redis-check-aof //检查aof日志的工具
redis-check-dump //检查rbd日志的工具
redis-cli //客户端
redis-server //redis的服务器进程
redis-sentinel //redis哨兵模式的进程设计模式
查看默认配置缓存
cat redis.conf |grep -v '^#' slowlog-log-slower-than 10000 slowlog-max-len 128 latency-monitor-threshold 0 notify-keyspace-events "" hash-max-ziplist-entries 512 hash-max-ziplist-value 64 list-max-ziplist-size -2 list-compress-depth 0 set-max-intset-entries 512 zset-max-ziplist-entries 128 zset-max-ziplist-value 64 hll-sparse-max-bytes 3000 activerehashing yes client-output-buffer-limit normal 0 0 0 client-output-buffer-limit slave 256mb 64mb 60 client-output-buffer-limit pubsub 32mb 8mb 60 hz 10 aof-rewrite-incremental-fsync yes
咱们用vim打开redis.conf来简单配置redis服务器。安全
将daemonize 选项改成yes来后台运行
database n 设置一个redis服务器里有n个服务器,默认为0-15共16个
port n 来设置redis服务器的监听端口
设置requirepass yourpassword来设置密码,客户端链接后用auth password来经过验证
咱们使用./redis-server ./redis.conf命令来打开redis服务器。
使用./redis-cli [-p port]来链接服务器(默认6379)。
基本(包括string字符串类型)命令
set key value [ex|px n] //设置值[并设置过时时间为n秒/毫秒] get key //获取值 del key //删除值 incby|decby key n //将key值自增或自减n rename key newkey//覆盖原来的 select n//选择第n个数据库 ttl key //查询key的过时时间,-1表示永不过时,不存在的为-2 expire key n //设置key的过时时间为n秒 type key //获取key的存储类型 flushdb //清除当前数据库中的值 shutdown [nosave]//关闭服务器[不存储]
lpush/rpush list value1 [value2 value3...] //将value压入链表头/尾 lpop/rpop list //弹出链表头/尾的值 llen list //获取链表长度
zadd sorted_set score1 key1 score2 key2 score3 key3...向有序集合中添加key,并定义其score,集合会用score对其排序 zrange sorted_set a b [withscores]从第a到第b显示有序列表中的值 b为-1时显示所有,[显示各个值的score] zrank/zrevrank sorted_set key 正序/倒序显示key在有序集合中的位置 zrem sorted_set key 删除有序集合中的key zcard sorted_set [m n]计算有序集合中[score在m到n之间的]一共有多少个
zadd sorted_set score1 key1 score2 key2 score3 key3...向有序集合中添加key,并定义其score,集合会用score对其排序 zrange sorted_set a b [withscores]从第a到第b显示有序列表中的值 b为-1时显示所有,[显示各个值的score] zrank/zrevrank sorted_set key 正序/倒序显示key在有序集合中的位置 zrem sorted_set key 删除有序集合中的key zcard sorted_set [m n]计算有序集合中[score在m到n之间的]一共有多少个
hset hashset key value 设置hash表key的值为value hget hashset key 获取hash表的key值 hdel hashset key 删除hash表中的一个key hlen hashset 获取hash表的长度
redis命令繁多,这里只列了一点简单的,具体命令能够其官网或其中文站http://www.redis.cn/查看翻译文档
redis中的事务与mysql的相似,只有语句有些不一样。
redis mysql 开始事务 multi start transition 事务中的query语句 执行事务 exec commit 回滚事务 discard roll back
对于并发影响,redis有watch语句控制,被watch语句监测的key值一旦在事务提交前发生变化,则事务自动被取消回滚。
watch key1 [key2...] unwatch 取消全部监测。
redis原生发布和订阅功能,它相似于设计模式中的观察者模式,被订阅对象一旦发布了新的消息,那么全部订阅对象都会收到这条消息。使用方式为:
subscribe key //订阅某个key,若是这个key发布了新的消息,则会收听到 public key value//发布消息key,值为value,返回值是收到这个消息的人的个数 unsubscribe key //取消监听 psubscribe key1 key2/pattrn //[根据模式]监听多个key
redis经过rdb和aof两种方式实现数据持久化,两种数据持久化方式都会占用CPU资源,拖慢redis的执行效率,通常两种模式配合使用。
rdb方式的主要原理就是达到某一写入条件后把内存中的全部数据的快照保存一份到磁盘上,数据恢复时用数据快照恢复。
aof方式是经过将每条redis执行命令记录入文本文件,恢复数据时重复执行记录的命令。
用save/bgSave命令能够主动使用rdb方式[后台]存储rdb
修改redis.conf文件进行配置
save m n //在m秒内有n次修改即进行一次快照,保存点很重要,通常会配置多个条件,知足其中之一就保存 stop-writes-on-bgsave-error yes //在进行快照的过程当中若是出错,则中止写入 rdbcompression yes //设置进行数据压缩 rdbchecksum yes //导入数据时检查文件是否损坏 dbfilename xxx.rdb //导出的文件名 dir path //导出的文件路径
aof持久化的问题在于将每条指令都记录下来,即便是对一个键的反复操做,这样会致使aof文件愈来愈大,使用aof重写将会大大减少aof文件的体积,由于它是在最后将数据库内数据的状态统一逆化为命令,而不论一个key通过了多少次变化。使用 bgrewrite 命令可手动重写aof文件。
noapppendfsync-on-rewrite yes //设置导出rdb时中止写入aof,aof会被写在内存队列里,dump rdb 完成后统一进行写入操做。 appendfsync everysec //每秒写入一次 appendfilename //path/filename.aof auto-aof-rewrite-percentage 100 //文件大小增加100%时重写 auto-aof-rewrite-min-size 64m //文件至少达到64m时重写
主从复制时,主从都要以本身的.conf文件来启动服务器。主服务器能够将rdb关闭,以从服务器来产生rdb,加快主服务器的速度。
从服务器复制一个redis6380.conf文件,设置端口,pid存放文件,只读,主服务器的密码。
port 6380 pidfile filename slave-read-only yes masterauth password
设置完成后,分别用不一样的conf文件打开服务器。
考虑到主服务器宕机的状况,咱们用sentinel redis哨兵来监测服务器状态,在主服务器宕机以后作出反应。sentinel是redis集成的,咱们只须要将安装包里的sentinel.conf文件拷贝到redis/bin目录下,使用redis-sentinel进程文件来启动服务器便可。
port 26379 //sentinel监听的端口号 daemonize yes //后台启动进程 sentinel monitor mymaster 192.168.100.211 6379 2 //设置主进程ip和端口号,并设置两个哨兵发现主服务器长时间没法链接才断定其宕机 sentinel down-after-milliseconds mymaster 30000 //30000毫秒链接不上断定为没法链接 sentinel parallel-syncs mymaster 1 //一个主服务器打开时,同时复制的从服务器数,太大的话会形成服务器瞬间拥堵 sentinel failover-timeout mymaster 900000 //在90000秒内哨兵再也不试图恢复原主服务器
安装好php的redis扩展后,就能够直接使用redis的类函数库了。
以下是典型的redis应用。
$redis=new Redis(); //实例化一个Redis对象 $redis->connect('host',port); //链接redis服务器 $redis->auth('password'); //用密码认证 $redis->set($key,$value[,$expire_time]);//设置一个值 $content=$redis->get($key); //获取值
pip install redis
In [3]: import redis In [4]: r = redis.Redis(host='localhost', port=6379, db=0) In [5]: dir(r) Out[5]: ['RESPONSE_CALLBACKS', '__class__', '__contains__', '__delattr__', '__delitem__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', '_georadiusgeneric', '_use_lua_lock', '_zaggregate', 'append', 'bgrewriteaof', 'bgsave', 'bitcount', 'bitop', 'bitpos', 'blpop', 'brpop', 'brpoplpush', 'client_getname', 'client_kill', 'client_list', 'client_setname', 'cluster', 'config_get', 'config_resetstat', 'config_rewrite', 'config_set', 'connection_pool', 'dbsize', 'debug_object', 'decr', 'delete', 'dump', 'echo', 'eval', 'evalsha', 'execute_command', 'exists', 'expire', 'expireat', 'flushall', 'flushdb', 'from_url', 'geoadd', 'geodist', 'geohash', 'geopos', 'georadius', 'georadiusbymember', 'get', 'getbit', 'getrange', 'getset', 'hdel', 'hexists', 'hget', 'hgetall', 'hincrby', 'hincrbyfloat', 'hkeys', 'hlen', 'hmget', 'hmset', 'hscan', 'hscan_iter', 'hset', 'hsetnx', 'hstrlen', 'hvals', 'incr', 'incrby', 'incrbyfloat', 'info', 'keys', 'lastsave', 'lindex', 'linsert', 'llen', 'lock', 'lpop', 'lpush', 'lpushx', 'lrange', 'lrem', 'lset', 'ltrim', 'mget', 'move', 'mset', 'msetnx', 'object', 'parse_response', 'persist', 'pexpire', 'pexpireat', 'pfadd', 'pfcount', 'pfmerge', 'ping', 'pipeline', 'psetex', 'pttl', 'publish', 'pubsub', 'pubsub_channels', 'pubsub_numpat', 'pubsub_numsub', 'randomkey', 'register_script', 'rename', 'renamenx', 'response_callbacks', 'restore', 'rpop', 'rpoplpush', 'rpush', 'rpushx', 'sadd', 'save', 'scan', 'scan_iter', 'scard', 'script_exists', 'script_flush', 'script_kill', 'script_load', 'sdiff', 'sdiffstore', 'sentinel', 'sentinel_get_master_addr_by_name', 'sentinel_master', 'sentinel_masters', 'sentinel_monitor', 'sentinel_remove', 'sentinel_sentinels', 'sentinel_set', 'sentinel_slaves', 'set', 'set_response_callback', 'setbit', 'setex', 'setnx', 'setrange', 'shutdown', 'sinter', 'sinterstore', 'sismember', 'slaveof', 'slowlog_get', 'slowlog_len', 'slowlog_reset', 'smembers', 'smove', 'sort', 'spop', 'srandmember', 'srem', 'sscan', 'sscan_iter', 'strlen', 'substr', 'sunion', 'sunionstore', 'time', 'touch', 'transaction', 'ttl', 'type', 'unwatch', 'wait', 'watch', 'zadd', 'zcard', 'zcount', 'zincrby', 'zinterstore', 'zlexcount', 'zrange', 'zrangebylex', 'zrangebyscore', 'zrank', 'zrem', 'zremrangebylex', 'zremrangebyrank', 'zremrangebyscore', 'zrevrange', 'zrevrangebylex', 'zrevrangebyscore', 'zrevrank', 'zscan', 'zscan_iter', 'zscore', 'zunionstore']
上面只是简单的介绍redis的使用,不少知识点都没有介绍。 后续有时间再按官方文档来一篇教程。