56_Redis简单命令

news2025/1/6 19:39:39

一、引言


1.1 数据库压力过大

由于用户量增大,请求数量也随之增大,数据压力过大

一个请求的url   背后可能有有4-5个 sql的操作 

每秒钟 qps(并发数) 1000    背后的sql操作   4000-5000

mysql 单机并发量读写  8000-10000  ,随着用户量的增加,mysql压力会非常大

此时我们就可以使用redis作为缓存数据库,查询数据时,先去redis查询 ,redis没有该数据,再出去mysql,此时就会降低mysql 压力

1.2 数据不同步

多台服务器之间,数据不同步

1.3 传统锁失效

多台服务器之间的锁,已经不存在互斥性了。

二、Redis介绍

Redis是一个key-value存储系统,属于非关系型数据库(NoSQL -> 非关系型数据库 -> Not Only SQL)。它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)等类型。

为了保证效率,数据都是缓存在内存中,因为是纯内存操作,Redis的性能非常出色,每秒可以处理超过 10万次读写操作。

redis主要应用场景:缓存热点数据,分布式锁,计数器,全局id,简单消息队列,排行榜,点赞,签到,关注模型等。

官网:https://redis.io/

  • 有一位意大利人,在开发一款LLOOGG的统计页面,因为MySQL的性能不好,自己研发了一款非关系型数据库,并命名为Redis。

  • Redis(Remote Dictionary Server)即远程字典服务,Redis是由C语言去编写,Redis是一款基于Key-Value的NoSQL,而且Redis是基于内存存储数据的,Redis还提供了多种持久化机制,性能可以达到110000/s读取数据以及81000/s写入数据,Redis还提供了主从,哨兵以及集群的搭建方式,可以更方便的横向扩展以及垂直扩展。

Redis之父
image-20230913225045194

三、Redis安装

3.1 Linux下安装

3.2 Docker安装

3.3 Windows下安装

3.3.1 安装

Redis官方不支持window平台

微软开源组织实现了扩展版,https://github.com/MSOpenTech/redis

下载压缩版,解压后

image-20240725144349198

3.3.2 启动redis服务

使用命令行或者双击 redis-server.exe 都可

image-20240725144759180

3.3.3 进入客户端

再开一个命令行,执行redis-cli.exe命令或者双击其 也可

image-20240725144930314

可以演示一些基本命令测试

image-20240725145111397

3.4 图形化工具

傻瓜式安装

image-20240725145215904

安装好,点击左上角,连接本机Redis

image-20240725145344688

四、常用命令(一)

4.1 Redis存储数据的结构

常用的5种数据结构:

  • string:一个key对应一个值。最常用的,一般用于存储一个值。
  • hash:一个key对应一个Map。存储一个对象数据的。
  • list:一个key对应一个列表。使用list结构实现栈和队列结构。
  • set:一个key对应一个集合。交集,差集和并集的操作。
  • zset:一个key对应一个有序的集合。排行榜,积分存储等操作。

另外三种数据结构:

  • HyperLogLog:计算近似值的。
  • GEO:地理位置。
  • BIT:一般存储的也是一个字符串,存储的是一个byte[]。
五种常用的存储数据结构图
image-20230914140756061

4.2 string类型

Redis SET 命令_设置指定 key 的值

1 存 set

语法:set key value

设置key的值,若key存在则覆盖原来的value

img

key值可以使用":"分隔,用于进行分类管理,比如下面例子中,"goods:id"表示key值

img

2 取 get

语法:get key

获取key对应的值

img

3 条件存 setnx

语法:setnx key value

设置值,如果当前key不存在的话(如果这个key存在,什么事都不做,如果这个key不存在,和set命令一样)

img

4 多存 mset

语法:mset key1 value1 key2 value2 … keyN valueN

设置多个key的值,若存在则覆盖

img

5 多取 mget

语法:mget key1 key2 … keyN

获取多个key对应的值

img

6 多条件存 msetnx

语法:msetnx key1 value1 key2 value2 … keyN valueN

同mset,但如果其中一个key已经存在了,则都不设置。这些操作都是原子的。

img

7 追加 append

语法:append key value

向指定key的value的字符串追加数据

img

8 自增 incr

语法:incr key

自增1,只针对值是整数的key

img

9 指定自增 incrby

语法:incrby key increment

针对key对应的value值增加一个增量值,如果key不存在,初始化为0,然后再增加

img

img

10 自减 decr

语法:decr key

img

11 指定自减 decrby

语法:decrby key increment

针对key对应的value的值减去一个值

img

12 过期 时间setex

可以考虑验证码这方向发展

语法:setex key seconds value

等价于先设置变量再设置超时(单位是秒),这个操作是原子的

img

13 长度 strlen

语法: strlen key

查看value字符串的长度

image-20240725151845401

14 删除 del

语法: del key

根据键删除数据

15 补充:中文问题

redis的汉字 : 不是乱码,只是redis的显示问题.redis显示成utf-8格式,
想要得到汉字原文, 只需在进入Redis客户端时,输入 redis-cli --raw

image-20240725152036672

4.3 键的其他操作

1 判断存在 exists

语法:EXISTS key

查看是否存在该元素

img

2 删除 del

语法:del key

根据key删除元素

img

3 重命名 rename

语法:rename oldkey newkey

给key值重命名

img

4 查键 keys

语法:keys * ,查看所有key

img

img

5 类型 type

语法:type key

查看key的类型

img

6 过期时间 expire

语法:EXPIRE key seconds

设置该元素多少秒后失效

img

注意:设置过期时间的应用场景广泛,比如缓存的数据设置过期时间,防止长时间占用内存;手机验证码;限时优惠等

7 过期 pexpire

语法:PEXPIRE key milliseconds

设置该元素多少毫秒后失效

img

8 活得久 ttl

语法:TTL key:查看还可以存活多少秒,-2表示key不存在,-1表示永久存储

img

9 取消过期 persist

语法:persist key

取消过期时间

img

4.4 list类型

类似队列或者堆栈的数据结构

列表类型(list)可以存储一个有序的字符串列表,常用的操作是向列表两端添加元素,或者获得列表的某一个片段列表类型内部是使用双向链表(double linked list**)实现**的,所以向列表两端添加元素的时间复杂度为0(1),获取越接近两端的元素速度就越快。这意味着即使是一个有几千万个元素的列表,获取头部或尾部的10条记录也是极快的。

1 右存 rpush

语法:rpush key value

key表示列表的名字,从右边向key对应的列表添加元素,每次添加,放在结尾

img

img

2 左存 lpush

语法:lpush key value

从左边向key对应的列表添加元素,每次添加,放在开头

img

3 范围取值 lrange

语法:lrange key beginIndex endIndex

获取key的元素,用两端的索引取出子集,endIndex=-1则表示全部取出

img

0 -1 就是查全部

4 长度 llen

语法:llen key

获取key的长度大小

img

5 左删 lpop

语法:lpop key

取出并移除key第一个元素,左边的元素

img

6 右删 rpop

语法:rpop key

取出并移除key最后一个元素,右边的元素

img

7 查询单个 lindex

语法:LINDEX key index

获取该索引下的元素

img

8 指定修改 lset

语法:LSET key index value

设置索引为index下的元素的value.超出索引范围报错

img

9 删除 lrem

语法:lrem key count value

删除count个value。(count为正数,从头开始,删除count个value元素;count为负,则从尾部向头删除count个value元素;count为0,则所有的元素为value的都删除)

img

10 两头删 ltrim

语法:LTRIM key start end

清空索引在start 和end之外的元素,索引从0开始

img

4.5 hash类型

使用string的问题

​ 假设有User对象以JSON序列化的形式存储到Redis中,User对象有id,username、password、age、name等属性,存储的过程如下:

​ User对象 —> json(string) —> redis

如果在业务上只是更新age属性,其他的属性并不做更新,应该怎么做呢? 如果仍然采用string类型,无法单独更新其中某个属性,需要删除然后重新添加,这样的话在传输、处理时会造成资源浪费,下边讲的hash可以很好的解决这个问题。

redis hash

hash叫散列类型,它提供了字段和字段值的映射。字段值只能是字符串类型,不支持散列类型、集合类型等其它类型。如下:

img

1 存 hset

HSET命令不区分插入和更新操作,当执行插入操作时HSET命令返回1,当执行更新操作时返回0。

语法:HSET key field values

key是对象名,field是属性,value是值;

img

img

2 多存 hmset

语法:HMSET key field value [field value …]:同时设置多个属性

img

3 取 hget

语法:HGET key field:获取该对象的该属性对应的值

img

4 多取 hmget

语法:HMGET key field value [field value …]:获取多个属性值

img

5 全取 hgetall

语法:HGETALL key 获取对象的所有信息(字段+值)

img

6 只取键 hkeys

语法:HKEYS key:获取对象的所有属性(field)

img

7 只取值 hvals

语法:HVALS key:获取对象的所有属性的值(value)

img

8 删属性hdel

语法:HDEL key field:删除对象的该属性

img

9 存在否 hexists

语法:HEXISTS key field:查看对象是否存在该属性

img

10 自增 hincrby(hash必须要加by 后面要跟开劈的长度)

语法:HINCRBY key field increment:原子自增操作,只能是integer的属性值可以使用;

img

img

注意: 没有hincr命令,只有hincrby命令

11 键数 hlen

语法:HLEN key:获取属性的个数。

img

4.6 set类型

集合(set)中的数据是不重复且没有顺序。

集合类型(set)的常用操作是向集合中加入或删除元素、判断某个元素是否存在等,由于集合类型的Redis内部是使用值为空的散列表实现,所有这些操作的时间复杂度都为0(1)。

Redis还提供了多个集合之间的交集、并集、差集的运算。

1 存 sadd

语法:sadd key value1 value2 valueN 向set添加元素

img

2 删 srem

语法:srem key value :从set中移除指定元素

img

3 取所有 smembers

语法:smembers key : 取出所有set元素

img

4 判断 sismember

语法:SISMEMBER key value: 查看value是否存在set中

img

5 个数 scard

语法:scard key

获取set中元素的个数

img

6 交集 sinter

image-20240725160101617

语法:sinter key1 key2 …

返回多个集合的交集

img

img

7 并集 sunion

image-20240725160113633

语法: sunion set1 set2 …

获取全部集合中的数据

8 差集 sdiff

image-20240725160043156

语法: sdiff set1 set2 …

获取多个集合中不一样的数据

tip: 集合数量 多的放在前面, 相当于 set1 - set2 剩余的元素

9 随机删 spop

注意:由于集合是无序的,所有SPOP命令会从集合中随机选择一个元素弹出

语法:SPOP key

语法: SPOP key count n 删除指定n个数的元素

随机获取一个数据(获取的同时,移除数据,count默认为1,代表弹出数据的数量)

4.7 Sorted Set有序集合(也叫Z-Set)主要用于热度排名

在集合类型(Set)的基础上,有序集合类型为集合中的每个元素都关联一个分数,这使得我们不仅可以完成插入、删除和判断元素是否存在在集合中,还能够获得分数最高或最低的前N个元素、获取指定分数范围内的元素等与分数有关的操作。

在某些方面有序集合(ZSet)和列表(List)类型有些相似。

  1. 二者都是有序的。
  2. 二者都可以获得某一范围的元素。

但是,二者有着很大区别:

  • 列表(list)类型是通过链表实现的,获取靠近两端的数据速度极快,而当元素增多后,访问中间数据的速度会变慢。
  • 有序(zset)集合类型使用散列表实现,所有即使读取位于中间部分的数据也很快。
  • 列表(list)中不能简单的调整某个元素的位置,但是有序集合(zset)可以(通过更改分数实现)
  • 有序(zset)集合要比列表类型更耗内存。

1 存 zadd

语法:ZADD key score member

向有序set中添加元素member,其中score为分数(权重,可以为小数),该值决定了元素的顺序,默认升序;

img

2 取 zrange

语法:ZRANGE key start end [WITHSCORES]

获取按score从低到高索引范围内的元素,索引可以是负数,-1表示最后一个,-2表示倒数第二个,即从后往前。withscores可选,表示获取包括分数

img

3 反取zrevrange

语法:ZREVRANGE key start end [WITHSCORES]

同上,但score从高到低排序。

img

3 计数 zcount

语法:ZCOUNT key min max

获取score在min和max范围内的元素的个数

img

4 计数 zcard

语法:ZCARD key

获取集合中元素的个数。

img

5 自增zincrby

语法:ZINCRBY key increment member:根据元素,score原子增加increment

img

6 查分 zscore

语法:ZSCORE key member

获取该元素的score

img

7 查排名 zrank

语法:ZRANK key member

获取元素的索引(照score从低到高排列)

img

8 移除 zrem

语法:ZREM key member

移除集合中的指定元素

img

9 移除 zremrangebyscore

z,rem,range,by,score

语法:ZREMRANGEBYSCORE key min max

清空集合内的score位于min和max之间的元素

img

10 其他

参考文档Redis Sorted Set API

4.8 bitmap类型(了解)

【Redis】Redis中BitMap(位图)

五、常用命令(二)

默认redis 有16个库, 默认情况下数据存储于 db0数据库

image-20240725171039915

select数据库

切换到指定的数据库,数据库索引号 index 用数字值指定,以 0 作为起始索引值,0-15

image.png

dbsize

查看数据库中key的数量

img

flushall

清空全部数据库

六、Redis的持久化【背】

Redis 提供了 RDBAOF 两种持久化方式,RDB 是把内存中的数据集以快照形式写入磁盘,实际操作是通过 fork 子进程执行,采用二进制压缩存储;AOF 是以文本日志的形式记录 Redis 处理的每一个写入或删除操作。

RDB 把整个 Redis 的数据保存在单一文件中,比较适合用来做灾备,但缺点是快照保存完成之前如果宕机,这段时间的数据将会丢失,另外保存快照时可能导致服务短时间不可用。

AOF 对日志文件的写入操作使用的追加模式,有灵活的同步策略,支持每秒同步、每次修改同步和不同步,缺点就是相同规模的数据集,AOF 要大于 RDB,AOF 在运行效率上往往会慢于 RDB。

6.1 RDB(快照)方式

默认的持久化方式,rdb是将内存中的数据以快照的方式写入文件中,默认的文件名是dump.rdb

redis.conf(windows中文件名为redis.windows.conf)中针对rdb方式的默认配置:

	save 900 1
	save 300 10
	save 60 10000

配置含义:

	900秒内,如果超过1个key被修改,则发起快照保存
	300秒内,如果超过10个key被修改,则发起快照保存
	60秒内,如果1万个key被修改,则发起快照保存

默认配置不方便看效果,可将快照频率设大一点,在redis.conf中增加一行:

​ save 10 1

保存后,启动redis服务端和客户端。在客户端输入命令:

img

输入完,发现dump.rdb文件的修改日期变了,并且redis服务端增加了保存日志:

img

接下来,重启redis服务端和客户端,看数据是否真的持久化了:

img

6.2 AOF 方式

redis.conf中针对aof的配置:

	appendonly no

将其修改为yes,开启AOF持久化,对应的文件名为appendonly.aof。使用redis命令后,该命令是以redis协议格式的形式追加到文件的最后!实际上,AOF方式中,并不会立即将命令写入到文件中,而是写入到硬盘缓存,然后根据配置的策略,将缓存写入到文件,配置如下:

	appendfsync always
	appendfsync everysec
	appendfsync no

配置含义:

	always: 每次操作都会立即写入aof文件中
	everysec: 每秒持久化一次(默认配置)
	no: 不主动进行同步操作,默认30s一次

配置含义:

	900秒内,如果超过1个key被修改,则发起快照保存
	300秒内,如果超过10个key被修改,则发起快照保存
	60秒内,如果1万个key被修改,则发起快照保存

默认配置不方便看效果,可将快照频率设大一点,在redis.conf中增加一行:

​ save 10 1

保存后,启动redis服务端和客户端。在客户端输入命令:

[外链图片转存中…(img-4gGJYXPg-1722243843563)]

输入完,发现dump.rdb文件的修改日期变了,并且redis服务端增加了保存日志:

[外链图片转存中…(img-B38dXGwp-1722243843563)]

接下来,重启redis服务端和客户端,看数据是否真的持久化了:

[外链图片转存中…(img-OWDDk6T3-1722243843564)]

6.2 AOF 方式

redis.conf中针对aof的配置:

	appendonly no

将其修改为yes,开启AOF持久化,对应的文件名为appendonly.aof。使用redis命令后,该命令是以redis协议格式的形式追加到文件的最后!实际上,AOF方式中,并不会立即将命令写入到文件中,而是写入到硬盘缓存,然后根据配置的策略,将缓存写入到文件,配置如下:

	appendfsync always
	appendfsync everysec
	appendfsync no

配置含义:

	always: 每次操作都会立即写入aof文件中
	everysec: 每秒持久化一次(默认配置)
	no: 不主动进行同步操作,默认30s一次

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

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

相关文章

素数提升运算时间得算法

我们在计算素数的一种简便算法&#xff0c;用到另一个库math.h之后给大家详细的解释原理 #include<stdio.h> #include<math.h> int main() {int i 0;for (i 101; i < 200; i 2){int flag 1;int j 0;for (j 2; j < sqrt(i); j){if (i % j 0){flag 0;b…

ITSS四级认证费用是多少?

信息技术服务标准&#xff08;ITSS&#xff09;认证是评估一个企业在信息技术服务领域能力的标准之一&#xff0c;它涵盖了从基础标准、支撑标准到基于业务的需求侧和供给侧标准的全面内容。 具体条件 独立法人地位&#xff1a;申请单位需要具备独立法人地位&#xff0c;这是四…

如何使用rdma-core来实现RDMA操作

rdma-core 是一个开源项目&#xff0c;为远程直接内存访问&#xff08;RDMA&#xff09;提供用户空间的支持。它包括 RDMA 设备的驱动程序、库和工具&#xff0c;旨在简化 RDMA 应用的开发和部署。 基础知识参考博文&#xff1a; 一文带你了解什么是RDMA RDMA 高性能架构基本…

day07 项目启动以及git

spring框架 spring 负责整合各种框架&#xff0c;把new对象的部分交给spring去做&#xff0c;对象new不出来&#xff0c;项目就启动不起来&#xff0c;这样可以有效保证所需要的对象都在容器中存在&#xff0c;后续的部分都可以顺利执行控制反转&#xff1a;业务对象创建依赖资…

零基础入门转录组数据分析——机器学习算法之lasso

零基础入门转录组数据分析——机器学习算法之lasso 目录 零基础入门转录组数据分析——机器学习算法之lasso1. Lasso基础知识2. Lasso&#xff08;Rstudio&#xff09;——代码实操2. 1 数据处理2. 2 构建Lasso模型2. 3 提取Lasso关键基因2. 4 Lasso结果简单可视化 1. Lasso基础…

高度偏斜特征处理:log(x)、sqrt(x)、box-cox、Yeo-Johnson

一、概念 高度偏斜的特征 &#xff1a; 数据分布不均匀、不对称的特征 处理之后&#xff1a;使其分布更接近正态分布或至少减少偏斜程度 二、处理方法 1、对数变换&#xff1a;log(x) 适用于右偏数据压缩大值&#xff0c;拉伸小值 2、平方根变换&#xff1a;sqrt(x) 对右…

臂式血压计电子方案ocba设计与开发

臂式血压计是运用电子技术与血压间接测量原理进行血压测量的医疗设备。臂式血压计有臂式、腕式、手表式之分&#xff1b;其电子技术已经历了最原始的第一代&#xff08;机械式定速排气阀&#xff09;、第二代&#xff08;电子伺服阀&#xff09;、第三代&#xff08;加压同步测…

学习测试12-车(略)

系统讲解&#xff0c;可以在懂车帝网站去了解汽车结构

商用密码测评之对HTTPS(TLS)协议中各个参数解释

1、TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 是一个广泛使用的TLS&#xff08;传输层安全协议&#xff09;加密套件&#xff0c;它结合了多种技术和算法来确保网络通信的安全。下面是对该加密套件中各个参数的详细解释&#xff1a; 1. TLS 定义&#xff1a;TLS&#xff08;传…

【文件解析漏洞】实战详解!

漏洞描述&#xff1a; 文件解析漏洞是由于中间件错误的将任意格式的文件解析成网页可执行文件&#xff0c;配合文件上传漏洞进行GetShell的漏洞! IIS解析漏洞&#xff1a; IIS6.X&#xff1a; 方式一:目录解析 在网站下建立文件夹的名字为.asp/.asa 的文件夹&#xff0c;其目…

【前端 · 面试 】JavaScript 之你不一定会的基础题(一)

最近我在做前端面试题总结系列&#xff0c;感兴趣的朋友可以添加关注&#xff0c;欢迎指正、交流。 争取每个知识点能够多总结一些&#xff0c;至少要做到在面试时&#xff0c;针对每个知识点都可以侃起来&#xff0c;不至于哑火。 JavaScript 之你不一定会的基础题 前言 面试往…

python中list的深拷贝和浅拷贝

其实这还是涉及到python中的可变对象和不可变对象的概念。 https://www.cnblogs.com/poloyy/p/15073168.html # -*- coding: utf-8 -*-person [name, [savings, 100.00]] hubby person[:] # slice copy wifey list(person) # fac func copy a [id(x) for x in person] b …

【Vue3】watch 监视多种类型数据

【Vue3】watch 监视多种类型数据 背景简介开发环境开发步骤及源码 背景 随着年龄的增长&#xff0c;很多曾经烂熟于心的技术原理已被岁月摩擦得愈发模糊起来&#xff0c;技术出身的人总是很难放下一些执念&#xff0c;遂将这些知识整理成文&#xff0c;以纪念曾经努力学习奋斗…

新闻稿的写作格式,干货分享

随着互联网的发展&#xff0c;新闻稿在互联网上的地位非常高&#xff0c;新闻稿对比一般软文来说内容质量偏高而且还具备&#xff1a;严谨、时效、可观的特点。 撰写新闻稿主要就是突出最新鲜、最重要的事实&#xff0c;同时&#xff0c;新闻稿也是文字简洁&#xff0c;并且时效…

【nginx、apache】网站只有首页可以正常打开,其他页面都实现404

【nginx、apache】网站只有首页可以正常打开&#xff0c;其他页面都实现404 1、检查伪静态规则&#xff08;中枪&#xff09;

【剑指offer】

剑指offer 面试题67&#xff1a;字符串转成整数面试题1&#xff1a;赋值运算符函数面试题3&#xff1a;数组中重复的数字 面试题67&#xff1a;字符串转成整数 LeedCode&#xff1a;LCR 192. 把字符串转换成整数 (atoi) 测试atoi的功能和异常效果 #include <iostream> #…

【Linux】全志Tina配置屏幕时钟的方法

一、文件位置 V:\f1c100s\Evenurs\f1c100s\tina\device\config\chips\c200s\configs\F1C200s\sys_config.fex 二、文件内容 三、介绍 在此处可以修改屏幕的频率&#xff0c;当前为21MHz。 四、总结 注意选择对应的屏幕的参数&#xff0c;sdk所支持的屏幕信息都在此文件夹中…

嵌入式C++、STM32、Flask框架、SQL、ROS系统和MQTT协议通讯:智能药盒及物联网数据监测设计思路(代码示例)

目录 项目概述 系统设计 硬件设计 软件设计 系统架构图 代码实现 1. 开发环境 2. STM32 微控制器代码示例 3. ROS 节点代码示例 4. 后端服务器代码示例&#xff08;Flask&#xff09; 数据库部分 3.4 删除药物记录 项目概述 随着老龄化社会的加剧&#xff0c;患者…

钢琴模拟器

文章目录 钢琴模拟器代码结构HTML结构CSS样式JavaScript功能 源码效果图 钢琴模拟器 代码结构 HTML结构 <html>: HTML文档的根元素。 <head>: 包含文档的元数据。 <base>: 指定相对URL的基准。 <title>: 指定页面的标题。 <style>: 包含嵌入的…

关于用log提高排查问题的设置

今天在了解项目业务的时候&#xff0c;想搞清楚执行顺序&#xff0c;加了很多打印&#xff0c;类似console.log(1111,xxxx) console.log(2222,xxxx)&#xff0c;有时候断点没开sourcemap不是源码所以我更喜欢打印&#xff0c;然后就导致打印比较紊乱&#xff0c;而且前面的1111…