Redis学习 知识总结 一
Redis学习 知识总结 一
- 1 Redis初识
- 1.1 Redis八大特性
- 1.2 redis使用场景
- 1.3 Docker安装redis
- 2 API的理解和使用
- 2.1 通用命令
- 2.2 字符串(String)类型
- 2.3 哈希(Hash)类型
- 2.4 有序列表(list)
- 2.5 集合(Set)
- 2.6 有序集合(Sort Set)
- 3 Redis客户端的使用
- 3.1 Jedis客户端
- 4 Redis其他功能
1 Redis初识
1.1 Redis八大特性
Redis的键的类型是String的。
特性详解:
- 速度快:① 数据存储在内存中 ② 使用C语言编写(与系统融合性好)③ 单线程,避免资源争夺(
Redis6.0
之前是单线程的,Redis6.0
之后开始支持多线程)。 - 持久化:
redis
可以将内存中的数据异步保存到磁盘中,防止在断电等情况下的数据丢失。 - 支持多种数据类型:
String
、Hash
、linked List
、Set
、Sorted Set
- 支持多种编程语言:
Java
、Go
、python
、php
、Lua
、Node.js
、Ruby
- 功能丰富:发布订阅、
Lua
脚本、事务、pipeline
等 - 简单:源码的代码量少,可以修改。
- 支持主从复制:可为高可用、分布式提供便利。
- 高可用、分布式
1.2 redis使用场景
- 缓存系统
- 计数器
- 消息队列系统
- 排行榜
- 社交网络
- 实时系统
1.3 Docker安装redis
略
2 API的理解和使用
2.1 通用命令
keys
:查看所有的键 (keys *
:遍历所有的key
) 注意:keys
一般不在生产环境中使用,因为比较花销时间,会产生阻塞情况。dbsize
:计算key
的总数。exists key
:判断指定键是否存在。del key [key1 key2 ...]
:删除指定键的数据。expire key seconds
:给指定键设置过期时间(过期后自动删除)。ttl key
:查看key
的剩余过期时间。persist key
:去掉key
的过期时间。type key
:判断指定键的value
类型,返回结果String
、hash
、list
、set
、zset
、none
。- 时间复杂度:
keys
:O(n)
、dbsize
:O(1)
、del
:O(1)
、exists
:O(1)
、expire
:O(1)
、type
:O(1)
。 - 数据结构和内部编码:
string
:raw
、int
、embstr
;hash
:hashtable
、ziplist
;list
:linkedlist
、ziplist
;set
:hashtable
、intset
;zet
:skiplist
、ziplist
;
- 单线程:单线程为什么这么快?
- 纯内存。
- 非阻塞IO。
- 避免线程切换和竞态消耗。
- 单线程:
- 一次只运行一条命令。
- 拒绝长(慢)命令:
keys
,flushall
,flushdb
,slow lua script
,multi/exec
,operate
,big value(collection)
- 其实不是真正的单线程:
fysnc file descriptor
,close file descriptor
2.2 字符串(String)类型
使用场景:缓存、计数器、分布式锁 等等。
常用命令:
set
:设置key-value
时间复杂度O(1)
。get
:获取key
对应的value
时间复杂度O(1)
。del
:删除key-value
。incr key
:key
的值自增1,如果key
不存在,自增后get(key)
= 1。desc key
:key
的值自减1,如果key
不存在,自增后get(key)
= -1。incrby key k
:key
的值自增k,如果key
不存在,自增后get(key)
= k。desc key k
:key
的值自减k,如果key
不存在,自增后get(key)
= -k。set key
:不管key
是否存在,都设置 时间复杂度O(1)
。
setnx key
:key
不存在,才设置,相当于添加操作,时间复杂度O(1)
。
setxx key
:key
存在,才设置, 相当于更新操作,时间复杂度O(1)
。mset
:批量设置key-value
,时间复杂度O(n)
。例:mset key1 value1 key2 value2 key3 value3
mget
:批量获取key
,原子操作,时间复杂度O(n)
。例:mget key1 key2 key3...
getset key newvalue
:set key newvalue
并返回旧的value
,时间复杂度O(1)
。append key value
:将value
追加到旧的value
后面,时间复杂度O(1)
。strlen key
: 返回字符串的长度(注意中文的情况),时间复杂度O(1)
。incrbyfloat key
:以浮点数增加。getrange key start end
:获取指定起始索引的值。setrange key index value
:设置指定索引处的值。
2.3 哈希(Hash)类型
哈希命令是以字母h
为前缀,哈希键值结构,由key
(String
类型) field
(属性) value
(值)三部分组成,一个key
可以对应多个field-value
,可以把它看成一个对象。
特点:
Map-Map
即类似于map
嵌套了一个map
。Small redis
:相当于一个微小型的redis
。
常用命令:
hset
:(hset key field value
)设置hash
的key
对应的field-value
,时间复杂度O(1)
。hget
:(hget key field
) 获取hash key
对应的field
的value
,时间复杂度O(1)
。hdel
:(hdel key field
)删除hash key
对应的field
的value
, 时间复杂度O(1)
。hexists
:(hexists key field
)判断hash key
是否有field
, 时间复杂度O(1)
。hlen
:(hlen key
)获取hash key field
的数量 , 时间复杂度O(1)
。hmset
:(hmset key field1 value1 field2 value2 ...
)批量设置hash key
的field value
,时间复杂度O(n)
。hmget
:(hmget key field1 field2 field3 ...
)批量获取hash key
的field
对应的值,时间复杂度O(n)
。hgetall
: (hgetall key
) 返回hash key
对应的所有的field
和value
,时间复杂度O(n)
,注意小心使用hgetall
,牢记redis
是单线程的,使用hgetall
可能会造成阻塞现象。hvals
:(hvals key
)返回hash key
对应所有field
的value
,时间复杂度O(n)
。hkeys
:(hkeys key
)返回hash key
对应所有的field
,时间复杂度O(n)
。
2.4 有序列表(list)
列表是有序可以重复的,列表的左右两边插入弹出。
常用命令: 注意列表的命令是以 l-
为前缀。
rpush(rpush key value1 value2 ... valueN)
:从列表的右端插入(1 ~ N)
个值,时间复杂度O(1~n)
。
注意:push
时是从离键最近的值开始。lpush(lpush key value1 value2 ... valueN)
:从列表左端插入(1 ~ N)
个值,时间复杂度O(1~n)
。
注意:push时是从离键最近的值开始。linsert(linsert key before/after value newValue)
:在list的指定值的前或后插入新值 时间复杂度O(n)
。lpop(lpop key)
:从列表左侧弹出一个元素,时间复杂度O(1)
。rpop(rpop key)
:从列表右侧弹出一个元素,时间复杂度O(1)
。lrem(lrem key count value)
:根据count值,从列表中删除所有与value相等的元素,时间复杂度O(n)
。
- count > 0,从左到右开始删除最多
count
个与value
相等的元素。 - count <0,从右到左开始删除最多(
count
绝对值)个与value
相等的元素。 - count = 0,删除所有与
value
相等的元素。
ltrim(ltrim key start end)
:按照索引范围截取列表(将会只保留从指定索引开始到指定索引结束的子列表0,时间复杂度O(n)
。lrange(lrange key start end(包括end))
:获取列表指定索引范围内的所有元素,时间复杂度O(n)
。lindex(lindex key index)
:获取列表中指定索引的元素,时间复杂度O(n)
。
注意:当索引为-1
时表示是列表中最后一个元素。llen(llen key)
:获取列表长度(size),时间复杂度O(1)
。lset(lset key index newValue)
:修改列表指定索引处的元素为newValue
,时间复杂度O(n)
。blpop(blpop key timeout)
:从列表左端移出并获取列表第一个元素, 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。(lpop
阻塞版本,timeout
是阻塞超时时间,timeout = 0
表示永不阻塞),时间复杂度O(1)
。brpop(brpop key timeout)
:从列表右端移出并获取列表第一个元素, 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。(lpop
阻塞版本,timeout
是阻塞超时时间,timeout = 0
表示永不阻塞),时间复杂度O(1)
。
总结:
- lpush + lpop = Stack(实现栈)
- lpush + rpop = Queue(实现队列)
- lpush + ltrim = Capped Collection(实现固定集合)
- lpush + brpop = Message Queue(实现消息队列)
2.5 集合(Set)
集合的特点是元素是无序、不重复,支持集合间的操作(即两个集合取交集、并集、差集)。
常用命令:
注意集合的命令是以s-
为前缀;
sadd(sadd key value)
:向集合key
中添加value
,如果value
已经存在,则添加失败,时间复杂度O(1)
。srem(srem key value)
:将集合key
中的value
元素删除(删除元素的前提是知道集合中有此元素),时间复杂度O(1)
。scard(scard key)
:计算集合中有多少个元素。sismember(sismember key value)
:判断集合中是否存在值为value
的元素。srandmember(srandmember key count)
:从集合中随机挑count
个元素(集合中还有这些元素)。spop(spop key)
:从集合中随机弹出一个元素(弹出后集合中就没有此元素了)。smembers(smember key)
:获取集合中所有的元素。
注意:如果集合中的元素很多,因为redis
是单线程的,可能会发生阻塞现象,因此该命令应小心使用。sdiff(sdiff key1 key2)
:返回两个集合的差集(返回的是key1
中不在key2
中的元素)。sinter(sinter key1 key2)
:返回两个集合的交集(两个集合中共有的元素)。sunion(sunion key1 key2)
:返回两个集合的并集。sdiff|sinter|sunion +store destkey..
:将差集、交集、并集结果保存在destkey
中。
实际应用:
在社交应用中使用集合的交集就能找到共同关注的人。
2.6 有序集合(Sort Set)
有序集合不同于普通集合的是它有一个score
用来保持集合的有序性,有序集合的score
可以重复,但是集合中的元素仍保持不重复。
常用命令:
有序集合的命令是以z-
为前缀的。
zadd(zadd key score value,可以是多对score-value)
:向集合key
中添加score-value
,时间复杂度O(logN)
。zrem(zrem key value,可以是多个value)
:删除集合中的元素,可以一次删除多个,时间复杂度O(1)
zscore(zscore key value)
:返回元素的score
,时间复杂度O(1)
。zincrby(zincrby key score value)
:增加或减少元素的score
值,时间复杂度O(1)
。zcard(zcard key)
:返回元素的总个数,时间复杂度O(1)
。zrange(zrange key start end [withscores])
:返回指定索引范围内的升序元素(附带显示score
), 时间复杂度O(log(n)+m)
。zrangebyscore(zrangebyscore key minScore maxScore[withscores])
:返回指定score
范围内的升序元素(附带显示score
),时间复杂度O(log(n)+m)
。zcount(zcount key minScore maxScore)
:返回有序集合内在指定score范围内的元素个数 ,时间复杂度O(log(n)+m)
。zremrangebyrank(zremrangebyrank key start end)
:删除指定排名内的升序元素,时间复杂度O(log(n)+m)
。zremrangebyscore(zremrangebyscore key minScore maxScore)
:删除指定分数范围内的升序元素 ,时间复杂度O(log(n)+m)
。zrank(zrank key value)
:从小到大排列,返回索引。zrevank(zrevank key value)
:从大到小排列。与上面相反。zrevrange()
:与zrange
相反。zrevrangebyscore()
:与zrangebyscore
相反。zinterstore()
:计算给定的一个或多个有序集的交集,其中给定key
的数量必须以numkeys
参数指定,并将该交集(结果集)储存到destination
。zunionstore()
:计算给定的一个或多个有序集的并集,其中给定key
的数量必须以numkeys
参数指定,并将该并集(结果集)储存到destination
。
3 Redis客户端的使用
3.1 Jedis客户端
Jedis是Redis面向Java语言的客户端,通过使用jedis可以来操作Redis数据库。
- Jedis直连:
- 在
pom.xml
中加入Jedis
的依赖
<!-- https://mvnrepository.com/artifact/redis.clients/jedis -->
<dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>3.0.1</version>
</dependency>
- 生成一个
Jedis
对象,使用这个对象来和指定的Redis
数据库进行通信:
Jedis jedis = new Jedis("192.168.1.105",6379);
- 使用
jedis
执行操作,例:
jedis.set("hh","world");
- 使用
jedis
执行get
操作,例:
System.out.println("显示存入的数据:"+jedis.get("hh"));
- 参数介绍:
Jedis jedis = new Jedis(String host,int port,int connectionTimeout,int soTimeout);
host
:Redis
所在服务器的Ip
;
port
:Redis
的端口;
connectionTimeout
:客户端连接超时;
soTimeout
:客户端读写超时;
Jedis
连接池的简单使用:
- 初始化
Jedis
连接池,通常情况下JedisPool
是单例的:
GenericObjectPoolConfig poolConfig = new GenericObjectPoolConfig();
JedisPool jedisPool = new JedisPool(poolConfig,"127.0.0.1",6379);
Jedis jedis1 = null;
try{//1、从连接池中获取jedis对象jedis1 = jedisPool.getResource();//2、执行操作jedis1.set("hello","world");
}catch (Exception e){e.printStackTrace();
}finally {if(jedis1 != null){jedis1.close();//close()表示归还连接给连接池}
}
4 Redis其他功能
- 配置方法:
- 默认值
config get slowlog-max-len = 128
cofig get slowlog-log-slower-than = 10000
- 修改配置文件重启
- 动态配置:
config get slowlog-max-len 1000
cofig get slowlog-log-slower-than 1000
三个命令:
slowlog get[n]
:获取慢查询队列。slowlog len
:获取慢查询队列长度。slowlog reset
:清空慢查询队列。
运维经验:
slowlog-max-len
不要设置过大,默认10ms,通常设置1ms。slowlog-log-slower-than
不要设置过小,通常设置1000左右。- 理解命令的生命周期。
- 定期持久化慢查询:是为了日后能查询以前的慢查询日志。
相关文章:
Redis学习 知识总结 一
Redis学习 知识总结 一 1 Redis初识1.1 Redis八大特性1.2 redis使用场景1.3 Docker安装redis 2 API的理解和使用2.1 通用命令2.2 字符串(String)类型2.3 哈希(Hash)类型2.4 有序列表(list)2.5 集合…...
Webpack5 vue-loader和VueLoaderPlugin
文章目录 vue-loader和VueLoaderPlugin的作用vue-loader具体使用方式注意事项 vue-loader和VueLoaderPlugin的作用 .vue 文件是用户用 HTML-like 的语法编写的 Vue 组件。每个vue 文件都包括三部分 , VueLoaderPlugin 是一个解析 Vue.js 的插件,用于在 webpack 构…...
【传统视觉】模板匹配和卡尺圆检测
模板匹配 粗定位 1、原理:模板匹配是指在当前图像A中匹配与图像B最相似的部分,那么A为输入图像,B为模板图像。 2、匹配方法:B在A上华东,逐个遍历所有像素完成匹配。 3、函数: result cv2.matchTemplate(…...

记一次简单的MySql注入试验
试验环境: 1.已经搭建好的php服务器,并可以通过访问到localhost/index.php; 2.已经安装好数据库,并创建表test,表内有name、age等字段,并随便创建几个假数据用于测试;如图: 开始测…...

软考开发思考(完善中)
软考开发思考 文章目录 软考开发思考1. 互联网媒体:新技术和新应用及当前的趋势和应用1.1 自动化报道1.2. 虚拟和增强现实1.3. 数据新闻1.4. 即时新闻推送1.5 智能助手和聊天机器人1.6 语音播报,语音检索,后台播放、播放倍速。1.6 机器人交互…...

[NLP]LLaMA与LLamMA2解读
摘要 Meta最近提出了LLaMA(开放和高效的基础语言模型)模型参数包括从7B到65B等多个版本。最值得注意的是,LLaMA-13B的性能优于GPT-3,而体积却小了10倍以上,LLaMA-65B与Chinchilla-70B和PaLM-540B具有竞争性。 一、引言 一般而言࿰…...

后端一次返回大量数据,前端做分页处理
问题描述:后端接口返回大量数据,没有做分页处理,不支持传参pageNum,pageSize 本文为转载文章,原文章:后端一次返回大量数据,前端做分页处理 1.template中 分页 <el-paginationsize-chang…...

卷积神经网络识别人脸项目—使用百度飞桨ai计算
卷积神经网络识别人脸项目的详细过程 整个项目需要的准备文件: 下载链接: 链接:https://pan.baidu.com/s/1WEndfi14EhVh-8Vvt62I_w 提取码:7777 链接:https://pan.baidu.com/s/10weqx3r_zbS5gNEq-xGrzg 提取码&#x…...

vue中预览静态pdf文件
方法 // pdf预览 viewFileCompare() { const pdfUrl "/static/wjbd.pdf"; window.open(pdfUrl); }, // 下载 downloadFile(){ var a document.createElement("a"); a.href "/static/wjbd.pdf"; a.…...
Java多进程(详细)
进程的含义 简单理解是正在跑起来的程序,正在运行的程序。没有正在运行的程序不叫进程,同一个程序,运行多次,就可能产生多个进程。 平时所说的程序,值的是一些exe的可执行文件,得把程序跑起来才会涉及到进程…...

OpenCV 4.0+Python机器学习与计算机视觉实战
💂 个人网站:【办公神器】【游戏大全】【神级源码资源网】🤟 前端学习课程:👉【28个案例趣学前端】【400个JS面试题】💅 寻找学习交流、摸鱼划水的小伙伴,请点击【摸鱼学习交流群】 目录 前言第一部分&…...

自学网络安全(黑客)全笔记
一、什么是网络安全 网络安全可以基于攻击和防御视角来分类,我们经常听到的 “红队”、“渗透测试” 等就是研究攻击技术,而“蓝队”、“安全运营”、“安全运维”则研究防御技术。 无论网络、Web、移动、桌面、云等哪个领域,都有攻与防两面…...

WAF/Web应用安全(拦截恶意非法请求)
Web 应用防火墙(Web Application Firewall, WAF)通过对 HTTP(S) 请求进行检测,识别并阻断 SQL 注入、跨站脚本攻击、跨站请求伪造等攻击,保护 Web 服务安全稳定。 Web 安全是所有互联网应用必须具备的功能,…...

Windows环境下git客户端中的git-bash和MinGW64
我们在 Windows10 操作系统下,安装了 git 客户端之后,可以通过 git-bash.exe 打开一个 shell: 执行一些 linux 系统里的命令: 注意到上图紫色的 MINGW64. Mingw-w64 是原始 mingw.org 项目的改进版,旨在支持 Window…...

欧姆龙CX系列PLC串口转以太网欧姆龙cp1hplc以太网连接电脑
你是否还在为工厂设备信息采集困难而烦恼?捷米特JM-ETH-CX转以太网通讯处理器为你解决这个问题! 捷米特JM-ETH-CX转以太网通讯处理器专门为满足工厂设备信息化需求而设计,可以用于欧姆龙多个系列PLC的太网数据采集,非常方便构建生…...

Vue3笔记
1. Vue2 选项式 API vs Vue3 组合式API <script> export default { data(){ return { count:0 } }, methods:{ addCount(){ this.count } } } </script> <script setup> import { ref } from vue const count ref(0) c…...

git相关
gerrit用户指南: 资料:Gerrit 用户指南 gerrit-user-guide 上述有介绍如何review,review并非修改代码之后如何重新提交等操作 jenkins介绍 Jenkins详细教程 - 知乎 一、jenkins是什么? Jenkins是一个开源的、提供友好操作界…...

车道线检测|利用边缘检测的原理对车道线图片进行识别
前言 那么这里博主先安利一些干货满满的专栏了! 这两个都是博主在学习Linux操作系统过程中的记录,希望对大家的学习有帮助! 操作系统Operating Syshttps://blog.csdn.net/yu_cblog/category_12165502.html?spm1001.2014.3001.5482Linux S…...
C++—static关键字详解
引言: C的static有两种用法:面向过程程序设计中的static和面向对象程序设计中的static。前者应用于普通变量和函数,不涉及类;后者主要说明static在类中的作用。 一.面向过程中的static 1.静态全局变量 静态全局变量有以下特点…...

CS144学习笔记(1):Internet and IP
1.网络应用 网络应用可以在世界范围内交换数据,例如你可以通过浏览器读取出版社服务器提供的文章。网络应用的基本模型:两台主机各自在本地运行一个程序,程序通过网络来通信。 最常用的通信模型使用双向可靠字节流,通信的两台主机…...
web vue 项目 Docker化部署
Web 项目 Docker 化部署详细教程 目录 Web 项目 Docker 化部署概述Dockerfile 详解 构建阶段生产阶段 构建和运行 Docker 镜像 1. Web 项目 Docker 化部署概述 Docker 化部署的主要步骤分为以下几个阶段: 构建阶段(Build Stage):…...

Lombok 的 @Data 注解失效,未生成 getter/setter 方法引发的HTTP 406 错误
HTTP 状态码 406 (Not Acceptable) 和 500 (Internal Server Error) 是两类完全不同的错误,它们的含义、原因和解决方法都有显著区别。以下是详细对比: 1. HTTP 406 (Not Acceptable) 含义: 客户端请求的内容类型与服务器支持的内容类型不匹…...
椭圆曲线密码学(ECC)
一、ECC算法概述 椭圆曲线密码学(Elliptic Curve Cryptography)是基于椭圆曲线数学理论的公钥密码系统,由Neal Koblitz和Victor Miller在1985年独立提出。相比RSA,ECC在相同安全强度下密钥更短(256位ECC ≈ 3072位RSA…...

MongoDB学习和应用(高效的非关系型数据库)
一丶 MongoDB简介 对于社交类软件的功能,我们需要对它的功能特点进行分析: 数据量会随着用户数增大而增大读多写少价值较低非好友看不到其动态信息地理位置的查询… 针对以上特点进行分析各大存储工具: mysql:关系型数据库&am…...
在 Nginx Stream 层“改写”MQTT ngx_stream_mqtt_filter_module
1、为什么要修改 CONNECT 报文? 多租户隔离:自动为接入设备追加租户前缀,后端按 ClientID 拆分队列。零代码鉴权:将入站用户名替换为 OAuth Access-Token,后端 Broker 统一校验。灰度发布:根据 IP/地理位写…...

Vue2 第一节_Vue2上手_插值表达式{{}}_访问数据和修改数据_Vue开发者工具
文章目录 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染2. 插值表达式{{}}3. 访问数据和修改数据4. vue响应式5. Vue开发者工具--方便调试 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染 准备容器引包创建Vue实例 new Vue()指定配置项 ->渲染数据 准备一个容器,例如: …...
vue3 字体颜色设置的多种方式
在Vue 3中设置字体颜色可以通过多种方式实现,这取决于你是想在组件内部直接设置,还是在CSS/SCSS/LESS等样式文件中定义。以下是几种常见的方法: 1. 内联样式 你可以直接在模板中使用style绑定来设置字体颜色。 <template><div :s…...

让AI看见世界:MCP协议与服务器的工作原理
让AI看见世界:MCP协议与服务器的工作原理 MCP(Model Context Protocol)是一种创新的通信协议,旨在让大型语言模型能够安全、高效地与外部资源进行交互。在AI技术快速发展的今天,MCP正成为连接AI与现实世界的重要桥梁。…...

(转)什么是DockerCompose?它有什么作用?
一、什么是DockerCompose? DockerCompose可以基于Compose文件帮我们快速的部署分布式应用,而无需手动一个个创建和运行容器。 Compose文件是一个文本文件,通过指令定义集群中的每个容器如何运行。 DockerCompose就是把DockerFile转换成指令去运行。 …...

Java面试专项一-准备篇
一、企业简历筛选规则 一般企业的简历筛选流程:首先由HR先筛选一部分简历后,在将简历给到对应的项目负责人后再进行下一步的操作。 HR如何筛选简历 例如:Boss直聘(招聘方平台) 直接按照条件进行筛选 例如:…...