Ubuntu安装Redis-Redis入门

以前项目开发使用Redis是作为缓存来使用的,而且自己也没有特别认真的专门学习过,倒是为了应付面试给自己强加了不少东西,但是我觉得任何一门技术的学习都应该是系统性的(自己经常浅尝则止),所以自己准备趁着这段时间再来好好学习一下。

一、redis安装

redis安装以及集群自己在虚拟机上都安装过,集群话要稍微复杂点,不过基本百度都能解决。这次我是在我本地电脑安装,系统是ubuntu18.04,安装方式有两种,一种是apt安装,另一种就是编译安装,因为自己习惯指定安装目录,所以我选择是第二种方式。首先到官网下载Redis包,目前最新版本是5.0,我下载版本是4.0.13,下载后移动到指定目录下解压。

$ cd /home/ypcfly/ypcfly/software/Redis
$ tar -zxvf redis-4.0.13

解压完成后需要进行编译,但是我没有安装gcc,所以还要先安装gcc

$ sudo apt-get install gcc

安装完成进入到redis的目录,并进行编译

$ cd /home/ypcfly/ypcfly/software/Redis/redis-4.0.13/
$ make

编译完成后启动Redis服务端

$ cd /ypcfly/software/Redis/redis-4.0.13/src
$ ./redis-server

然后启动redis客户端

$ cd /ypcfly/software/Redis/redis-4.0.13/src
$ ./redis-cli 

这时候就可以直接对Redis进行操作了。

二、Redis常用命令

Redis支持类型有string、list、hash、set、zset(sorted set)这五种类型。所以一般操作也就是在这几种数据类型上的增删改查,这里就简单说几种,更具体的可以参见官方文档。
1、string,string应该是应用最广泛数据类型了,其实Redis存储string类型,就类似与一个普通的key-value
下面简单的演示一下

127.0.0.1:6379> set num 1111
OK
127.0.0.1:6379> get num
"1111"
127.0.0.1:6379> set num2 2222
OK
127.0.0.1:6379> set num3 3333
OK
127.0.0.1:6379> set num4 001
OK
127.0.0.1:6379> 

以上是最简单的set、get操作,此外还可以对某个指定的key进行追加操作,如下:

127.0.0.1:6379> set ypc hello
OK
127.0.0.1:6379> get ypc
"hello"
127.0.0.1:6379> append ypc world
(integer) 10
127.0.0.1:6379> get ypc
"helloworld"
127.0.0.1:6379> 

append操作返回值就是追加后新的string长度。此外还有getset、mset、mget、setrange、getrange,下面一起简单看下吧

127.0.0.1:6379> set custom hello
OK
127.0.0.1:6379> get custom
"hello"
127.0.0.1:6379> getset custom world
"hello"
127.0.0.1:6379> get custom
"world"
127.0.0.1:6379> mset key1 value1 key2 value2 key3 value3
OK
127.0.0.1:6379> mget key1 key2 key3
1) "value1"
2) "value2"
3) "value3"
127.0.0.1:6379> set key_range "this is a range example"
OK
127.0.0.1:6379> setrange key_range 5 "new append"
(integer) 23
127.0.0.1:6379> get key_range
"this new append example"
127.0.0.1:6379> 
127.0.0.1:6379> getrange key_range 5 15
"new append "
127.0.0.1:6379> 
127.0.0.1:6379> getrange key_range 0 -1
"this new append example"
127.0.0.1:6379> getrange key_range -5 -1
"ample"
127.0.0.1:6379> 

除了这些命令之外还有其他命令,有时间看一下官方,还是很简单的。简单说一下上面几个命令吧:getset使用new value替换old value,返回结果就是old value;mset mget是对多个key-value进行操作;setrange用new value替换old value第n个以后的值;getrange是获取区间值,其中-1表示的是倒数第一个值,-2表示倒数第二个值,以此类推。非常建议大家仔细看下官方文档,各种操作都有介绍和例子,还有一些警告。我认为是非常值得好好看的。
2、hash,hash是一个key-value的集合,就是多个key和value的组合,hash特别适合存储对象,即属性(field)、属性值(value)。
看一下常用命令,hash类型的命令都是以“h”开头的

127.0.0.1:6379> hset myhash key1  value1
(integer) 1
127.0.0.1:6379> hget myhash key1
"value1"
127.0.0.1:6379> hmset hash1 field1 value1 field2 value2 field3 value3
OK
127.0.0.1:6379> hmget hash1 field1 field2 field3
1) "value1"
2) "value2"
3) "value3"
127.0.0.1:6379> hgetall hash1
1) "field1"
2) "value1"
3) "field2"
4) "value2"
5) "field3"
6) "value3"
127.0.0.1:6379> hdel myhash key1
(integer) 1
127.0.0.1:6379> hget myhash key1
(nil)
127.0.0.1:6379> hkeys hash1
1) "field1"
2) "field2"
3) "field3"
127.0.0.1:6379> hvals hash1
1) "value1"
2) "value2"
3) "value3"

hash的方法和string的get、set方法区别在于,操作时需要加上hash名称,根据上面例子感觉还是挺简单的。hgeall返回指定hash名称的key和value;hdel会删除指定hash的field对应的value值,成功返回1,否则返回0;hkeys、hvals分别返回整个hash的所有key或者value。此外还有一些方法,这里就不举例了。
3、list,list是简单的字符串列表,按照插入顺序排序,在头部(左边)添加,在尾部(右边)获取,常用操作看下面的例子:

127.0.0.1:6379> lpush listkey value value2 value3 value4 value5 value6 value7
(integer) 7
127.0.0.1:6379> lrange listkey 0 6
1) "value7"
2) "value6"
3) "value5"
4) "value4"
5) "value3"
6) "value2"
7) "value"
127.0.0.1:6379> lset listkey 6 value1
OK
127.0.0.1:6379> lrange listkey 0 6
1) "value7"
2) "value6"
3) "value5"
4) "value4"
5) "value3"
6) "value2"
7) "value1"
127.0.0.1:6379> rpush listkey rvalue1 rvalue2
127.0.0.1:6379> lrange listkey 0 -1
1) "value7"
2) "value6"
3) "value5"
4) "value4"
5) "value3"
6) "value2"
7) "value1"
8) "rvalue1"
9) "rvalue2"
127.0.0.1:6379> lpop listkey
"value7"
127.0.0.1:6379> lpop listkey
"value6"
127.0.0.1:6379> lpop listkey
"value5"
127.0.0.1:6379> lindex listkey 2
"value2"
127.0.0.1:6379> lindex listkey -2
"rvalue1"

list添加元素有两种方式,一种是在头部添加(lpush),一种是尾部添加(rpush),另外还有linsert,可以在指定元素之前或之后插入;弹出list元素也有两种方式,lpop和rpop,lpop返回的就是弹出的头部元素值,rpop这里就不演示了(弹出尾部元素)。lindex通过list的名称获取list对应位置的元素。此外还有lrem、llen等等,这里不演示了,官方文档每个命令都有例子,建议认真看一下。
4、set,set数据类型存储的是无序且不重复的string,它其实也是通过hash表来实现的。和hash类似,set的命令都是以s开头的,下面看一下它的常用命令

127.0.0.1:6379> sadd setkey string list hash set zset
(integer) 5
127.0.0.1:6379> scard setkey
(integer) 5
127.0.0.1:6379> smembers setkey
1) "set"
2) "hash"
3) "list"
4) "string"
5) "zset"
127.0.0.1:6379> spop setkey 2
1) "set"
2) "hash"
127.0.0.1:6379> smembers setkey
1) "string"
2) "list"
3) "zset"
127.0.0.1:6379> sadd mykey1 1 2 3 4 
(integer) 4
127.0.0.1:6379> sadd mykey2 3 4 5 6
(integer) 4
127.0.0.1:6379> sdiff mykey1 mykey2
1) "1"
2) "2"
127.0.0.1:6379> sinter mykey1 mykey2
1) "3"
2) "4"
127.0.0.1:6379> smove mykey1 mykey2 1
(integer) 1
127.0.0.1:6379> smembers mykey2 
1) "1"
2) "3"
3) "4"
4) "5"
5) "6"
127.0.0.1:6379> sismember mykey1 3
(integer) 1
127.0.0.1:6379> sismember mykey1 1
(integer) 0

sadd命令是添加元素,可以添加元素;scard返回的是对应set元素个数;spop可以从指定set中删除一定数量的值,返回结果就是删除的元素,另外删除的元素是随机的,并不像例子里面是有序的;sdiff返回的是两个不同set中不同元素,而sinter则是两个set的交集;smove是将一个set中的元素移动到另一个set中,成功返回1,否则返回0;sismember判断某个set中是否存在某个元素,存在返回1,否则返回0。命令比较多,自己只是选择性地挑选了几个。
5、zset,zset和set基本上相同,区别在于zset里面元素是有序的,zset集合中每个元素都会关联一个double类型的分数,redis正是通过分数来为元素进行从小到大进行排序。

127.0.0.1:6379> zadd zsetkey 1 value1 2 value2 3 value3 4 value4
(integer) 1
127.0.0.1:6379> zrange zsetkey 0 -1 withscores
1) "value1"
2) "1"
3) "value2"
4) "2"
5) "value3"
6) "3"
7) "value4"
8) "4"

zset的add命令有几个可选项,NX、XX、CH、INCR。XX表示只更新已存在元素,不添加元素;NX表示只添加元素,不更新已存在元素;CH将返回值从添加的新元素数修改为更改的元素总数。更改的元素是添加的新元素和已更新分数的已存在元素。 因此,命令行中指定的元素具有与过去相同的分数,不计算在内。 注意:通常ZADD的返回值仅计算添加的新元素的数量,原谅我没看懂什么意思......;选择INCR选项时,ZADD的行为类似于ZINCRBY。在此模式下只能指定一个得分元素对。
下面看下XX、NX选项的却别:

127.0.0.1:6379> zadd newkeys XX 0 value0 1 value1 2 value2 3 value3 
(integer) 0
127.0.0.1:6379> zrange newkeys 0 -1
(empty list or set)
127.0.0.1:6379> zadd newkeys 0 value0 1 value1 2 value2 3 value3 
(integer) 4
127.0.0.1:6379> zrange newkeys 0 -1 WITHSCORES
1) "value0"
2) "0"
3) "value1"
4) "1"
5) "value2"
6) "2"
7) "value3"
8) "3"
127.0.0.1:6379> zadd newkeys XX 4 VALUE4
(integer) 0
127.0.0.1:6379> zadd newkeys XX 1 NEWVALUE1
(integer) 0
127.0.0.1:6379> zrange newkeys 0 -1 WITHSCORES
1) "value0"
2) "0"
3) "value1"
4) "1"
5) "value2"
6) "2"
7) "value3"
8) "3"
127.0.0.1:6379> zadd newkeys NX 1 NEWVALUE1
(integer) 1
127.0.0.1:6379> zrange newkeys 0 -1 WITHSCORES
 1) "value0"
 2) "0"
 3) "NEWVALUE1"
 4) "1"
 5) "value1"
 6) "1"
 7) "value2"
 8) "2"
 9) "value3"
10) "3"
127.0.0.1:6379> zadd newkeys XX 4 value0
127.0.0.1:6379> zrange newkeys 0 -1 WITHSCORES
 1) "NEWVALUE1"
 2) "1"
 3) "value1"
 4) "1"
 5) "value2"
 6) "2"
 7) "value3"
 8) "3"
 9) "value0"
10) "4"

XX选项时无法添加新的元素,返回结果均为0;而NX选项时只能更新已存在元素,不能添加元素。
关于CH选项看下下面操作,好像和什么都不选择没区别,而且看文档解释也没太明白到底什么意思。

127.0.0.1:6379> zadd newkeys CH 5 value5
(integer) 1
127.0.0.1:6379> zadd newkeys CH 15 value5
(integer) 1
127.0.0.1:6379> zrange newkeys 0 -1 WITHSCORES
 1) "NEWVALUE1"
 2) "1"
 3) "value1"
 4) "1"
 5) "value2"
 6) "2"
 7) "value3"
 8) "3"
 9) "value0"
10) "4"
11) "value5"
12) "15"
127.0.0.1:6379> zadd newkeys CH 15 value15
(integer) 1
127.0.0.1:6379> zrange newkeys 0 -1 WITHSCORES
 1) "NEWVALUE1"
 2) "1"
 3) "value1"
 4) "1"
 5) "value2"
 6) "2"
 7) "value3"
 8) "3"
 9) "value0"
10) "4"
11) "value15"
12) "15"
13) "value5"
14) "15"

INCR在zadd中使用时,和ZINCRBY是一样的,下面看看具体的操作:

127.0.0.1:6379> zadd newkeys INCR 2 NEWVALUE1
"3"
127.0.0.1:6379> zadd newkeys INCR 12 NEWVALUE12
"12"
127.0.0.1:6379> zrange newkeys 0 -1 WITHSCORES
 1) "value1"
 2) "1"
 3) "value2"
 4) "2"
 5) "NEWVALUE1"
 6) "3"
 7) "value3"
 8) "3"
 9) "value0"
10) "4"
11) "NEWVALUE12"
12) "12"
13) "value15"
14) "15"
15) "value5"
16) "15"

如果当前元素存在,则就修改原来元素的分值,即在原分值的基础上,加上指定的分值,返回结果是新的分值。如果当前元素不存在,就是添加操作,返回的也是新增元素的分值。zset是有序的,所以修改分值后元素的顺序会有变化。
以上就是Redis几种数据结构的常用操作,其实还有好多命令没来得及演示,建议自己根据官方文档练习一下,虽然不需要多熟悉,至少需要的时候知道使用哪个命令。此外还有一些其他命令,比如事务的、发布/订阅、脚本等等,文档都有而且还有例子。关于Redis的安装和常用操作就先到这里了。


最后:自己在微信开了一个个人号:超超学堂,都是自己之前写过的一些文章,另外关注还有Java免费自学资料,欢迎大家关注。

二维码.jpg

你可能感兴趣的:(Ubuntu安装Redis-Redis入门)