从入门到精通【Redis】安装Redis以及基本全局命令

发布于:2025-09-05 ⋅ 阅读:(22) ⋅ 点赞:(0)


特此注明 :
Designed By :长安城没有风
Version:1.0
Time:2025.09.01
Location:辽宁 · 大连

📕1. Ubuntu 安装 redis

✏️1.1 使用apt进行安装
apt install redis -y
✏️1.2 启动 Redis 服务
service redis-server start
✏️1.3 停止 Redis 服务
service redis-server stop
✏️1.4 重启 Redis 服务
service redis-server restart
✏️1.5 查看 Redis 版本
redis-server --version

📕2. 基本全局命令

此处只列举初学Redis时最常见的基本全局命令,Redis全局命令过多,无法全部记住,需要时查阅官方文档即可。

✏️2.1 get和set

这是Redis中最核心的两个命令,因为Redis中所有的数据都是按照键值对的形式来存储的。

set :把 key 和 value 都存储进去(这里面的key是字符串,无需添加引号,value可以是任意的数据结构,Redis不区分大小写)

语法:SET 键 值

get :按照 key 得到对应的 value

语法:GET 键

这里是引用
在这里插入图片描述

✏️2.2 keys

keys : 返回所有满⾜样式的key。

语法:KEYS pattern(pattern:描述想查出来的字符串是什么样子的)

pattern共有以下几种形式(用时查询即可):

  1. ?匹配任意一个字符:h?llo 匹配 hello , hallo 和 hxllo
  2. *匹配0个或多个任意字符:h * llo 匹配 hllo 和heeeello
  3. [ae]只能匹配到a或者e:h[ae]llo 匹配hello 和hallo 但不匹配 hillo
  4. [^e]排除e,其他的都可以匹配
  5. [a-b]匹配a-b这个范围的字符,包括边界
✏️2.3 exists

exists :判断某个 key 是否存在

语法:EXISTS key [key...]

这里是引用

redis是一个客户端与服务器结构的程序,是通过网络来进行通讯的,如果我们分开写,会产生多次的网络通信,也会进行多次封装和分用,大大增加了成本以及减少了效率。redis官方也意识到了这个问题,所以很多命令都是可以一次操作多个key。

✏️2.4 del

del : 删除指定的key

语法:DEL key [key ...]

这里是引用

✏️2.5 expire

expire:为指定的 key 添加秒级的过期时间

语法:EXPIRE key seconds

这里是引用

✏️2.6 ttl

ttl:获取指定 key 的过期时间,秒级。​

语法:TTL key

这里是引用

✏️2.7 type

type:返回 key 对应的数据类型。​

语法:TYPE key

这里是引用

📕3. Redis中key的过期淘汰策略

一个redis服务中可能会存在无数个key,大多数的key都是存在过期时间的,那此时redis是怎么知道哪些key是过期的,哪些没过期呢?直接遍历所有的key肯定是行不通的,效率非常低下,redis整体的策略是定期删除和惰性删除。

在这里插入图片描述

  1. 定期删除

周期性轮询redis库中的时效性数据,每次抽取一部分进行验证时间,数据过期就删除,保证这个抽取检查的过程一定要快,避免阻塞服务器(这是因为redis是单线程服务,下面会详细介绍单线程服务)。

  1. 惰性删除

假期一个key已经到了过期时间,但是并不删除,等到下一次访问到这个key时在进行删除,同时返回一个nil。惰性删除也需要搭配着定期删除一起使用。

举个例子:小的时候我比较馋,很爱吃方便面,有一次超市买方便面,我结账的时候突然发现这袋方便面过期了,老板说,那我不买了,于是他就把方便面抢了回去,这就是典型的惰性删除。但是老板闲下来的时候也要定期检查有没有过期的食品,不能完全依靠顾客检查。

  1. 基于优先级队列的定时器

我们正常的队列是先进先出,而优先级队列则是优先级高的元素先出,在redis中给key设置过期时间的场景中,我们可以把设置了过期时间的key放在一个优先级队列中,过期时间越早,优先级越高。此时只需给定时器分配一个线程扫描队首元素即可,如果队首元素过期了进行删除即可,无需扫描全部元素,极大的提高了效率。扫描时也无需高频扫描队首元素,我们可以根据不同的业务场景来设置扫描间隔的时间。

  1. 基于时间轮的定时器

在这里插入图片描述

在这个时间轮中,实线指针指向轮子上的一个槽(slot)。它以恒定的速度顺时针转动,每转动一步就指向下一个槽(slot)。每个槽指向一条定时器链表,就会尝试把链表上的任务尝试执行一下,每条链表上的定时器具有相同的特征。

📕4. 单线程模型

✏️4.1 理解redis的单线程模型

redis的单线程模型,是指redis只用一个线程来处理所有的命令请求,而不是说redis服务器内部真的只有一个线程,即时是多个客户端发出的命令到达redis服务器时,也不会发生线程不安全问题。多个请求到达redis服务器时也是要进行排队的,redis服务器会按照先后顺序执行命令。

举个例子:上高中的时候学校要求要在食堂吃饭,而且打饭窗口只有一个,每当下课的时候都快速的跑到食堂排队打饭。从宏观来说看,我们好几百人跑去食堂这是并发,但真正打饭的时候也要排队进行。

宏观上同时要求服务的客户端

在这里插入图片描述
微观上客⼾端发送命令的时间有先后次序的

在这里插入图片描述
Redis的单线程模型

在这里插入图片描述

✏️4.2 为什么单线程还这么快
  1. redis访问的是内存,而数据库访问的是硬盘。
  2. redis的核心功能比数据库简单,数据库可以进行多表查询,子查询等一系列复杂操作,这些redis都没有。
  3. 因为是单线程模型,避免了一些不重要的线程竞争开销。
  4. 处理网络IO的时候,使用了像epoll这样的IO多路复用机制。

IO多路复用

针对TCP来说,一个客户端就要分配一个socket,但并不是所有的socket都是无时无刻传输消息,大部分的时间都是保持静默的。同一时刻,只有少数的socket是活跃的。随着客户端越来越多,系统开销越来越大。而IO多路复用,就是用一个线程来处理多个socket。常见的多路复用API有Linux的epoll,Java的NIO等等。

举个小例子:某天晚上,我想吃烤冷面,麻辣烫,还想喝奶茶,而这三家店的距离相差不是很远,于是我有以下三种方案:

  1. 我先去买烤冷面,等烤冷面做好了再去买麻辣烫,麻辣烫做好了再去买奶茶,但无疑这肯定是最浪费时间的。
  1. 我自己去买烤冷面,找我的朋友A帮我买麻辣烫,找我的朋友B买奶茶,虽然比1节省了时间,但消耗了太多人力成本了。
  1. 我先去买冷面,等老板做上了我去买麻辣烫,依旧等老板做上了麻辣烫我去买奶茶,最后在走一趟依次把烤冷面,麻辣烫,奶茶全都取回来。毫无争议这是最好的方案。

网站公告

今日签到

点亮在社区的每一天
去签到