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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,076评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,658评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,732评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,493评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,591评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,598评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,601评论 3 415
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,348评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,797评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,114评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,278评论 1 344
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,953评论 5 339
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,585评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,202评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,442评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,180评论 2 367
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,139评论 2 352

推荐阅读更多精彩内容