最近几年随着互联网技术的飞速发展,Redis数据库由于其具有非常好的数据处理速度和广泛的数据类型支持,受到越来越多的应用。据说到目前为止,Redis在数据的处理速度上还没有任何一个对手。然而由于其处理的数据都需要在内存中操作,所以Redis并不适合操作太大的数据量(也许有一天内存能像硬盘那么大的时候可以考虑),但是目前还是有很多方案去解决这种问题,但是这些进阶的东西现在我们不讨论,还是先踏踏实实的学习一下Redis的基础知识。
下载windows版Redis压缩包,设置其根目录,然后将根目录添加到环境变量Path中。
1、启动Redis:cmd命令“redis-server.exe”
2、另起cmd窗口,登入命令:redis-cli.exe -h 127.0.0.1 -p 6379,出现以下显示即登录成功
如果需要登入的Redis数据库有密码则应在命令后加" -a [password]"
redis 127.0.0.1:6379> _
3、获取配置文件的全部信息:CONFIG GET *
4、获取配置文件指定字段信息:CONFIG GET [THE_CONFIG_NAME],例CONFIG GET timeout
5、设置配置文件中指定字段的内容:CONFIG SET [THE_CONFIG_NAME] [THE_CONFIG_VALUE],例CONFIG SET timeout 100
本节只研究几个数据类型的简单实用命令,其他命令后面再进行学习。
1、Strings - 字符串。理论上字符串值可以储存最长512M字节的长度。
SET [THE_String_NAME] [THE_String_VALUE]
例SET myname zhangsan
通过GET [THE_String_NAME]获取对应的键值:
GET myname
2、Hashes - 哈希值。理论上每个哈希可以储存(2^32-1)约等于40亿个键值对。插入语法:
HMSET [HASH_KEY] [KEY VALUE KEY VALUE KEY VALUE ...]
例 HMSET zs name zhangsan age 20 job student hobby computer
取出哈希语法:
根据hashkey全部取出:
HGETALL [HASH_KEY]
例HGETALL zs
根据hashkey和key取出指定字段:
HGET [HASH_KEY] [KEY]
例HGET zs name
3、Lists - 列表。理论上列表的最大长度同样是(2^32-1)。List类型存入用LPUSH(大小写不敏感),读出用LRAENGE [start] [end](查看不删除)或LPOP(相当于删除操作)。LPUSH的时间复杂度为O(1),即每次只能插入一条数据。
下面是存入一组名为mylist的List列表:
redis 127.0.0.1:6379> LPUSH mylist zhangsan (integer) 1 redis 127.0.0.1:6379> LPUSH mylist lisi (integer) 2 redis 127.0.0.1:6379> LPUSH mylist wangwu (integer) 3
上面的integer 123是存入数据系统的提示,告诉我们当前列表中共有多少数据。现在我们来看下LRANGE [start] [end]这个命令,其中的start和end表示的是下标,跟JAVA中的数组下标类似,从0开始。使用LRANGE命令:
redis 127.0.0.1:6379> LRANGE mylist 0 5 1) "wangwu" 2) "lisi" 3) "zhangsan" redis 127.0.0.1:6379> LRANGE mylist 0 -2 1) "wangwu" 2) "lisi" redis 127.0.0.1:6379> LRANGE mylist 1 2 1) "lisi" 2) "zhangsan"
此处需要注意,上面的下标使用了负数,在Redis中,下标正着数从0开始往后退,而倒着来的话,下标则是从-1开始,即倒数第一个数据为-1,倒数第二个为-2,按照插入顺序来看的话,则是第一个插入的为-1,第二个插入的为-2,以此类推。也就是说,“0 -1”即表示第一个到最后一个的所有数据。
通过上面的测试我们可以发现,当向List中添加数据的时候,最后一个插入的数据下标为0,这跟我们的数组操作正好相反。上面测试数据的下标对应如下:
wangwu - 0
lisi - 1
zhangsan - 2
而且从上面的操作可以看出,LRANGE仅仅只是通过指定下标范围查看List中的内容,我们再来看下LPOP的操作:
redis 127.0.0.1:6379> LPOP mylist "wangwu" redis 127.0.0.1:6379> LPOP mylist "lisi" redis 127.0.0.1:6379> LPOP mylist "zhangsan" redis 127.0.0.1:6379> LPOP mylist (nil) redis 127.0.0.1:6379> LRANGE mylist 0 5 (empty list or set)
可以发现LPOP推出数据的同时把值从mylist中删除了,而出栈的顺序是后入先出(最后插入的先推出)。
其实说白了,所谓的List就是一个相同的key对应多个值(值可以相同,这个就不再演示了),这些值用下标来区分。
4、Sets - 集合。Set集合的最大成员数量同上。同一个Set集合中,value不能重复,这一点与List不同。Set集合添加数据的命令为:
SADD [setname] [member member member ...]
SADD的时间复杂度为O(N),即每次可以插入多个数据。如下:
redis 127.0.0.1:6379> SADD nameset zhangsan (integer) 1 redis 127.0.0.1:6379> SADD nameset zhangsan lisi wangwu zhaoliu (integer) 3 redis 127.0.0.1:6379> SMEMBERS nameset 1) "zhaoliu" 2) "wangwu" 3) "lisi" 4) "zhangsan"
上面的测试中我们向名为“nameset”的集合中第一次插入了1个数据,第二次插入了四个数据,然而第二次只有不相同的三个数据被插入成功了,这说明Set中的value是不允许重复的。然后通过SMEMBERS [setname]命令查看了名为nameset的集合中的所有value。值得一提的是,Set集合貌似不支持List那样通过range命令按照下标查看数据,但是Set可以通过SPOP [setname]的出栈命令随机查看value并同时从Set中删除此value,也可以通过SRANDMEMBER [setname]的命令随机取出一个value但并不删除。如下面所示:
redis 127.0.0.1:6379> SRANDMEMBER nameset "zhaoliu" redis 127.0.0.1:6379> SRANDMEMBER nameset "zhangsan" redis 127.0.0.1:6379> SMEMBERS nameset 1) "zhaoliu" 2) "wangwu" 3) "lisi" 4) "zhangsan" redis 127.0.0.1:6379> SPOP nameset "lisi" redis 127.0.0.1:6379> SMEMBERS nameset 1) "zhaoliu" 2) "wangwu" 3) "zhangsan"
移除某个value可使用SREM [setname] [member member ...],可见移除的时间复杂度同样是O(N):
redis 127.0.0.1:6379> SREM nameset wangwu (integer) 1 redis 127.0.0.1:6379> SMEMBERS nameset 1) "zhaoliu" 2) "zhangsan"
5、Sorted Set - 排序集合。同Set集合类似,只不过此集合多了一个score的属性,以score作为排序的标准,score值可以是整数,也可以是双精度浮点数。
为排序集合添加数据用ZADD [sorted_set_name] {[score member] [score member] ...}命令(时间复杂度为O(M*log(N)),其中M为要添加的数据数量,N为该排序集合的基数),排序集合同样可以一次插入多个数据,如下:
redis 127.0.0.1:6379> ZADD salary 5000 zhangsan 4000 lisi 6000 wangwu (integer) 3 redis 127.0.0.1:6379> ZRANGE salary 0 -1 1) "lisi" 2) "zhangsan" 3) "wangwu"
上面我们向salary这个排序集合添加了三个数据,用ZRANGE [sorted_set_name] [start] [end]从输出结果来看(同Set集合有所区别,Sorted Set集合允许使用下标范围查看数据),系统自动为我们添加的三个数据按照其score值从小到大(递增)进行了排序,score最小的值其下标为0。想要按照递减的顺序查看,则使用ZREVRANGE [sorted_set_name] [start] [end]命令:
redis 127.0.0.1:6379> ZREVRANGE salary 0 -1 1) "wangwu" 2) "zhangsan" 3) "lisi"
移除命令类似于Set:ZREM [sorted_set_name] [member member ...],时间复杂度同样是M*log(N),移除时不用score属性。
此外还有ZRANGEBYSCORE和ZREVRANGEBYSCORE等命令,这里先不研究。
待续 ... ...