zoukankan      html  css  js  c++  java
  • Redis 6

    下载redis的最新版

    wget http://download.redis.io/releases/redis-6.0.3.tar.gz

    解压并编译

    tar -zxvf redis-6.0.3.tar.gz
    cd redis-6.0.3
    make

    修改配置文件

    bind 127.0.0.1
    port 6666
    daemonize yes
    dir /data/redis6/
    pidfile /data/redis6/redis_6666.pid
    logfile "/data/redis6/redis_6666.log"

    启动

    ./redis-server redis.conf

    查看

    [root@mini redis6]# netstat -tunlp | grep 6666
    tcp        0      0 127.0.0.1:6666          0.0.0.0:*               LISTEN      26690/./redis-serve

    客户端查看

    复制代码
     ./redis-cli -p 666 --raw
    127.0.0.1:6666> auth 123456
    OK
    127.0.0.1:6666> set a 1
    OK
    127.0.0.1:6666> SAVE
    OK
    127.0.0.1:6666> exit
    [root@mini redis6]# ll
    total 57104
    -rw-r--r-- 1 root root      102 May 21 02:46 dump.rdb
    复制代码

    Redis 6 会给大家提供的新功能

    一、对用户使用有直接影响的功能

    1. ACL用户权限控制功能
    2. RESP3:新的 Redis 通信协议
    3. Cluster 管理工具
    4. SSL 支持

    二、Redis 内部的优化

    1. IO多线程支持
    2. 新的Module API
    3. 新的 Expire 算法

    三、外部工具

    1. Redis Cluster Proxy
    2. Disque

    ACL

    目前的 Redis(5及以下版本),没有用户权限管理这个概念,只有一个AUTH密码验证功能,基本上能够接入的用户就是root用户。
    ACL 就是为了避免接入的用户进行危险命令的操作开发的功能,这类命令如 FLUSHALLDEBUG等。
    多年来 Redis 管理员通过RENAME命令来进行限制。另一方面,开发人员有时候不清楚一些Redis 驱动的内部实现,可能无意中触发一些危险命令,所以也需要进行限制。
    Redis 6 中加入ACL的功能,能够对接入的用户进行三个层面的权限控制:
    (1)接入权限:用户名和密码;
    (2)可以执行的命令;
    (3)可以操作的 KEY。

    复制代码
    127.0.0.1:6666> ACL WHOAMI
    default
    127.0.0.1:6666> ACL setuser abcd on >mypasswd +@all ~*
    OK
    127.0.0.1:6666> ACL WHOAMI
    default
    127.0.0.1:6666> AUTH abcd mypasswd
    OK
    127.0.0.1:6666> ACL WHOAMI
    abcd
    127.0.0.1:6666> get a
    1
    127.0.0.1:6666> set a 2
    OK
    复制代码

    然后我尝试将 abcd 这个用户去掉SET命令的权限。

    复制代码
    127.0.0.1:6666> ACL setuser abcd -SET
    OK
    127.0.0.1:6666> set a 2
    NOPERM this user has no permissions to run the 'set' command or its subcommand
    
    127.0.0.1:6666> get a
    2
    复制代码

    RESP3

    RESP 全称 REdis Serialization Protocol,是 Redis 服务端与客户端之间通信的协议。Redis 5 使用的是 RESP2,而 Redis 6 开始在兼容 RESP2 的基础上,开始支持 RESP3。
    那么 RESP3 有哪些改进的地方呢?

    复制代码
    127.0.0.1:6666> HSET hash1 a 1 b 2 c 3
    3
    127.0.0.1:6666> HGETALL hash1
    a
    1
    b
    2
    c
    3
    127.0.0.1:6666>  HELLO 3
    server redis
    version 6.0.3
    proto 3
    id 5
    mode standalone
    role master
    modules
    127.0.0.1:6666> HGETALL hash1
    a 1
    b 2
    c 3
    复制代码

    Cluster 管理工具

    redis-trib.rb的功能集成到redis-cli,增加了一个backup命令。

    除了redis-cli,其实另一个工具的优化就是redis-benchmark

    [root@mini redis6]# ./redis-benchmark --help
    Usage: redis-benchmark [-h <host>] [-p <port>] [-c <clients>] [-n ......
     --threads <num>    Enable multi-thread mode.
     --cluster          Enable cluster mode.

    支持 SSL 连接

    Amazon 提供的一个功能,在 Redis 6 中 merge 进来。没有提及细节,不清楚对性能有多大影响。

    IO多线程

    Redis 终于实现多线程了!?先打住,多线程是不可能多线程的,这辈子都不可能多线程(后面这句是我加的)。

    作者先简单解释了为什么不能多线程(复杂性、锁的效率等等),然后提到就是有一个事情可以做成多线程,就是针对客户端的这部分。这个操作通过系统调用写操作,将客户端的输入输出缓冲中的数据通过多线程IO与客户端交互。作者说这部分通常能够占到CPU负载的50%,将这部分通过其他线程进行处理,核心流程还是单线程,实现起来也比较简单,性价比超高,所以就做了。
    这样能进一步提升单实例的性能,使用4核、8核等来分散写压力,不过再多几个核估计收益比不高了。如果真正想发挥多核性能,还是老路子——Cluster。

    Proxy

    针对 Cluster 的代理,这么多年了,仍然有不少人在Cluster的接入方式上挣扎,因为缺少合适的驱动而无法使用Cluster。所以开发了这个Proxy功能。作者也强调,虽然这个Proxy 让 Cluster 拥有了像单实例一样的接入方式,但是本质上还是 Cluster,不支持的命令还是不会支持,比如跨 slot 的多Key操作。
    其实社区早已有过不少 Proxy 方面的尝试,而且有些做的还不错。那么这个官方的 Proxy 究竟会给我们带来什么惊喜呢?还是让我们拭目以待吧。

    Disque

    这个本来是作者几年前开发的一个基于 Redis 的消息队列工具,但多年来作者发现 Redis 在持续开发时,他也要持续把新的功能合并到这个Disque 项目里面,这里有大量无用的工作。因此这次他在 Redis 的基础上通过 Modules 功能实现 Disque。

    如果业务并不需要保持严格消息的顺序,这个 Disque 能提供足够简单和快速的消息队列功能。

    复制代码
    ##### 操作数据库
    1. set 插入数据  
            127.0.0.1:6379> set host linux
            OK
    2. get 查询数据  
            127.0.0.1:6379> get host
            linux
            127.0.0.1:6379> get sssss
            
            127.0.0.1:6379> 
        **获取一个不存在的值返回空nil**
    3. del 删除键值  
            127.0.0.1:6379> del  host
            1
            127.0.0.1:6379> del  host
            0
    4. exists 验证键是否存在  
            127.0.0.1:6379> exists host
            1
            127.0.0.1:6379> del  host
            1
            127.0.0.1:6379> exists host
            0
    5. setnx 设置 key 对应的值为 string 类型的 value。如果 key 已经存在,返回 0,nx 是 not exist 的意思。
            127.0.0.1:6379> setnx name 1111
            0
            127.0.0.1:6379> setnx name11 1111
            1
        **设置成功返回1**
    6. setex 设置 key 对应的值为 string 类型的 value,并指定此键值对应的有效期
            127.0.0.1:6379> setex red 10 red
            OK
            127.0.0.1:6379> get red
            red
            127.0.0.1:6379> get red
            
            127.0.0.1:6379> exists red
            0
    7. setrange 设置指定 key 的 value 值的子字符串。
            127.0.0.1:6379> get name
            liudehua
            127.0.0.1:6379> setrange name 3 yifei
            8
            127.0.0.1:6379> get name
            liuyifei
            127.0.0.1:6379> setrange name 30 yifei
            35
            127.0.0.1:6379> get name
            liuyifeiyifei
            127.0.0.1:6379> setrange name 30 dehua
            35
            127.0.0.1:6379> get name
            liuyifeidehua
        **其中的 数字 是指从下标为数字(包含 数字)的字符开始替换(0开始)**
    8. mset 一次设置多个 key 的值,成功返回 ok 表示所有的值都设置了,失败返回 0 表示没有任何值被设置。
            127.0.0.1:6379> mset k1 v1 k2 v2 k3 v3
            OK
            127.0.0.1:6379> get k1
            v1
            127.0.0.1:6379> get k2
            v2
            127.0.0.1:6379> get k3
            v3
    9. msetnx 一次设置多个 key 的值,成功返回 ok 表示所有的值都设置了,失败返回 0 表示没有任何值被设置,但是不会覆盖已经存在的 key。
            127.0.0.1:6379> msetnx k1 v1 k2 v2 k3 v3
            0
            127.0.0.1:6379> msetnx k1111 v1 k2 v2 k3 v3
            0
            127.0.0.1:6379> exists k1111
            0
        **一个失败则全部设置失败,如果这条命令返回 0,那么里面操作都会回滚,都不会被执行。**
    10. getset 设置并返回原来的值
            127.0.0.1:6379> get name
            liuyifeidehua
            127.0.0.1:6379> getset name liudehua
            liuyifeidehua
            127.0.0.1:6379> get name
            liudehua
    11. getrange 获取指定 key 的 value 值的子字符串。
            127.0.0.1:6379> getrange name 1 3
            iud
            127.0.0.1:6379> getrange name 3 99999
            dehua
            127.0.0.1:6379> getrange name -7 -1
            iudehua
        **字符串左面下标是从0开始的 字符串右面下标是从-1 开始的 当下标超出字符串长度时,将默认为是同方向的最大下标**
    12. mget 一次获取多个 key 的值,如果对应 key 不存在,则对应返回 nil。
            127.0.0.1:6379> mget k1 k2 k3 k4
            v1
            v2
            v3
            
            127.0.0.1:6379> 
    13.  incr 自增操作 对 key 的值做加加操作,并返回新的值。注意 incr 一个不是 int 的 value 会返回错误,incr 一个不存在的 key,则设置 key 为 1  
            ```sbtshell
            127.0.0.1:6379> set age 10
            OK
            127.0.0.1:6379> incr age
            11
            127.0.0.1:6379> incr age
            12
            127.0.0.1:6379> incr name
            ERR value is not an integer or out of range
            
            127.0.0.1:6379> incr ageA
            1
            127.0.0.1:6379> incr ageA
            2
  • 相关阅读:
    飞入飞出效果
    【JSOI 2008】星球大战 Starwar
    POJ 1094 Sorting It All Out
    POJ 2728 Desert King
    【ZJOI 2008】树的统计 Count
    【SCOI 2009】生日快乐
    POJ 3580 SuperMemo
    POJ 1639 Picnic Planning
    POJ 2976 Dropping Tests
    SPOJ QTREE
  • 原文地址:https://www.cnblogs.com/huaobin/p/14942099.html
Copyright © 2011-2022 走看看