• Redis自学笔记:3.2入门-字符串类型


    3.2字符串类型

    • 实际上redis不只是数据库,更多的公司和团队将redis用作缓存和
      队列系统

    3.2.1介绍

    字符串类型是redis最基本的数据类型,它能存储任何形式的字符串,
    包括二进制数据.你可以用其存储用户的邮箱、JSON化的对象甚至
    是一张图片.

    • 一个字符串类型键允许存储的数据的最大容量是512M

    • 字符串类型是其他4中数据类型基础,其他数据类型和字符串类型
      的差别是从某种角度来说只是组织字符串的形式不同.例如,

      • 列表类型是以列表的形式组织字符串
      • 集合类型是以集合的形式组织字符串

    3.2.2 命令

    1. 赋值与取值:set key value / get key

      127.0.0.1:6379> set bar '早上好'
      OK
      127.0.0.1:6379> get bar
      "xe6x97xa9xe4xb8x8axe5xa5xbd"
      127.0.0.1:6379> set foo 'hello'
      OK
      127.0.0.1:6379> get foo
      "hello" 
      
      • $redis-cli --raw启动客户端,显示中文
    2. 递增数字:incr key

      127.0.0.1:6379> incr num
      1
      127.0.0.1:6379> incr num
      2
      
      • 当操作的键不存在时会默认值为0,所以第一次递增后的结果是1.
      127.0.0.1:6379> set foo lorem
      OK
      127.0.0.1:6379> incr foo
      ERR value is not an integer or out of range
      
      • 当键值不是整数时,redis会提示错误

    3.2.3实践

    1. 文章访问量统计

      为每篇文章使用一个名为post: 文章ID: page.view的键来记录文章
      的访问量,每次访问文章的时候incr命令使相应的键值增加

      • redis对键的命名没有强制的要求,但比较好的实践是用 "对象类型:对象ID:对象属性" 来命名一个键.如"user:1:friends"
    2. 生成自增ID

      关系型数据库中设置字段属性为AUTO_INCREMNT.

      redis中实现的方法:

      对于每一类对象使用名为对象类型(复数形式):count的键来存储当前类型对象的数量,每增加一个新的对象时都使用incr命令增加该键的值.

      由于incr命令建立的键初始值数1,所以很容易得知,incr命令返回值既是加入该对象后的当前类型对象的总数,又是该新增加对象的ID

    3. 存储文章数据

      每个字符串类型键只能存储一个字符串,而一篇博客文章是由标题、正文、
      作者与发布时间等多个元素构成。为了存储这些元素,我们需要使用序列化
      函数将它们转换成字符串。除此之外因为字符串类型键可以存储二进制数据,
      所以也可以使用messagePack进行序列化,速度更快,占用空间也小。
      存储文章伪代码:

      # 首先获得新文章的id
      $postID = incr posts:count
      # 将博客文章的诸多元素序列化成字符串
      $serializedPost = serialize($title,$content,$author,$time)
      # 把序列化后的字符串存入字符串类型的键中
      set post:$postID:data,$serializedPost
      

      获取文章伪代码(以访问id为42的文章为例):

      # 从redis中读取文章数据
      $serializedPost = get post:42:data
      # 将文章数据反序列化成文章的各个元素
      $title,$content,$author,$time = unserialize($serializedPost)  
      # 获取并递增文章的访问数量
      $count = incr post:42:page.view
      

      还可以对每个元素使用一个字符串类型键来存储

    3.2.4命令拾遗

    1. 增加指定的整数:incrby key int(可为负,即为减)

      127.0.0.1:6379> incrby bar 2
      2
      127.0.0.1:6379> incrby bar 3
      5
      
    2. 减少指定的整数:decrby key int(可为负,即为加)

      127.0.0.1:6379> decrby bar 1
      4
      127.0.0.1:6379> decrby bar 3
      1
      
    3. 增加指定浮点数:incrbyfloat key 数(可为负,即为减,亦可为整数)

      127.0.0.1:6379> incrbyfloat bar 0.5
      1.5
      127.0.0.1:6379> incrbyfloat bar -0.5
      1
      127.0.0.1:6379> incrbyfloat bar 5e+4
      50001
      
    4. 向尾部追加值:append key value

      127.0.0.1:6379> set bar hello
      OK
      127.0.0.1:6379> get bar
      hello
      127.0.0.1:6379> append bar world!
      11
      127.0.0.1:6379> get bar
      helloworld!
      127.0.0.1:6379> append bar ' good'
      16
      127.0.0.1:6379> get bar
      helloworld! good
      
      • 该方法可以创建键
      127.0.0.1:6379> keys *
      bar
      127.0.0.1:6379> append foo book
      4
      127.0.0.1:6379> keys *
      bar
      foo
      
    5. 获取字符串长度:strlen key

      127.0.0.1:6379> strlen bar
      16
      127.0.0.1:6379> set bar 你好
      OK
      127.0.0.1:6379> strlen bar
      6
      
    6. 同时获得/设置多个键值:meset k1 v1 k2 v2... / get k1 k2...

      127.0.0.1:6379> keys *
      
      127.0.0.1:6379> mset a 1 b 2 c 3
      OK
      127.0.0.1:6379> keys *
      b
      c
      a
      127.0.0.1:6379> mget c b a
      3
      2
      1
      
    7. 位操作:

    getbit key offset

    获得一个字符串类型键指定位置的二进制位的值(0或1),索引从0开始

    • 如果超出了索引,默认值为0

    setbit key offset value

    设置字符串指定位置的二进制的值,返回值是该位置的旧值

    bitcount key [start][end]

    获得字符串类型键中值是1的二进制位个数

    [start][end]限制统计的字节范围

    bitop operation destkey [key...]

    对多个字符串类型键进行位运算,并将结果存储在deskey参数指定的键中

    bitop支持的运算操作符:and or xor not

    bitpos key value [start][end]

    获得指定键第一个值是value(0或者1)的位置

    • 如果不设置结束字节且键值所有的二进制位都是1,则查询0的偏移量会是键值长度的下一个字位的偏移量
        127.0.0.1:6379> set foo bar
        OK
        127.0.0.1:6379> getbit foo 0
        0
        127.0.0.1:6379> getbit foo 1
        1
        127.0.0.1:6379> getbit foo 2
        1
        127.0.0.1:6379> getbit foo 3
        0
        127.0.0.1:6379> getbit foo 6
        1
    
    • bar三个字母对应的ascll码为9897114,所以foo键中二进制位结构是
      01100010 01100001 01110010
        127.0.0.1:6379> setbit foo 6 0
        1
        127.0.0.1:6379> setbit foo 7 1
        0
        127.0.0.1:6379> get foo
        aar
    
        127.0.0.1:6379> bitcount foo
        10
        127.0.0.1:6379> bitcount foo 0 1
        6
    
        127.0.0.1:6379> keys *
        foo2
        foo1
        foo
        127.0.0.1:6379> bitop or res foo1 foo2
        3
        127.0.0.1:6379> keys *
        foo2
        foo1
        res
        foo
        127.0.0.1:6379> get res
        car
        127.0.0.1:6379> bitop and res foo1 foo2
        3
        127.0.0.1:6379> get res
        `ar
    
        127.0.0.1:6379> bitpos foo 0
        0
        127.0.0.1:6379> bitpos foo 1
        1
        127.0.0.1:6379> bitpos foo 1 1 2
        9
    
  • 相关阅读:
    Fibonacci(斐波那契)数列方法整理
    java数组可遍历但是不能作为Iterable参数传递
    欧几里得算法的证明
    List<? extends Pet>中问号的解释
    P1387 最大正方形
    P1313 计算系数
    P1049 装箱问题
    乘积最大
    P1091 合唱队形
    bsgs
  • 原文地址:https://www.cnblogs.com/wangbaby/p/10141178.html
Copyright © 2020-2023  润新知