• redis总结


    1.什么是redis?

    redis是一个基于内存的高性能key-value数据库。可用于缓存,事件发布或订阅,高速队列等场景。

    redis全称为remote  dictionary server(远程字典服务器)用C语言编写的,是当下热门的NoSql数据库。

    redis默认有16个数据库,从0开始。可用  select 数据库号 来选择数据库,默认使用的0号数据库。

    redis默认没有密码。

    2.redis支持多种数据类型(string,list,hash,set,sorted set)

    1)String

    String是redis最基本的数据类型,redis中的一个字符串的value最多可以是512M

    常用命令:set/get/mset/mget/incr/decr/incrby/decrby等

    // 演示 set/get/mset/mget
    127.0.0.1:6379> set k v OK 127.0.0.1:6379> get k "v" 127.0.0.1:6379> mset k1 v1 k2 v2 OK 127.0.0.1:6379> mget k1 k2 1) "v1" 2) "v2" 127.0.0.1:6379> // incr/incrby演示 操作的value必须是数字否则报错。 127.0.0.1:6379> set k3 3 OK 127.0.0.1:6379> incr k3 (integer) 4 127.0.0.1:6379> incrby k3 3 (integer) 7 127.0.0.1:6379> get k3 "7" 127.0.0.1:6379>

    2)list

    redis 的list实现是一个双向的链表。支持反向查找和遍历;

    常用命令:lPush/rPush/lPop/rPop/lRange等。

    127.0.0.1:6379> lpush list a b c
    (integer) 3
    127.0.0.1:6379> lrange list 0 -1
    1) "c"
    2) "b"
    3) "a"
    127.0.0.1:6379> rpush list 1 2 3
    (integer) 6
    127.0.0.1:6379> lrange list 0 -1
    1) "c"
    2) "b"
    3) "a"
    4) "1"
    5) "2"
    6) "3"
    127.0.0.1:6379> rpop list
    "3"
    127.0.0.1:6379> lpop list
    "c"
    127.0.0.1:6379> 

    3)Hash

    redis的hash的value实际上是一个HashMap;

    常用命令:hSet/hGet/hmSet/hmget/hgetAll/hDel等

    127.0.0.1:6379> hset hash age 20
    (integer) 1
    127.0.0.1:6379> hget hash age
    "20"
    127.0.0.1:6379> hmset hash1 name tale age 20
    OK
    127.0.0.1:6379> hmget hash1 name age
    1) "tale"
    2) "20"
    127.0.0.1:6379>      

    4)set

    set内部实现是一个value为null的HashMap。

    常用命令:sAdd/sMembers/sPop/sRem/sDiff/sunion等

    127.0.0.1:6379> sadd set a b c d
    (integer) 4
    127.0.0.1:6379> smembers set
    1) "a"
    2) "d"
    3) "b"
    4) "c"
    127.0.0.1:6379> spop set
    "c"
    127.0.0.1:6379> srem set a
    (integer) 1
    127.0.0.1:6379> sadd set1 a b
    (integer) 2
    127.0.0.1:6379> sdiff set set1
    1) "d"
    127.0.0.1:6379> sunion set set1
    1) "a"
    2) "b"
    3) "d"
    127.0.0.1:6379>

    5)sorted set

    可以理解为有序的set。

    实现方式:使用HashMap和跳跃表(SkipList)来保证数据的存储和有序;

    常用命令:zadd/zrem/zscore/zRange等;

    127.0.0.1:6379> zadd zset 90 a 80 b 70 c
    (integer) 3
    127.0.0.1:6379> zrange zset 0 -1
    1) "c"
    2) "b"
    3) "a"
    127.0.0.1:6379> zrange zset 0 -1 withscores
    1) "c"
    2) "70"
    3) "b"
    4) "80"
    5) "a"
    6) "90"
    127.0.0.1:6379>    

    redis支持(部分支持)事务

    redis执行事务的过程:

    • 开启事务(multi)
    • 命令入队
    • 执行事务(exec)

    redis的单个命令执行都是遵循原子性的。

    然而redis的事务却不遵循原子性。比如:

    127.0.0.1:6379> set k a
    OK
    127.0.0.1:6379> multi
    OK
    127.0.0.1:6379> set k1 1
    QUEUED
    127.0.0.1:6379> incr k
    QUEUED
    127.0.0.1:6379> get k1
    QUEUED
    127.0.0.1:6379> get k
    QUEUED
    127.0.0.1:6379> exec
    1) OK
    2) (error) ERR value is not an integer or out of range
    3) "1"
    4) "a"
    127.0.0.1:6379>  

    以上就可以看出redis的事务不是原子性的。原子性:是要么都执行,要么都不执行。

    redis持久化

    redis的持久化方式有两种:RDB和aof(默认使用RDB,aof是关闭的:appendonly no)

    RDB持久化方式:redis会fork一个子进程和父进程的数据、环境变量等一致,在指定时间间隔内保存数据到临时文件中,待持久化结束,再替换上一次持久化文件。整个过程中,主进程是不进行任何IO操作的。

    redsi.conf配置文件中:

    save 900 1     #900秒内如果超过1个Key被修改,则启动快照保存
    save 300 10    #300秒内如果超过10个Key被修改,则启动快照保存
    save 60 10000  #60秒内如果超过10000个重点被修改,则启动快照保存
    

    rdb在指定时间内修改次数超过规定次数就会产生rdb文件(文件名默认为:dump.rdb 建议不要修改文件名)

    flushAll也会产生dump.rdb文件,但是里面是空的,无意义;

    rdb快照:

    • save:只管保存,其他不管,全部阻塞
    • bgsave:会在后台进行异步快照操作,快照的同时还可以响应客户端请求。

    优点:高效。

    缺点:数据一致性较弱,会缺失最后一次持久化的数据。fork的时候内存数据被克隆了一份,消耗内存。

    aof持久化方式:采用文件追加的方式。持续追加会导致文件越来越大,因此增加了重写机制,当aof文件超过阈值,会触发重写机制,redis就会启动aof文件的内容压缩,

    只保留可以恢复数据的最小指令集,可以使用bgrewrietaof

    rewrite(重写)原理:aof文件持续增长过大,超过阈值(64M)是,fork一个新的进程来重写aof文件,没有读取旧aof文件而是将内存的数据库的内存以命令的方式重写了一个aof文件。redis会记录上一次重写是aof文件的大小,默认配置aof文件是上一次aof文件大小的一倍。

    redis默认不开启aof持久化。需要在redis.conf文件修改appendonly on 修改为yes

    如aof文件被写坏,可用命令:redis-check-aof--fix进行修复

    优点:数据一致性较强。

    缺点:相同数据集的数据aof文件要大于rdb文件,恢复速度慢于rdb

    当rdb和aof同时开启的时候,redis只会找aof文件。

    主从复制:主机可以进行读写操作,从机只能读,不能写。

    一主二仆:一个主机两个从机

    同时启动三个或多个:

    redis-server ../redis6379.conf   
    redis-cli -p 6379
    
    redis-server ../redis6380.conf   
    redis-cli -p 6380
    
    redis-server ../redis6381.conf   
    redis-cli -p 6381

    6380和6381作为从机执行: slaveof 127.0.0.1 6379(slaveof ip 主机端口)

    薪火相传:6379端口为6380主机,6380端口为6381的主机。

    反客为主:人为方式;当主机down,命令:slaveof no one

    哨兵模式:监听主机,当主机down了,会投票从机当主机。(二者投票数相同会重新投票)

    在sentinel.conf文件配置,如果没有则自己创建。

    sentinel monitor 主机名字(随意起)127.0.0.1 主机端口 1   // 1表示投票数为1时成为主机
    //然后命令启动哨兵模式
    ./redis-sentinel ../sentinel.conf

    //以上操作是在centos环境操作的。

    哨兵模式可实现高可用。

    redis的应用场景有哪些会话缓存(最常用)

    1. 消息队列,
    2. 比如支付
    3. 活动排行榜或计
    4. 发布,订阅消息(消息通知)
    5. 商品列表,评论列表等

     redis常用命令:

    keys * // 查看当前库的所有key
    exists key // 判断是否存在key
    ttl key  // 查看key的过期时间 返回-2表示已过期或者不存在-1表示永不过期
    expire key 秒  // 为key设置过期时间
    type key // 判读key的类型
    
    // 事务
    multi   // 事务开启
    exec   // 事务执行
    watch key [key]  // 监视一个或多个key,如果在事务执行之前,这些key被操作,事务将被打断
    unwatch // 取消watch命令对所有key的监视
    discard  // 取消事务
    
    select 1 //选择redis的1号数据库

    config get //获得服务配置
    confi get dir //获取redis的安装位置
    flushdb //删除当前选择的数据库中的key
    flushall //删除所有数据库中的键

    info
    info replication // 查看当前角色,主机,从机


    redsi-benchmark --help //redis自带的性能测试工具,此命令不是在redis里面使用

     命令大全

     

     

     http://doc.redisfans.com/

  • 相关阅读:
    nginx反向代理、让代理节点记录客户端真实IP
    Nginx反向代理多虚拟主机代理
    Nginx负载均衡
    Python装饰器笔记
    Python多线程学习笔记
    Python+Bottle+Sina SAE快速构建网站
    Python中使用ElementTree解析xml
    [转]浅谈Python web框架
    Python数据库连接池实例——PooledDB
    了解HTML的代码注释
  • 原文地址:https://www.cnblogs.com/chuangqi/p/11585633.html
Copyright © 2020-2023  润新知