暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Redis 入门指南

程序员随想 2021-06-21
333

Redis简介

Redis通常被称为数据结构服务器。这意味着Redis通过一组命令提供对可变数据结构的访问,这些命令是使用带有TCP套接字和简单协议的服务器-客户端模型发送的。因此,不同的进程可以以共享的方式查询和修改相同的数据结构。在Redis中实现的数据结构具有一些特殊属性:

  • 即使始终为它们提供服务并将它们修改到服务器内存中,Redis也会将它们存储在磁盘上。这意味着Redis速度很快,但它也是非易失性的。

  • 数据结构的实现强调内存效率,因此与使用高级编程语言建模的相同数据结构相比,Redis内部的数据结构将使用较少的内存。

  • Redis提供了许多自然可以在数据库中找到的功能,例如复制,持久性的可调级别,集群和高可用性。


Redis与Memcached

在性能上Redis是单线程模型,而Memcached支持多线程,所以在多核服务器上后者的性能更高一些。

Redis妙用

Redis的列表类型键可以用来实现队列,并且支持阻塞式读取,可以很容易地实现一个高性能的优先级队列。同时在更高层面上,Redis还支持“发布/订阅”的消息模式,可以基于此构建聊天室等系统

Redis多数据库

Redis默认支持16个数据库,可以通过配置参数databases来修改这一数字。客户端与Redis建立连接后会自动选择0号数据库,不过可以随时使用SELECT命令更换数据库,如要选择1号数据库:

    redis> SELECT 1
        
    OK

    redis [1]> GET foo

    (nil)

    然而这些以数字命名的数据库又与我们理解的数据库有所区别。

    • Redis不支持自定义数据库的名字,每个数据库都以编号命名,开发者必须自己记录哪些数据库存储了哪些数据。

    • Redis也不支持为每个数据库设置不同的访问密码,所以一个客户端要么可以访问全部数据库,要么连一个数据库也没有权限访问。

    • 最重要的一点是多个数据库之间并不是完全隔离的,比如FLUSHALL命令可以清空一个Redis实例中所有数据库中的数据。

    综上所述,这些数据库更像是一种命名空间,而不适宜存储不同应用程序的数据。

    Redis Strings

    字符串类型是Redis中最基本的数据类型,它能存储任何形式的字符串,包括二进制数据。你可以用其存储用户的邮箱、JSON化的对象甚至是一张图片。一个字符串类型键允许存储的数据的最大容量是512 MB.

      > set mykey somevalue
      OK
      > get mykey
      "somevalue"


      Redis对于键的命名并没有强制的要求,但比较好的实践是用“对象类型:对象ID:对象属性”来命名一个键,如使用键user:1:friends来存储ID为1的用户的好友列表。

      Redis数字自增(INCR  INCRBY  DECR  DECRBY)

      Redis自增是原子性的,即不会出现当客户端1和客户端2同时给一个值为10进行自增的时候得到的值都是11,一定是一个客户端获取的值是11,另外一个是12.

        > set counter 100
        OK
        > incr counter
        (integer) 101
        > incr counter
        (integer) 102
        > incrby counter 50
        (integer) 152


        Redis合并操作(MSET)

          > mset a 10 b 20 c 30
          OK
          > mget a b c
          1) "10"
          2) "20"
          3) "30"


          Redis查询

            > set mykey hello
            OK
            > exists mykey
            (integer) 1
            > del mykey
            (integer) 1
            > exists mykey
            (integer) 0


            > set mykey x
            OK
            > type mykey
            string
            > del mykey
            (integer) 1
            > type mykey
            none


            Redis键过期设置

              > set key some-value
              OK
              > expire key 5
              (integer) 1
              > get key (immediately)
              "some-value"
              > get key (after some time)
              (nil)


              > set key 100 ex 10
              OK
              > ttl key
              (integer) 9

              Redis Lists

              Redis的列表是通过Linked List实现的,这就意味着添加元素的时间复杂度是 O(1).

                > rpush mylist A
                (integer) 1
                > rpush mylist B
                (integer) 2
                > lpush mylist first
                (integer) 3
                > lrange mylist 0 -1
                1) "first"
                2) "A"
                3) "B"


                > rpush mylist a b c
                (integer) 3
                > rpop mylist
                "c"
                > rpop mylist
                "b"
                > rpop mylist
                "a"

                LTRIM 排除制定索引的元素:

                  (integer) 5
                  > ltrim mylist 0 2
                  OK
                  > lrange mylist 0 -1
                  1) "1"
                  2) "2"
                  3) "3"

                  通过Lists实现阻塞队列(BRPOP BLPOP):

                  > brpop tasks 5
                  1) "tasks"
                  2) "do_something"
                  文章转载自程序员随想,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                  评论