虽然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中。
如果Key不存在,进行了set操作.
如果Key不存在,进行了set操作.
与之还有相对应的INCRBY 和DECRBY,增加多少值,减少多少值。INCR可以写作INCRBY key 1, 也可以写作DECRBY key -1.同理DECR可以写作INCRBY key -1,也可以写作DECRBY key 1
还有一个INCRBYFLOAT指令增加浮点数,但没有DECRBYFLOAT指令。如果Key不存在返回-1.
字符串形式的整数有效。当然第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入门指南》