• redis总结


    前言

    非关系型数据库

    基础理论

    参考1

    参考2

    什么是redis

    基于c语言开发的key-value内存高速缓存数据库

    特点

    • 性能好,每秒可以处理10万次读写操作
    • 支持多种数据结构:string,list,set,zset,hash

    优缺点

    缺点:

    • 数据库容量收到物理内存的限制

    优点:

    • 速度快
    • 支持丰富的数据类型
    • 支持事务,操作都是原子性
    • 丰富的特性,可用于缓存、消息,设置有效期等。

    与memcache相比的优势

    • 丰富的数据类型
    • 速度快
    • 支持持久化

    原生使用

    操作数据

    string

    set company "itcast"
    
    get name
    
    del name
    
    # 存十秒
    set company itcast EX 10
    

    list

    # 写入
    lpush mylist a b c
    
    # 从头部(第一个)读取一个
    lpop mylist
    # c
    
    # 从尾部(后边)读取一个
    rpop mylist
    # a
    

    set

    sadd myset a b c
    
    # 获取所有
    smembers myset
    
    # 删除指定
    srem myset a b
    

    zset

    hash

    hset myhash username haohao
    
    hget myhash username
    
    hdel myhash username username2 //可以删除多个
    

    通用命令

    keys pattern

    keys *
    

    del key1 key2…

    del company
    

    exists key

    exists compnay
    # 1代表存在
    

    type key

    返回的字符串为string、list、set、hash,如果key不存在返回none

    type company
    

    其他命令

    incr key 给key加1,如果不存在则新建并初始化为0,加1后为1

    存储方式

    rdb

    默认存储方式

    存储的名字、位置、频率

    save 900 1
    save 300 10
    save 60 10000
    
    # The filename where to dump the DB
    dbfilename dump.rdb
    
    # For default save/load DB in/from the working directory
    # Note that you must specify a directory not a file name.
    dir ./
    

    aof

    开启

    appendonly yes
    # 默认会在目录下产生一个appendonly.aof文件,rdb存储的会丢失
    # redis-cli config set appendonly yes 命令开启,rdb数据不丢失
    
    appendfsync always 每执行一次更新命令,持久化一次
    appendfsync everysec 每秒钟持久化一次
    appendfsync no 不持久化
    

    无持久化

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

    常见性能问题和解决方案

    问题:

    rdb:Master写内存快照,当快照比较大时会很大影响性能,所以master不要写内存快照;

    aof:aof文件过大也会影响master重启速度,所以不要做任何持久化,rdb影响最大;

    解决:

    如果数据比较关键,在某个slave开启aof备份数据即可。

    为了主从复制的性能,slave和master最好在同一个局域网。

    并发竞争问题如何解决

    redis为单进程单线程模式,采用队列模式将并发访问变成串行访问。

    所以多个客户端并不存在竞争,但是jedis客户端对redis并行访问时,会发生链接超时、客户端关闭等问题。

    解决:

    事务

    示例:

    > MULTI         开启
    OK
    
    > INCR foo      操作,如果不正确会报错,只是入队失败,不影响前后的命令
    QUEUED
    
    > INCR bar
    QUEUED
    
    > EXEC          执行
    1) (integer) 1
    2) (integer) 1
    

    不能回滚

    失败的命令是由编程错误造成的,而这些错误应该在开发的过程中被发现

    简单且快速

    使用 check-and-set 操作实现乐观锁

    如果在 WATCH 执行之后, EXEC 执行之前, 有其他客户端修改了 mykey 的值, 那么当前客户端的事务就会失败。 程序需要做的, 就是不断重试这个操作, 直到没有发生碰撞为止。

    这种形式的锁被称作乐观锁, 它是一种非常强大的锁机制。

    WATCH mykey
    
    val = GET mykey
    val = val + 1
    
    MULTI
    SET mykey $val
    EXEC
    

    缓存失效策略

    volatile-lru:从已设置过期时间的数据集(server.db[i].expires)中挑选最近最少使用的数据淘汰
    
    volatile-ttl:从已设置过期时间的数据集(server.db[i].expires)中挑选将要过期的数据淘汰
    
     volatile-random:从已设置过期时间的数据集(server.db[i].expires)中任意选择数据淘汰
    
    allkeys-lru:从数据集(server.db[i].dict)中挑选最近最少使用的数据淘汰
    
    allkeys-random:从数据集(server.db[i].dict)中任意选择数据淘汰
    
    no-enviction(驱逐):禁止驱逐数据
    

    使用场景

    会话缓存(Session Cache)

    全页缓存(FPC)

    队列

    排行榜/计数器

    ZRANGE user_scores 0 10 WITHSCORES
    

    发布/订阅

    订阅频道
    subscribe CCTV1
    
    发布频道信息,订阅端会立即收到并显示
    publish CCTV1 "cctv1 is good"
    

    java操作

  • 相关阅读:
    Java实验四
    Java第八周学习总结
    Java实验三
    输入输出练习
    第七周
    20145113 实验二 Java面向对象程序设计
    2020-2021-1 20209306 《linux内核原理与分析》第九周作业
    2020-2021-1 20209306 《linux内核原理与分析》第八周作业
    2020-2021-1 20209306 《linux内核原理与分析》第七周作业
    2020-2021-1 20209306 《linux内核原理与分析》第六周作业
  • 原文地址:https://www.cnblogs.com/birdofparadise/p/10012376.html
Copyright © 2020-2023  润新知