zoukankan      html  css  js  c++  java
  • redis-小用

    1、redis之flushall、flushdb‘尴尬’操作恢复

    redis是基于内存的一种高效数据库,在内存中高效但是不安全,重启和断电都会导致数据丢失。所以就需要用到数据的持久化,redis有两种持久化的方式:AOF和RDB,AOF是将所有执行的命令记录在appendonly.aof文件中,可能会影响redis的性能(写入量”特别特别特别“大的时候)。但是AOF可以保证数据丢失最少。并且如果误操作执行了flushall也可以恢复。RDB是直接将数据持久化到dump.rdb文件,是一个二进制文件。写入速度快,但是故障期间未持久化的数据都丢失了,并且如果没有备份dump.rdb文件的话,执行flushall数据就无法恢复了。至于使用自行根据业务场景来决定。如果两个都是用,则redis会优先使用AOF。

    2、执行flushall

    不小心误操作,执行了flushall,如果开启了AOF模式的持久化,不要进行其他的操作,立刻断开当前连接的redis或切到其他的节点,然后执行如下操作:

    >shutdown  nosave

    然后kill调redis进程:

    # pkill  redis

    到存放appenonly.aof文件的目录,然后编辑此文件,找到flushall这一行,并删除:

    #vim appendonly.aof

    $1
    0
    *2
    $6
    SELECT
    $1
    0
    *1
    $8
    FLUSHALL

    #sed -i  's/FLUSHALL//g' appendonly.aof

    #sed -i 's/FLUSHDB//g'   appendonly.aof

    然后重启redis,登录就可以看到之前的数据就恢复了。

    3、为了防止这种误操作,可以禁止flushall

    #vim  redis.conf

    rename-command FLUSHALL ""

    rename-command FLUSHDB ""

    rename-command KEYS ""

    测试环境可以不用做,KEYS主要是防止如果数据库里面key的数量巨大的话会导致redis收到严重影响。

    4、redis认证

    #vim  redis.conf

    requirepass  "Test@123"

    连接命令:

    #redis-cli -h 192.168.1.201 -p 6379  -a "Test@123"

    5、手动持久化

    有两个手动持久化的命令:save、bgsave,save会阻塞当前redis的读写,bgsave是在后台进行持久化,不会造成阻塞。

    #redis-cli -h 192.168.1.201 -p 6379  -a "Test@123"

    192.168.1.201:6379>bgsave

    6、redis简单的数据迁移

    以RDB为例:

    首先准备好一个干净的redis服务,配置完毕,指定好dir,如dir  /data/redis

    正在运行的redis上最好先停止对redis的写操作,如果不能停止redis的读写,那就需要操作的快一些,减少数据的丢失,:

    先连接redis:

    #redis-cli -h 192.168.1.201 -p 6379  -a "Test@123"

    >bgsave

    将dump.rdb文件copy到新的redis的数据目录即/data/redis目录下:

    #scp  dump.rdb   root@192.168.1.10:/data/redis

    #redis-server  redis.conf

    检查数据:

    如果数据都存在0库

    >SELECT  0

    >DBSIZE

    和之前的对比一下。或者直接查一下key,确定某个key是否存在。

    7、Hashmap

    类似C#中的dict类型或者C++中的hash_map类型。
    Redis Hash对应Value内部实际就是一个HashMap,实际这里会有2种不同实现,这个Hash的成员比较少时Redis为了节省内存会采用类似一维数组的方式来紧凑存储,而不会采用真正的HashMap结构,对应的value redisObject的encoding为zipmap,当成员数量增大时会自动转成真正的HashMap,此时encoding为ht

    应用场景:
    多个用户及对应的用户信息,可以用来存储以用户ID为key,将用户信息以key-value的形式进行存储
     
    常用命令:
    • HDEL
      HDEL key field[field...] 删除对象的一个或几个属性域,不存在的属性将被忽略

    • HEXISTS
      HEXISTS key field 查看对象是否存在该属性域

    • HGET
      HGET key field 获取对象中该field属性域的值

    • HGETALL
      HGETALL key 获取对象的所有属性域和值

    • HKEYS
      HKEYS key 获取对象的所有属性字段

    • HVALS
      HVALS key 获取对象的所有属性值

    • HLEN
      HLEN key 获取对象的所有属性字段的总数

    • HMGET
      HMGET key field[field...] 获取对象的一个或多个指定字段的值

    • HSET
      HSET key field value 设置对象指定字段的值

    • HMSET
      HMSET key field value [field value ...] 同时设置对象中一个或多个字段的值

    • HSTRLEN
      HSTRLEN key field 返回对象指定field的value的字符串长度,如果该对象或者field不存在,返回0.

    • HSCAN
      HSCAN key cursor [MATCH pattern] [COUNT count] 类似SCAN命令

    8、keyspace notification

    redis2.8版本以后,Keyspace Notifications 此特性允许客户端可以以 订阅/发布(Sub/Pub)模式,接收那些对数据库中的键和值有影响的操作事件

    修改redis.conf,添加如下内容:

    notify-keyspace-events "Ex"

    然后重启生效。

    也可以在客户端执行如下命令:

    参数解释:
    #  K     Keyspace events, published with __keyspace@<db>__ prefix.
    #  E     Keyevent events, published with __keyevent@<db>__ prefix.
    #  g     Generic commands (non-type specific) like DEL, EXPIRE, RENAME, ...
    #  $     String commands
    #  l     List commands
    #  s     Set commands
    #  h     Hash commands
    #  z     Sorted set commands
    #  x     Expired events (events generated every time a key expires)
    #  e     Evicted events (events generated when a key is evicted for maxmemory)
    #  A     Alias for g$lshzxe, so that the "AKE" string means all the events.

  • 相关阅读:
    JSPatch 可以让你用 JavaScript 书写原生 iOS APP
    iOS如何解析crash文件中的地址
    这几个Xocode插件用过一段时间还比较稳定好用,Xcode6兼容,推荐给大家:
    你的下拉刷新是否“抖”了一下
    iOS上Delegate的悬垂指针问题
    UITableView性能优化
    block详解
    runloop timer
    图片知识总结
    视像会议软件推荐备忘
  • 原文地址:https://www.cnblogs.com/cuishuai/p/7928905.html
Copyright © 2011-2022 走看看