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
  • 相关阅读:
    动态规划算法
    MapReduce学习笔记(4)
    MapReduce学习笔记(3)
    MapReduce学习笔记(2)
    Intellij IDEA output 中文乱码
    Spring实例化bean的三种方式
    Spring框架捕获所有URL的请求的处理方案
    异常解决:Mapped Statements collection does not contain value for …
    Java包 package 的命名规范, 命名规则
    拦截器 Filter : js、css、jpg、png等静态资源不被拦截解决方案
  • 原文地址:https://www.cnblogs.com/huaobin/p/14942099.html
Copyright © 2011-2022 走看看