Redis学习笔记

  最近几年随着互联网技术的飞速发展,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等命令,这里先不研究。

待续 ... ...

 

你可能感兴趣的:(Redis学习笔记)