zoukankan      html  css  js  c++  java
  • redis

    redis
    Remote DIctionary Server
    nosql,键值存储,可持久存储;高级的kv存储和数据结构存储(列表,字典,哈希表,集合...);数据集是保存在内存中,所以访问性能很好;周期性的将内存中的数据写到磁盘中,以实现数据的持久性功能;单线程服务器(只有一个进程或线程);支持在服务器端运行Lua脚本;支持主从模式;支持cluster技术;
    redis
    KV cache and store:
    in-memory
    持久化
    主从(借助于sentinel实现一定意义上的HA)
    Clustering(分布式)
    数据结构服务器:
    string,List,Hash,Set,sorted Set(有序集合),bitmaps,HyperLogLog
    memcached
    内存中的cache,不提供持久存储能力;多线程;
    redis优势:
    丰富的操作:hashs,sets,sorted sets,hyperloglog等
    內建replication(复制)及cluster
    就地更新操作
    支援持久化(磁盘):避免雪崩效应
    memcached优势:
    多线程:善用多核CPU;更少的阻塞操作
    更少的内存开销
    更少的内存分配压力
    可能有更少的内存碎片
    存储系统有三类:
    RDBMS:关系型数据库:oracle,db2,postgresql,mysql,sql server
    NoSQL:非关系型:hbase,mongodb,memcached,redis,cassandra
    NewSQL:分布式:aerospike,foundationdb,rethinkdb
    ----------------------------------------------
    redis安装
    epel源
    yum install -y redis
    rpm -ql redis
    /etc/rc.d/init.d/redis
    /etc/rc.d/init.d/redis-sentinel
    /etc/redis-sentinel.conf
    /etc/redis.conf
    /etc/security/limits.d/95-redis.conf
    /usr/bin/redis-benchmark
    /usr/bin/redis-check-aof
    /usr/bin/redis-check-rdb
    /usr/bin/redis-cli
    /usr/bin/redis-sentinel
    /usr/bin/redis-server
    /usr/libexec/redis-shutdown
    配置文件:
    /etc/redis.conf
    启动:
    service redis restart
    lsof -i:6379
    进入redis:
    redis-cli -h 192.168.1.114
    帮助:
    查看命令组帮助:help @STRING (help @按tab键补全)
    查看某命令帮助:help @command help @list
    CLIENT LIST:列出所有的client
    SELECT 1:进入1号数据库(默认是0)
    SET disto centos 设置disto的值为centos
    GET disto 查看disto的值
    append disto rhel 设置disto为多个值,另一只值为rhel
    STRLEN disto 查看disto值的长度
    SETEN disto centos 该键值不存在时,才设定值为centos(若已经存在则该操作未能执行)
    SETXX disto centos 当该键值存在时,设定新的值为centos(若不存在则该操作未能执行)
    keys * 查看所有的key
    INCR
    DECR
    列表LIST操作:
    LPUSH:lpush(key, value):在名称为key的list头添加一个值为value的 元素
    RPUSH:rpush(key, value):在名称为key的list尾添加一个值为value的元素
    LPOP:返回并删除名称为key的list中的首元素
    RPOP:返回并删除名称为key的list中的尾元素
    LINDEX:lindex(key, index):返回名称为key的list中index位置的元素
    LSET:lset(key, index, value):给名称为key的list中index位置的元素赋值
    llen(key):返回名称为key的list的长度
    lrem(key, count, value):删除count个key的list中值为value的元素
    集合SET操作
    sadd(key, member):向名称为key的set中添加元素member
    sinter(key1, key2,…key N) :求集合的交集
    sunion(key1, (keys)) :求并集
    spop(key) :随机返回并删除名称为key的set中一个元素
    sismember(key, member) :member是否是名称为key的set的元素
    srem(key, member) :删除名称为key的set中的元素member
    smove(srckey, dstkey, member) :移到集合元素
    scard(key) :返回名称为key的set的基数
    sinterstore(dstkey, (keys)) :求交集并将交集保存到dstkey的集合
    sunionstore(dstkey, (keys)) :求并集并将并集保存到dstkey的集合
    sdiff(key1, (keys)) :求差集
    sdiffstore(dstkey, (keys)) :求差集并将差集保存到dstkey的集合
    smembers(key) :返回名称为key的set的所有元素
    srandmember(key) :随机返回名称为key的set的一个元素
    有序集合Sorted-sort
    zadd:向集合中添加一个元素
    ZADD weekday1 1 mon 2 tue 3 wed
    zcard:返回所有元素个数
    zcard weekday1
    zrank:按照索引排序 ,返回索引值
      zrank weekday1 tue 查看集合weekday1中元素tue对应的索引号
    zrange
        zrange weekday1 0 2 显示集合weekday1中的第1到第3个元素
    Hash操作:
    hset(key, field, value):向名称为key的hash中添加元素field
    hget(key, field):返回名称为key的hash中field对应的value
    hmget(key, (fields)):返回名称为key的hash中field i对应的value
    hmset(key, (fields)):向名称为key的hash中添加元素field 
    hkeys(key):返回名称为key的hash中所有键
    hvals(key):返回名称为key的hash中所有键对应的value
    hdel(key, field):删除名称为key的hash中键为field的域
    hincrby(key, field, integer):将名称为key的hash中field的value增加integer
    hexists(key, field):名称为key的hash中是否存在键为field的域
    hlen(key):返回名称为key的hash中元素个数
    hgetall(key):返回名称为key的hash中所有的键(field)及其对应的value
    #################################################################################
    基于认证访问redis
    vim /etc/redis.conf
    requirepass password
    redis-cli -h 192.168.1.114
    --->AUTH password
    清空数据库:
    FLUSHDB:清空当前库
    FLUSHALL:清空所有库
    事务:一组相关的操作,是一致性的,要么都执行,要么都不执行
    通过MULTI,EXEC,WATCH等命令实现事务功能:将一个或多个命令归并为一个操作提请服务器按顺序执行的机制;不支持回滚操作;
    MULTI:启动一个事务
    多个命令会放在队列中
    EXEC:执行事务:一次性将事务中的所有操作执行完成后返回给客户端
    WATCH:乐观锁:在EXEC命令执行之前,用于监视指定数量的键;如果监视中的某任意键值数据被修改,则服务器拒绝执行事务;
    connection相关命令:help @connection
    AUTH password ---Authenticate to the server
    ECHO message ---Echo the given string
    PING [message] ---Ping the server
    QUIT - ---Close the connection
    SELECT index ---Change the selected database for the current connection
    Server相关命令:help @server
    CLIENT SETNAME connection-name ---Set the current connection name
    CLIENT GETNAME - ---Get the current connection name
    CLIENT KILL [ip:port] --- Kill the connection of a client
    CONFIG RESETSTAT - ---Reset the stats returned by INFO
    CONFIG REWRITE - ---Rewrite the configuration file with the in memory configuration
    CONFIG SET parameter value ---Set a configuration parameter to the given value
    INFO [section] ---Get information and statistics about the server
    DBSIZE - ---Return the number of keys in the selected database
    SAVE - ---Synchronously save the dataset to disk
    BGSAVE - ---Asynchronously save the dataset to disk
    LASTSAVE - ---Get the UNIX time stamp of the last successful save to disk
    SLAVEOF host port ---Make the server a slave of another instance, or promote it as master
    SLOWLOG subcommand [argument] ---Manages the Redis slow queries log
    发布与订阅(publish/subscribe)
    频道:消息队列
    SUBSCRIBE:订阅一个或多个队列
    PUBLISH:向频道发消息
    UNSUBSCRIBE:退订此前订阅的频道
    PSUBSCRIBE:模式订阅
    redis的持久化
    RDB和AOF
    RDB:shapshot,快照,二进制格式;周期性地将数据保存至磁盘:数据文件默认为dump.rdb;
    客户端也可显示使用SAVE或BGSAVE命令启动快照保存机制:
    SAVE:同步,在主线程中保存快照,此时会阻塞所有的客户端请求;
    BGSAVE:异步,
    配置文件中:
    默认的保存策略:
    SAVE 900 1 900秒内有1个值发生变化
    SAVE 300 10 300秒内有10个数据发生变化
    SAVE 60 10000 60秒内有10000个数据发生变化
    stop-writes-on-bgsave-error yes
    rdbcompression yes
    rdbchecksum yes
    dbfilename dump.rdb
    dir /var/lib/redis
    AOf:Append Only File
    记录每一次写操作至指定的文件尾部实现持久化;当redis重启时,可以通过重新执行文件中的命令在内存重建数据库;
    BGREWRITEAOF:AOF文件重写;
    不会读取正在使用AOF文件,而通过将内存中的数据已命令的方式保存到临时文件中,完成之后替换原来的AOF文件;
    重写过程:
    1>redis主进程通过fork创建子进程;
    2>子进程根据redis内存中的数据创建数据库重建命令序列于临时文件中;
    3>父进程继承Client的请求,并会把这些请求中的写操作继续追加至原来AOF文件;额外的,这些新的写请求还会被放置于一个缓冲队列中;
    4>子进程重写完成,会通知父进程:父进程把缓冲中的命令写到临时文件中;
    5>父进程用临时文件替换老的AOF文件;
    配置文件中:
    appendonly no 表示没有开启AOF
    appendfilename "appendonly.aof"
    # appendfsync always
    appendfsync everysec 每秒写一次
    # appendfsync no 系统自行决定
    no-appendfsync-on-rewrite no
    auto-aof-rewrite-percentage 100
    auto-aof-rewrite-min-size 64mb
    注:持久本身不能取代备份,还应指定备份策略,对redis数据库定期进行备份;
    一般RDB和AOF不能同时启用:
    RDB和AOF同时启用时:
    BGSAVE和BGREWRITEAOF不会同时执行;
    在redis服务器启动用于恢复数据时,会优先使用AOF;
    复制
    特点:
    一个master可以有多个slave;
    支持链式复制;
    master以非阻塞方式同步数据至slave;
    配置:
    在slave端:
    >SLAVEOF master_ip master_port
    注:如果master使用了requirepass开启了认证功能,从服务器要使用masterauth password来连入服务请求使用此密码进行认证;
    sentinal:
    用于管理多个redis服务器实现HA
    监控
    通知
    自动故障转移
    流言协议:投票协议
    程序:redis-sentinel
    redis-server
    过程:
    1>服务器自身初始化,运行redis-server中专用于sentinal功能的代码;
    2>初始化sentinel状态,根据给定的配置文件,初始化监控的master服务器的列表;
    3>创建连向master的连接;
    专用配置文件:/etc/redis-sentinel.conf
    # sentinel monitor <master-name> <ip> <redis-port> <quorum法定票数> 监控主节点(可以有多个)
    sentinel monitor mymaster 127.0.0.1 6379 2
    # sentinel down-after-milliseconds <master-name> <milliseconds>
    sentinel down-after-milliseconds mymaster 30000 master超时30000毫秒认为down
    # sentinel parallel-syncs <master-name> <numslaves> 允许多少个从服务器向主服务器发出同步请求
    sentinel parallel-syncs mymaster 1
    # sentinel failover-timeout <master-name> <milliseconds> 故障转移:当主节点出现故障,将从节点提升为主节点的超时时间(默认3min)
    sentinel failover-timeout mymaster 180000
    主观下线,客观下线:
    主观下线:一个sentinel实例判断出某节点下线;
    客观下线:多个sentinel节点协商后判断出某节点下线;
  • 相关阅读:
    SSL JudgeOnline 1194——最佳乘车
    SSL JudgeOnline 1457——翻币问题
    SSL JudgeOnlie 2324——细胞问题
    SSL JudgeOnline 1456——骑士旅行
    SSL JudgeOnline 1455——电子老鼠闯迷宫
    SSL JudgeOnline 2253——新型计算器
    SSL JudgeOnline 1198——求逆序对数
    SSL JudgeOnline 1099——USACO 1.4 母亲的牛奶
    SSL JudgeOnline 1668——小车载人问题
    SSL JudgeOnline 1089——USACO 1.2 方块转换
  • 原文地址:https://www.cnblogs.com/skyzy/p/9226842.html
Copyright © 2011-2022 走看看