Redis学习笔记之三:String类型

         

    String类型是Redis最重要的数据类型,其他4种类型都是以String作为基础的。Redis为操纵String类型的数据提供了许多指令,指令数量算是5种类型最多的了。虽然Redis提供的String指令没有Java等编程语言中String的API丰富,但在我看来,其实各有千秋,你可以使用一个简单的指令完成Java中需要10行左右的代码才能完成的事。但String类型存储是有限制的,Value最大大小为500MB。

    打开Redis,开始练习吧!

    1、SET/GET. SET指令用于设置Key-Value,而GET用于获取Key对应的Value。需要注意的是,SET/GET命令只能用于String类型,用于其他类型会报错,下面的其他命令也是如此。演示如下:其中LPUSH是操作List类型的命令,这个会在后面讲到。


    这儿值得注意的是GET命令,如果在服务器取值,Key不存在的情况返回是(nil),而使用Java的Client取值,Key不存在,返回的是null。

    2、STRLEN.获取字符串的长度应该是最平常不过的需求了,STRLEN用于获取指定Key的Value的长度。


    可以看到不存在的Key会返回0,但有可能Key对应的Value长度本身就为0.

    3、APPEND.这个指令用于向字符串尾部追加字符串。这个指令比较有趣,看下图演示:


    追加成功会返回追加后的字符串长度,而如果追加的Key不存在,那这个指令相当于SET指令,但会返回长度。

    4、MSET/MGET 这两个指令可以看成Multipart SET以及Multipart GET,意思就是可以一次性设置多个或获取多个,与Mysql的INSERT的Values一致。但MSET指令注意的是,Key—Value必须成对出现,否则不会执行。演示如下图:


    5、位操作,计算机从被发明直到现在,依旧只认识0和1。而Redis提供了命令可以对String类型直接进行二进制操作。

    SETBIT 与GETBIT,看下面演示吧:

    ①、通过set number 2 设置number便于以后操作。这儿2的二进制表示10,补全0位就是00000010.

    ②、通过SETBIT number 6 0指令将number二进制的第6位设置为0,上面的二进制从左往右数第6位,下标从0开始。

    ③、通过get number查看结果。


    setbit返回值是设置该位置的值。可能有的设置number为10却没有达到应有的效果,例如下面这个,10的二进制为00001010,按理说应该得到的结果为11


    可结果依旧为10,这是因为字符串10是两个字符组成,1和0,所以把10用两个字节存储,Redis中10实际是下面的结构。

00000001 00000000

    修改7位置为1,当然结果不会改变。这儿还有注意的是中文是使用三个字节存储。


    所以在Redis里面没有中文,但使用程序拉取数据显示时会有16进制转为中文。

    GETBIT可以返回指定位置的值。如果超出了范围则为0.


    BITCOUNT指令返回二进制下1的个数。可以指定范围。如果表示该String的字节数大于1,如上面的中字,则后面范围则是字节数的范围,比如下面这个:


    可以看到第一个字节的1个数为4,对应E4的二进制11100100。

    而关于Redis的二进制计算还有一个坑,什么坑?前面说到了10是被分为两个字节存储的,没错。但并不是

00000001 00000000
    而是这种形式:

00110001 00110000
    所以下面演示结果是3:


   这种形式只有数字会这样,字母以及汉字等都是正常的。留个坑,后面再来解决。

   BITOP 进行二进制运算,支持运算符AND OR XOR NOT,使用格式如下


   会依次将number1 与number2进行相应运算,再与number进行运算,最后将结果保存到result中。

   6、INCR指令,increment的前4个字母,将字符串形式的整数+1 ,如果Key不存在,进行了set操作.

      DECR指令,与INCR相反,将字符串形式的整数值-1,如果Key不存在,进行了set操作.



    与之还有相对应的INCRBY 和DECRBY,增加多少值,减少多少值。INCR可以写作INCRBY key 1, 也可以写作DECRBY key -1.同理DECR可以写作INCRBY key -1,也可以写作DECRBY key 1


    还有一个INCRBYFLOAT指令增加浮点数,但没有DECRBYFLOAT指令。如果Key不存在返回-1.    

    最最最重要的是,第6点包含的指令只对字符串形式的整数有效。当然第5点包含的指令也基本是用不到。

Redis的Java客户端

    测试代码如下:
package org.yamikaze.redis.test;

import redis.clients.jedis.Jedis;

import java.util.List;

/**
 * 测试String类型
 * @author yamikaze
 */
public class TestString {

    public static void main(String[] args) {
        Jedis client = MyJedisFactory.defaultJedis();

        String nameKey = "username";
        String nameValue = "yamikaze";

        String birthKey = "birth";
        String birthValue = "1995";

        String sexKey = "sex";
        String sexValue = "man";

        /**
         * 对应MSET
         */
        String setResult = client.mset(nameKey, nameValue, birthKey, birthValue,
                sexKey, sexValue);
        System.out.println("MSET result : " + setResult);

        /**
         * 对应MGET
         */
        List<String> values = client.mget(nameKey, birthKey, "notExistKey");
        if(values != null) {
            //注意了size为3,不存在的Key返回为null
            System.out.println(values.size());
            System.out.println(values.get(2));
        }

        /**
         * 对应STRLEN
         */
        long nameLength = client.strlen(nameKey);
        System.out.println(nameLength);

        /**
         * 对应APPEND,返回的是向尾部增加字符串之后的长度
         */
        long appendResult = client.append(nameKey, "1234");
        System.out.println(appendResult);

        /**
         * 对应BITCOUNT
         */
        long bitCount = client.bitcount(nameKey, 0, 100);
        System.out.println(bitCount);

        /**
         * 对应INCR
         */
        String value = "1996";
        Long incr = client.incr(birthKey);
        System.out.println(value.equals(incr.toString()));

        Long decr = client.decrBy(birthKey, 1);
        System.out.println(birthValue.equals(decr.toString()));
    }
}

参考资料

    《Redis入门指南》








  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值