[Redis源码系列]在Liunx安装和常见API

1,230 阅读6分钟

前言

hello,好久不见,又断更了一段时间。同事大部分离职了,但是活还是一样,所以只能硬着头皮顶上。现在总算歇会了,决定开启Redis源码系列,希望不要啪啪啪打脸。


什么是redis?

Redis是一种基于键值对(key-value)的NoSQL数据库,主要的数据类型包括String(字符串),hash(哈希),list(列表),set(集合),zset(有序集合),bitmaps(位图),GEO(地理信息定位)等。

注意:如果面试问Redis数据类型,前五个是基础,必须答对,后面两个是亮点。

redis的优势

1.数据存储在内存中,读取和写入速度快。如果需要持久化,可以开启相关配置,数据定期保存在硬盘上。

2.使用单线程,避免线程竞争,也避免线程之间上下文切换消耗。

3.主节点和从节点之间可以复制,水平扩展,突破单机部署的限制。

4.提供哨兵和集群方式,保证有节点发生故障,保存整个服务的高可用性。

注意:以上的优点以后都会单开章节来讨论,现在有个大概印象就行,不用死记硬背😂。

redis基本安装

上面讲的是不是太空了,眼睛说记住了,脑子说没有🤣。那我们实操下,在linux上安装redis服务,看看怎么玩?至于windows比较简单,属于开箱即用的,这边就不写了。

1.下载压缩包

先去官网下载download.redis.io/releases/安装包,建议是下载redis4。之后看底层结构也是使用的redis4。


redis4和redis3的区别:

1.在redis4中,string类型的底层结构针对不同长度的字符串分为了sdshdr5,sdshdr8,sdshdr16,sdshdr32,sdshdr64等多种结构体,更加节约内存,而redis3只使用了int,embstr,raw。

2.在redis4中,持久化可以使用RDB和AOF混合方式。

2.上传到服务器并解压

   通过远程管理工具,将压缩包拷贝到Linux服务器中,执行解压操作


3.进入src目录,执行make install进行安装


4.开启后台启动配置

我们打开redis.conf文件,修改daemonize为yes,让其能在后台运行。


6.启动

使用redis-server启动redis,注意端口号为6379.


7.连接客户端

进入src目录,使用redis-cli连接客户端。


redis常用API

string类型

1.设置值 set [key] [value] [expried time] [nx|xx]

上面表示设置key的字符串,值为value,过期时间为expried time 。nx表示不存在才能设置成功,用于新增;xx表示存在才能设置成功,用于更新。

我们首先给str变量设置了hello,然后尝试用nx来更新str,但是发现更新失败了,因为nx表示str不存在的时候才能设置,现在str是存在的。最后用xx来更新,发现是更新成功的。


2.获取值 get key


3.批量设置值 mset [key value] [key value] [key value]

数据设置进去按组来划分的,每个key对应一个value,当设置成功后查询发现,出来是乱码,不是我们设置的中文。


其实这不是乱码,只是客户端显示问题,我们只需要在启动客户端的时候加上--raw,指定其显示格式即可。


4.批量获取值 mget [key] [key] [key]


hash类型

1.设置值 hset key field value


2.获取值hget key field,效果如上

3.批量设置值 hmset key [field] [value] [field] [value]


4.批量获取值 hmget key [field] [field] [field]


5.获取某个key所有的fields hkeys key


list类型

1.从list的左侧插入新数据 lpush key value

在list列表的左侧插入三个元素a,b,c,返回值为当前list的长度3。


2.从list的右侧插入新数据 rpush key value

在list列表的右侧插入两个元素d ,e,返回值为当前list的长度5。


3.查询list的所有元素

这边需要注意的是往左节点插入的三个元素顺序,lpush每次将新元素插入到列表的头部,所以顺序为 c,b,a。


4.获取列表长度llen key


5.从左侧删除元素 lpop key

删除链表的第一个元素,返回值为删除的元素值c。再查询下list现在的元素,分别是b,a,d,e。


6.从右侧删除元素 rpop key

与上面从左侧删除元素一样,返回值也为删除的元素。


7.删除指定元素 lrem key count value

删除指定元素,重点是count,这边count分为三种情况:

1).当count>0,从左到右,最多删除count个元素。

2).当count<0,从右到左,最多删除count个元素。

3).当count=0,删除所有满足条件的元素。


set类型

1.添加元素 sadd key[field] [field] [field]

往myset1中插入三个字符串,分别是hello,world,java,返回值为插入成功的数值。

2.删除元素 srem key [field] [field]


3.计算元素个数 scard key


4.判断元素是否存在sismember key [field]

之前删除了myset中的hello元素,所以第一条语句的返回值为0,表示不存在。而world没有删掉,所以返回值为1,表示存在。


5.获取所有的元素sismembers key


6.集合之间的并集sunion [key] [key]

我们先看myset1和myset2的数据,然后使用sunion来获取他们的并集。


7.集合之间的交集 sinter [key] [key]


8.集合之间的差集 sdiff [key] [key]

这边要注意key的前后区别,如果是sdiff myset1 myset2,意思是myset1除去两者的交集,所以结果是world和cc。


如果反之,亦然。


zset类型

1.添加元素 zadd key [score member] [score member]


2.计算长度 zcard key


3.计算排名 zrank key member(zrevrank key member)

myzset中一共有三名学生,张三,李四,王五,他们分数分别为80分,90分,70分,那他们的排序是第一名李四90分,第二名张三80分,第三名王五70分。

zrank表示正排名,返回值为下标。zrevrank表示逆排名,返回值也是下标。


结语

这篇主要是Redis的入门课程,主要从Redis是什么,哪些优点,Linux上如何快速安装,常见的数据结构和API使用。强调的是先从总体入手,对其有个大概印象,了解其和关系型数据库的区别。至于一些常见数据类型的适用场景,底层设计,我们下偏见。

如果觉得写得还行,麻烦给个赞👍,您的认可才是我写作的动力!

如果觉得有说的不对的地方,欢迎评论指出。

好了,拜拜咯。

求个关注

参考资料

redis 中文存储乱码问题

Redis开发与运维

Redis深度历险:核心原理与应用实践