56_Redis简单命令

一、引言


1.1 数据库压力过大

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

一个请求的url   背后可能有有4-5个 sql的操作 每秒钟 qps(并发数) 1000    背后的sql操作   4000-5000mysql 单机并发量读写  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 1save 300 10save 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 alwaysappendfsync everysecappendfsync 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 alwaysappendfsync everysecappendfsync no

配置含义:

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

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

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

相关文章

鸿蒙配置Version版本号,并获取其值

app.json5中配置版本号: 获取版本号: bundleManager.getBundleInfoForSelf(bundleManager.BundleFlag.GET_BUNDLE_INFO_WITH_APPLICATION).then((bundleInfo) > {let versionName bundleInfo.versionName; //应用版本号}).catch((error: BusinessE…

【Vulnhub系列】Vulnhub_DC-1靶场渗透(原创)

【Vulnhub系列靶场】Vulnhub_DC-1靶场渗透 原文转载已经过授权 原文链接:Lusen的小窝 - 学无止尽,不进则退 (lusensec.github.io) 一、环境准备 1、在百度网盘中下载DC-1靶场。DC-1靶场受virtual box 的影响,在VM中直接打开是扫描不到IP 的…

jmeter录制

1、添加代理服务器 添加方法:“测试计划”右键 -> 添加 -> 非测试元件 -> HTTP代理服务器 2、添加线程组 添加方法:“测试计划”右键->添加->线程(用户)->线程组 3、配置http代理服务器 (1&a…

第三方软件测试报告可做哪些用途?

1. 评估软件质量:第三方软件测试报告通过对软件的各项性能指标进行测试和分析,能够客观地评估软件的质量水平。这份报告可以为软件的开发团队提供反馈,帮助他们发现和修复潜在的问题,提高软件的质量和稳定性。 2. 验证软件功能&a…

<数据集>手机识别数据集<目标检测>

数据集格式:VOCYOLO格式 图片数量:16172张 标注数量(xml文件个数):16172 标注数量(txt文件个数):16172 标注类别数:1 标注类别名称:[Phone] 使用标注工具:labelImg 标注规则:…

探索分布式光伏运维系统的组成 需要几步呢?

前言 随着光伏发电的不断发展,对于光伏发电监控系统的需求也日益迫切,“互联网”时代,“互联网”的理念已经转化为科技生产的动力,促进了产业的升级发展,本文结合“互联网”技术提出了一种针对分散光伏发电站运行数据…

c#调用python代码,实现读取npy的数据并显示图像

本例子实现的功能是: 根据stat.npy、ops.npy两个npy文件的内容,显示图形 1. 用python代码实现读取两个文件,文件名为read_npy.py,代码如下: import numpy as npdef read_npy_files(stat_file, ops_file):stat np.lo…

NSL-KDD入侵检测系统的设计与实现系列预告

每日进阶-基于机器学习的入侵检测系统——打怪升级之道 在当今的数字时代,网络安全不仅是防御,更是主动出击。你是否想知道如何用机器学习技术设计一套入侵检测系统(IDS),让黑客无所遁形?本系列文章将为您揭…

【全志H616开发】Linux守护进程

文章目录 守护进程简介基本特点创建一个守护进程通常涉及以下步骤:进程查看指令: 守护进程开发代码示例: 开机自动启动 守护进程 简介 Linux Daemon(守护进程)是运行在后台的一种特殊进程。它独立于控制终端并且周期性…

VScode | 我的常用插件分享

系列文章目录 本系列文章主要分享作位前端开发的工具之------VScode的使用分享。 文章目录 目录 系列文章目录 文章目录 前言 一、Vetur 三、别名路径跳转 四、Prettier 五、koroFileHeader 六、vue-helper 总结 前言 本文主要分享VScode的好用插件。 一、Vetur Vue的Vetur插…

【Vulnhub系列】Vulnhub_Raven2靶场渗透(原创)

【Vulnhub系列靶场】Vulnhub_Raven2 渗透 原文转载已经过授权 原文链接:Lusen的小窝 - 学无止尽,不进则退 (lusensec.github.io) 一、环境准备 从网盘下载该靶机,在vm中选择【打开】 然后设置好存储路径,开机后检查靶机的网络连…

谷粒商城实战笔记-84-商品服务-API-新增商品-获取分类关联的品牌

文章目录 一,品牌查询接口的后台实现二,编码经验总结1,Controller层的作用1.1 参数处理1.2 调用Service1.3 处理Service返回结果实例 2,VO的封装时机3,Service中最好注入Service,不要直接依赖Dao 问题记录 …

vue2 vue3 props 的处理机制

在 Vue 2 中,props 是单向数据流,父组件向子组件传递的 props 默认情况下是不具有响应式特性的。这意味着当父组件的数据发生变化时,如果传递给子组件的 props 发生变化,子组件不会自动更新视图。 具体来说,在 Vue 2 …

增量学习中Task incremental、Domain incremental、Class incremental 三种学习模式的概念及代表性数据集?

1 概念 在持续学习领域,Task incremental、Domain incremental、Class incremental 是三种主要的学习模式,它们分别关注不同类型的任务序列和数据分布变化。 1.1 Task Incremental Learning (Task-incremental) 任务增量学习,也称为任务增…

【论文共读】【翻译】【GAN】Generative Adversarial Nets

论文原文地址:https://arxiv.org/pdf/1406.2661 翻译:Generative Adversarial Nets 生成对抗网络 0. 摘要 提出了一种新的对抗过程估计生成模型的框架,其中我们同时训练两个模型:一个是捕获数据分布的生成模型G,另一…

燃气安全无小事,一双专业劳保鞋让你步步安心!

燃气作为我们日常生活中不可或缺的能源之一,为我们的生活提供了极大便利,其安全性往往被忽视在忙碌的日常生活背后。然而,燃气事故一旦发生,后果往往不堪设想,轻则财产损失,重则危及生命。因此,…

dockerfile部署镜像 ->push仓库 ->虚拟机安装建木 ->自动部署化 (详细步骤)

目录 创建私服仓库 vi /etc/docker/daemon.json vim deploy.sh判断脚本内容 创建 建木 后端部署 命名空间 设置密码用户名 创建git仓库 gitignore文件内容 图形项目操作 git maven docker镜像 点击流程日志 vim /etc/docker/daemon.json 执行部署脚本 ip 开发…

Linux网络——深入理解传入层协议TCP

目录 一、前导知识 1.1 TCP协议段格式 1.2 TCP全双工本质 二、三次握手 2.1 标记位 2.2 三次握手 2.3 捎带应答 2.4 标记位 RST 三、四次挥手 3.1 标记位 FIN 四、确认应答(ACK)机制 五、超时重传机制 六 TCP 流量控制 6.1 16位窗口大小 6.2 标记位 PSH 6.3 标记…

Jackson常用注解详解

Hi 👋, Im shy 有人见尘埃,有人见星辰 Jackson常用注解详解 文章目录 Jackson常用注解详解0. 引入依赖1. JsonProperty2. JsonIgnore3. JsonFormat4. JsonInclude5. JsonCreator6. JsonValue7. JsonIgnoreProperties结论 Jackson是Java生态系统中广泛…

Redis学习[1] ——基本概念和数据类型

Redis学习[1] ——基本概念和数据类型 一、Redis基础概念 1.1 Redis是什么,有什么特点? Redis是一个基于**内存的数据库,因此读写速度非常快**,常用作缓存、消息队列、分布式锁和键值存储数据库。支持多种数据结构:…