redis 通用命令

目录

通用命令是什么

SET & GET

keys

EXISTS

DEL

EXPIRE

TTL

redis 的过期策略

定时器策略

基于优先级队列定时器

基于时间轮的定时器

TYPE


通过 redis 客户端和 redis 服务器交互。

所以需要使用 redis 的命令,但是 redis 的命令非常多。

通用命令是什么

在 redis 中,对于存入的不同数据的操作的命令是不同的,但是还是有一些命令是通用的,而这些对所有数据类型都通用的命令就是 ”通用命令“。

在介绍通用命令之前,其实我们可以去官方网站去学习一些有关 redis 的一些内容。

[Redis](https://redis.io/) 

我们就可以在主页面上有一个 search 可以用来搜索命令。

这里我们可以启动客户端,然后我们可以使用 ping 命令来验证一下连通性。

127.0.0.1:6379> ping
PONG

如果联通成功的话,那么就会返回 pong,实际上 redis 的命令一般都是大写和 mysql 是一样的,虽然小写也可以支持。

SET & GET

redis 是按照键值对的方式来存储的。

  • get:根据 key 来获取对应的 value

  • set:把 key 和 value 设置进去

这里的 key 和 value 都是字符串。

set key value
如果设置成功返回 OK

上面就是 set 的简单语法,set 后面跟一个 key 在跟一个value。

上面虽然说 key 和 value都是字符串,但是在set 的时候并不需要加双引号或者单引号。

127.0.0.1:6379> SET key1 value1
OK

下面可以通过 key 来获得 value

get key
如果有 key 就会返回对应的 value,否则就会返回 nil,上面的 nil 就是表示空或者不存在的意思。
127.0.0.1:6379> get key1
"value1"
127.0.0.1:6379> get key2
(nil)

KEYS

  • keys 可以查询当前 redis 中的 key

KEYS pattern
  • pattern 就是匹配模式

  • ?:表示匹配任意多一字符

  • *:匹配任意多个字符

  • [abc..]:匹配方括号里面的字符

  • [^abc]:匹配除非方括号里面的字符

  • [a-b]:匹配a~b中的字符

下面可以试一下

插入一批数据

127.0.0.1:6379> set hello 1
OK
127.0.0.1:6379> set hallo 1
OK
127.0.0.1:6379> set hbllo 1
OK
127.0.0.1:6379> set heeeeello 1
OK
127.0.0.1:6379> keys *
1) "hallo"
2) "hbllo"
3) "heeeeello"
4) "hello"
5) "key1"
  • 匹配任意一个字符

    127.0.0.1:6379> keys h?llo
    1) "hallo"
    2) "hbllo"
    3) "hello"

  • 匹配任意多个字符

    127.0.0.1:6379> keys h*llo
    1) "hallo"
    2) "hbllo"
    3) "heeeeello"
    4) "hello"

  • 匹配括号里的内容

    127.0.0.1:6379> keys h[ab]llo
    1) "hallo"
    2) "hbllo"

  • 匹配非括号里面内容

    127.0.0.1:6379> keys h[^e]llo
    1) "hallo"
    2) "hbllo"

  • 匹配括号里范围

    127.0.0.1:6379> keys h[ab]llo
    1) "hallo"
    2) "hbllo"

EXISTS

  • 该命令用来查询key 是否存在

exixts key [key...]
  • 该命令可以在后面跟多个 key

  • 返回查询到 key 的个数

  • 时间复杂度位O(N) N为key 的个数

  • 查询

    127.0.0.1:6379> exists hello hallo
    (integer) 2

DEL

  • 删除 key 以及对应的 value

del key [key...]
  • del 后面也可以跟多个 key

  • 返回值表示删除 key 的个数

  • 删除一个数据

    127.0.0.1:6379> del hello
    (integer) 1

  • 删除多个数据

    127.0.0.1:6379> del hallo hbllo
    (integer) 2

  • 删除不存在的数据

    127.0.0.1:6379> del abc
    (integer) 0

EXPIRE

  • 设置过期时间,单位秒

expire key second
  • expire 必须要是已经有了的 key

  • 返回值为 1 表示设置成功,0 表示失败

  • 但是 second 对于计算机来说时间太长,其实还有一个 pexpire 的单位为毫秒

  • 设置过期时间

    127.0.0.1:6379> expire hello 10
    (integer) 1

  • 为空 key 设置过期时间

    127.0.0.1:6379> expire abc 10
    (integer) 0

为已有的 key 设置过期时间返回 1,为没有的 key 设置过期时间返回 0,表示设置失败

而且设置成功后,等时间到期后,该key 会自动删除

TTL

  • 查看过期时间,和 expire 对对应

ttl key
  • 返回的单位是 秒

  • 如果想要查看毫秒级的就是 pttl 也就是和pexpire 对应

  • 返回值为剩余的过期时间,如果是 -1 表示没有设置过期时间,如果是 -2 表示没有该 key

  • 设置过期时间

    127.0.0.1:6379> expire hello 30
    (integer) 1

  • 查看过期时间

    127.0.0.1:6379> ttl hello
    (integer) 25

  • 查看没有设置的过期时间 key 的过期时间

    127.0.0.1:6379> ttl key1
    (integer) -1

  • 查看没有 key 的过期时间

    127.0.0.1:6379> ttl abc
    (integer) -2

redis 的过期策略

redis 的过期策略主要是两个方面:

  • 定期删除

  • 惰性删除

  • 首先说这个惰性删除,惰性删除就是每当用户访问该数据的时候, redis 会进行一番检查,如果是过期的,那么 redis 就会删除掉该 key,然后返回 nil

  • 定期删除就是,每隔一段时间 redis 就会抽取一部分数据进行检查过期时间,如果过期的话就会删除

  • 为什么是一部分数据呢?因为 redis 是单线程的,如果数据量太大的话,那么就会是 redis 阻塞,导致其他的服务无法被处理,所以 redis 每次都抽取一部分数据进行检查

  • 但是两个策略结合效果却也是一般

定时器策略

redis 过期策略还可以通过定时器来解决,但是这个定时器 redis 并没有实现,但是可以介绍一下如果使用定时器那么可以如何实现

基于优先级队列定时器

  • 可以将所有的过期时间的 key 都放到一个优先级队列里面

  • 优先级就是过期时间,过期时间越近,那么优先级越高

  • 所以第一个元素一定是最先过期的,所以我们只需要检查第一个元素即可

  • 而第一个元素也不一定要一直检查,可以隔一段时间检查一下

  • 然后就可以分一个线程,让该线程来检查过期时间,如果发现过期时间还没到,则可以先让该线程挂起

基于时间轮的定时器

  • 首先可以有一个循环队列,而循环队列里面的每一格代表一个一段时间的过期时间

  • 每个格子里面可以保存一个链表,该链表里面的所有事件的过期时间都在该格子表示的时间范围

  • 其中一个指针从循环队列特定位置开始,每隔一段时间(格子表示的时间)就向后走一个,然后检查里面的过期时间,过期就删除

  • 遇到新的事件就查看该事件的过期事件,push 到对应的格子里

虽然 redis 并没有使用这两种方法,但是这两种方法也是比较高效的处理过期事件的方法

TYPE

  • 返回 key 对应的 value 的类型

type key
  • 返回 key 对应的 value 的类型

  • 在 redis 里面 key 都是 string 类型

  • 如果没有key返回 none

  • 插入不同数据

    127.0.0.1:6379> lpush key2 111 222 333
    (integer) 3
    127.0.0.1:6379> sadd key3 aaa bbb ccc
    (integer) 3
    127.0.0.1:6379> hset key4 field1 value1
    (integer) 1

  • 查看不同数据类型

    127.0.0.1:6379> type key1
    string
    127.0.0.1:6379> type key2
    list
    127.0.0.1:6379> type key3
    set
    127.0.0.1:6379> type key4
    hash

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/67997.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何使用Python和正则表达式处理XML表单数据

在日常的Web开发中,处理表单数据是一个常见的任务。而XML是一种常用的数据格式,用于在不同的系统之间传递和存储数据。本文通过阐述一个技术问题并给出解答的方式,介绍如何使用Python和正则表达式处理XML表单数据。我们将探讨整体设计、编写思…

【LeetCode - 每日一题】449. 序列化和反序列化二叉搜索树(23.09.04)

449. 序列化和反序列化二叉搜索树 题意 给定一棵二叉搜索树,实现序列化和反序列化;注意 val 范围,因此 在序列化时需要插入分隔符分割每个节点的 val;要善于利用 二叉搜索树的特性(中序遍历 递增排序)&a…

VB6.0 设置窗体的默认焦点位置在 TextBox 中

文章目录 VB6.0 窗体的加载过程确定指针的焦点位置添加代码效果如下未设置指定焦点已设置焦点 VB6.0 窗体的加载过程 在VB6.0中,窗体(Form)加载时会触发多个事件,这些事件按照特定的顺序执行。下面是窗体加载过程中常见事件的执行…

=>符号含义

>主要有两方面的作用,一个限制属性状态,另一个简化匿名委托和Lambda 用法一:定义只读属性 public class ManPeople { public string Sex > "男";public string Name { get; set; }}public class WomanPeople { publi…

算法-模拟

1、旋转数组 public class Solution {/*** 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可** 旋转数组* param n int整型 数组长度* param m int整型 右移距离* param a int整型一维数组 给定数组* return int整型一维数组*/…

深入探索PHP编程:文件操作与输入/输出(I/O)

深入探索PHP编程:文件操作与输入/输出(I/O) 在PHP编程中,文件操作和输入/输出(I/O)是不可或缺的关键部分。无论是读取、写入文件,还是处理上传的文件,这些操作都是Web开发的重要组成…

ssh配置(一、GitLabGitHub)

一. 为什么配置ssh 使用 ssh 克隆项目,更加安全方便。 git clone 项目时一般使用两种协议 https 和 ssh 。 二. 原理的通俗解释 ssh 解决的问题是登录时的用户身份验证问题,默认使用 RSA(也支持其他算法: RSA、DSA、ECDSA、EdD…

基于ETLCloud的自定义规则调用第三方jar包实现繁体中文转为简体中文

背景 前面曾体验过通过零代码、可视化、拖拉拽的方式快速完成了从 MySQL 到 ClickHouse 的数据迁移,但是在实际生产环境,我们在迁移到目标库之前还需要做一些过滤和转换工作;比如,在诗词数据迁移后,发现原来 MySQL 中…

常见路由跳转的几种方式

常见的路由跳转有以下四种&#xff1a; 1. <router-link to"跳转路径"> /* 不带参数 */ <router-link :to"{name:home}"> <router-link :to"{path:/home}"> // 更建议用name // router-link链接中&#xff0c;带/ 表示从根…

elementUI可拖拉宽度抽屉

1&#xff0c;需求&#xff1a; 在elementUI的抽屉基础上&#xff0c;添加可拖动侧边栏宽度的功能&#xff0c;实现效果如下&#xff1a; 2&#xff0c;在原组件上添加自定义命令 <el-drawer v-drawerDrag"left" :visible.sync"drawerVisible" direc…

Unity 顶点vertices,uv,与图片贴图,与mesh

mesh就是组成3d物体的三角形们。 mesh由顶点组成的三角形组成&#xff0c;三角形的大小 并不 需要一样&#xff0c;由顶点之间的位置决定。 mesh可以是一个或者多个面。 贴图的原点在左下角&#xff0c;uv是贴图的坐标&#xff0c;数量和顶点数一样&#xff08;不是100%确定…

数据结构与算法学习(day1)

文章目录 前言本章目标简化版桶排序题目一题目二 前言 &#xff08;1&#xff09;我是一个大三的学生&#xff08;准确来说应该是准大三&#xff0c;因为明天才报名哈哈哈&#xff09;。 &#xff08;2&#xff09;最近就想每天闲着没事也刷些C语言习题来锻炼下编程水平&#x…

StringIO BytesIO

上一篇中我们介绍了文件的基本读写操作&#xff0c;但是很多时候数据的读写并不一定都是在文件中&#xff0c;我们也可以在内存中读写数据&#xff0c;因此引出我们今天的主要内容&#xff0c;即 StringIO 和 BytesIO&#xff0c;让你学会在内存中进行数据的基本读写操作。 1 …

PKU校园网连接失败

校园网连接失败 连上校园网&#xff0c;显示已经连接但是没有网络&#xff0c;手动输入校园网门户( its.pku.edu.cn )也没有用。 使用 windows自带的疑难解答&#xff0c;分析发现dns解析异常。 解决方案 手动配置IPV4的dns。 同学的电脑可以正常连接dns&#xff0c;将同学…

Vue3 el-tooltip 根据内容控制宽度大小换行和并且内容太短不显示

el-tooltip 根据长度自适应换行以及显隐 环境 vue: "3.2.37" element-ui: "2.1.8"要求 tooltip 根据内容自动换行如果内容超出显示省略号显示&#xff0c;不超出不显示 tooltip 代码 组件 // ContentTip 组件 <template><el-tooltipv-bind&qu…

【数学建模竞赛】超详细Matlab二维三维图形绘制

二维图像绘制 绘制曲线图 g 是表示绿色 b--o是表示蓝色/虚线/o标记 c*是表示蓝绿色(cyan)/*标记 ‘MakerIndices,1:5:length(y) 每五个点取点&#xff08;设置标记密度&#xff09; 特殊符号的输入 序号 需求 函数字符结构 示例 1 上角标 ^{ } title( $ a…

初识c++

文章目录 前言一、C命名空间1、命名空间2、命名空间定义 二、第一个c程序1、c的hello world2、std命名空间的使用惯例 三、C输入&输出1、c输入&输出 四、c中缺省参数1、缺省参数概念2、缺省参数分类3、缺省参数应用 五、c中函数重载1、函数重载概念2、函数重载应用 六、…

数据分析之面试题目汇总

1、解释数据清洗的过程及常见的清洗方法。 数据清洗是指在数据分析过程中对数据进行检查、处理和纠正的过程&#xff1b;是数据预处理的一步&#xff0c;用于处理数据集中的无效、错误、缺失或冗余数据 常见的清洗方法包括&#xff1a;处理缺失值、处理异常值、去除重复值、统一…

强化学习算法总结 (1)

强化学习算法总结 (1) 1.综述 强化学习是通过与环境进行交互&#xff0c;来实现目标的一种计算方法。 s − a 1 − r − s ′ s - a_1 - r- s s−a1​−r−s′ 1.1强化学习优化目标 p o l i c y a r g m a x p o l i c y E ( a , s ) [ r e w a r d ( s , a ) ] policy ar…

CSS实现隐藏滚动条但可以滚动

场景 隐藏滚动条&#xff0c;但可以滚动 解决 全局样式 /* 隐藏滚动条 */ .outer-container::-webkit-scrollbar {width: 0; /* 设置滚动条的宽度为0 */background-color: transparent; /* 设置滚动条背景为透明 */ }/* 自定义滚动条轨道样式 */ .outer-container::-webkit…