Redis 笔记一
概览
1.Redis核心数据存储结构
2.Redis底层String编码int&embstr&raw
3.Redis底层压缩列表&跳表&哈希表
4.Redis底层Zset实现压缩列表和跳表如何选择
5.基于Redis实现微博&抢红包&12306核心业务
辅助学习:Redis 教程 | 菜鸟教程
1.Redis为什么性能高?
单线程,没有切换线程的时间耗费
基于内存、多路复用
一破机制?涉及其内核级别的设置,多线程的设置,然后它性能就高。
Redis的性能高体现在命令执行时,采用全局Hash表,其存储的时间复杂度O(1),
当发生哈希冲突时,采用rehash机制,使冲突的概率极小。
2.Redis核心数据结构
2.1.1字符串类型


特别的:SETNX(set if not exists)设置值时,若key值存在时,不做操作

2.1.2字符串类型应用场景

业务场景:文章阅读量
每当一个人阅读,就有一个+1操作。
在redis可以通过incr实现自增操作。
- 一些分库分表设置的数据库,就不能用数据库自带的自增操作生成ID了,可以用redis实现自增操作。
- 但是redis使用的是内存资源,比较宝贵,大数据量的话,不建议。可以采用一个批量自增的操作。取100个,存到java web里暂存,虽然java web程序挂了,会丢失,但是不影响,因为自增上限很大,不会不够用。
- redis批量自增怎么做:INCRBY orderId 100
注意: set zhuge 666 //int类型可自增
set tuling 66a//string类型不可自增
//原因在于:获得数据先尝试强转int,能转则int,不能转string
object encoding xx//查看具体存储类型
2.2.1Hash类型


特别的应用:如一个对象类型:name:zhuge balance:1888
可以将其处理为:双层map结构,把字段分开放在hash结构里,然后用一个hashset来存储。
和json相比,可以直接操作某个字段,处理起来更快、更好。
2.2.2Hash类型应用场景

应用场景:电商购物车
获得购物车所有商品,根据id, 对商品数量做添加、删除,展示商品总量
可以通过redis来操作
- 通过hset cart:1001 10088 1 添加指定商品,只保留商品ID信息,通过ID来操作,更轻便,更快捷。
- 已知商品ID, 获取商品全量信息可以用id在数据库总查询。
2.3.1list类型


关于队列,可以使用list来实现先进先出。FIFO
特别的: BRPOP其中B表示Blocking的意思,当队列没有数据时,会阻塞。适用于分布式结构。
2.3.2list类型的应用

应用场景:微博|微信消息
对于这种大量的消息来说,用oder By来排序,性能很低。可以用redis的list来实现,其本身就是按时间顺序排列的,其可以LRANGE XX 0 4 通过下标来取一部分数,且支持负向索引
- 发消息,根据ID插入对应博文的list里即可
2.4.1set类型

注意:set里的数据是无序的
2.4.2set类型的应用

应用场景:微信小程序抽奖
将参与抽奖的人的ID放入Set,然后抽取指定数量,set本身是无序的,所以可以实现随机抽取。
有两种抽法:抽取放回
抽取不放回:可以设置多个奖励等级

应用场景:微博微信点赞、收藏、标签
实现:将用户ID维护到一个list里。

关注模型:共同关注|推荐关注

摘自:https://www.cnblogs.com/mike-mei/p/14663635.html
应用场景:共同关注
实现:将关注列表维护成set集合,通过交际|并集,获得指定集合数据。
2.5.1Zset类型

2.5.2Zset类型的应用

Zset是有序的结构,能支撑有序数据的展示。
3.Redis的数据结构的存储格式

Redis 的存储结构: key:value
其中key是string 类型,value的类型有:string、hash、list、set、Zset
接下来分别介绍各个数据类型的结构及应用:
| 数据类型 | 存储结构 |
| string | 简单动态字符串SDS |
| hash | 哈希表O(1)、压缩列表O(N) |
| list | 压缩列表O(N)、双向链表O(N) |
| set | 哈希表O(1)、整数数组O(N) |
| Zset(有序) | 压缩列表O(N)、跳表 |
跳表:
其实,简单来说,跳表其实是一种多层的有序链表。跳表来源于链表,在链表的基础上结合了二分的思想进行改造,我们把改造之后的数据结构叫做跳表(Skip list)。
我们知道:二分查找针对的有序数组,时间复杂度是o(logn)。如果是有序链表,查询和插入的的时间复杂度是o(n)。跳表就是链表的“二分查找”。redis的有序集合用的就是跳表算法。
跳表中查询一个数据的时间复杂度就是 O(m*logn)
摘自:详解高级数据结构之 跳表 - 知乎
压缩列表和跳表:
压缩表的底层存储是是数组,查找快,但是增删慢,是一种以时间换空间的存储方式。

跳表最开始是由有序链表优化而来,增删快,查找慢。其保存冗余索引,但是不是B树、B+树,但是性能接近折半查找。是一种以空间换时间的存储方式。


什么时候用?什么样的场景用什么样的数据结构。
对于时间有要求用跳表;对于空间有要求用压缩数组;可以通过在配置文件配置redis.conf优先使用哪种存储结构。

相关文章:
Redis 笔记一
概览 1.Redis核心数据存储结构 2.Redis底层String编码int&embstr&raw 3.Redis底层压缩列表&跳表&哈希表 4.Redis底层Zset实现压缩列表和跳表如何选择 5.基于Redis实现微博&抢红包&12306核心业务 辅助学习:Redis 教程 | 菜鸟教程 1.Redis为什…...
学习记录687@spring data jpa 动态传递list参数并判断list是否为空
实际应用中需要在spring data jpa中使用原生sql,传递的参数是list,要根据list判断是否为空来判断是否要使用这个参数。 尝试了很多方法,比如size、length、is null、!null等等,都要报错,比如could not extract Result…...
寒假刷题第五天
PTA甲级 1022 Digital Library 大模拟 #include<iostream> #include<unordered_map> #include<unordered_set> #include<vector> #include<set>using namespace std;unordered_map<string , set<int>>ti , au , key , pub , year…...
Leetcode454四数相加Ⅱ(java实现)
今天,我们分享的题目是Leetcode454四数相加Ⅱ,我们先来看题目: 首先可以从题意中大体得知,也是从某个集合中找有没有符合条件的元素。遇见这种类型的题目我们可以考虑用哈希表,本题我们选取的是map集合,因…...
mysql 容器化安装(docker)离线和在线
前言:在部署hive或airflow 升级过程中,总需要一个对应的数据库存储元数据,一个轻量级的mysql容器刚刚好。轻量、可快速移植、具有隔离性。 文章目录 1、查看机器版本2、安装 docker3、启动docker 服务4、docker 常用命令docker5、拉取mysql …...
2. FPGA的电路结构概述
文章目录 1. 引言2. FPGA的一般结构2.1 概要2.2 FPGA三部分构成间的关系: 3. 小结 1. 引言 结构决定原理。原理未必决定结构。理解FPGA结构,进而能阐明其工作原理很有必要。FPGA产品的风云变换,其基本结构保持相对不变。 2. FPGA的一般结构…...
【Qt】Qt配置
需要云服务器等云产品来学习Linux的同学可以移步/-->腾讯云<--/-->阿里云<--/-->华为云<--/官网,轻量型云服务器低至112元/年,新用户首次下单享超低折扣。 目录 一、Qt SDK下载 二、配置环境变量 三、新建工程(QWidget) 四、QWidg…...
查看Linux系统内存、CPU、磁盘使用率和详细信息
一、查看内存占用 1、free # free -m 以MB为单位显示内存使用情况 [rootlocalhost ~]# free -mtotal used free shared buff/cache available Mem: 11852 1250 8668 410 1934 9873 Swap: 601…...
HttpServletRequest getServerPort()、getLocalPort() 、getRemotePort() 区别
getRemotePort() 、getServerPort()、getLocalPort() request.getServerPort()、request.getLocalPort() 和 request.getRemotePort() 这三个方法都是获取与HTTP请求相关的端口信息的 客户端(如浏览器)通过某个随机分配的网络连接端口(7070) 向服务器发送HTTP请求( http://exam…...
NVIDIA jetson编译opencv 源码 python版本
安装 jetson-stats 查看GPU的利用率 sudo apt-get install python3-pip sudo -H pip3 install jetson-stats 运行 jtop 进行查看 opencv 编译python版本 编译命令 cmake -D CMAKE_INSTALL_PREFIX/usr/local/opencv-4.6.0 -D CMAKE_BUILD_TYPERELEASE -D WITH_OPENGLON -D …...
TCP的三次握手,四次挥手
三次握手 第一次握手:客户端发送SYN报文,井发送seq为x序列号给服务端,等待服务端的确认第二次握手:服务端发送SYNACK报文,并发送seq为Y的序列号,在确认序列号为x1第三次握手:客户端发送ACK报文&…...
ElasticSearch高阶使用
目录 一、match_all 二、 text和keyword的区别 三、match、term的区别 四、exists query 五、 ids query 六、range query范围查询 七、prefix query前缀查询 八、 wildcard query通配符查询 九、 fuzzy query模糊查询 十、match query匹配查询 十一、multi_match q…...
美易官方:盘前:道指期货跌0.4% “恐怖数据”将发布
盘前:道指期货跌0.4% “恐怖数据”将发布 在今日的盘前交易中,道琼斯工业平均指数期货小幅下跌0.4%,市场正在等待即将发布的“恐怖数据”——美国零售销售数据。这一数据被视为衡量美国经济健康状况的重要指标,因此备受关注。 由于…...
appium之联动pycharm
前置条件: 1.java环境安装好了 2.android-sdk安装好(uiautomatorviewer 也可以把这个启动起来) 3.appium安装好 4.adb devices查看下设备是否连接 pycharm入门代码--固定写法 from appium import webdriver# 定义字典变量 desired_caps …...
Java中泛型的详细介绍
引言: Java语言中的泛型是一种强大的特性,它允许我们在编写代码时指定类、接口和方法的参数类型。通过使用泛型,我们可以提高代码的重用性、可读性和安全性。在本博客中,我们将详细介绍Java中泛型的知识。 一、泛型的基本概念 泛型…...
chrome 307状态码
问题:不知道什么原因导致http请求chrome始终307跳转到https,这个307的跳转非常恶心的地方是客户端缓存行为,并且非普通的f12下面清除缓存可以去掉 解决办法:使用chrome的清除浏览数据,通过这个方式清除,才能解决。 问…...
Redis在Windows10中安装和配置
1.首先去下载Redis 这里不给出下载地址,自己可以用去搜索一下地址 下载 下载完成后解压到D盘redis下,本人用的是3.2.100 D:\Redis\Redis-x64-3.2.100 2.解压完成后需要设置环境变量,这里新建一个系统环境变量中path 中添加一个文件所…...
华为OD机试 - 特殊的加密算法(Java JS Python C)
题目描述 有一种特殊的加密算法,明文为一段数字串,经过密码本查找转换,生成另一段密文数字串。 规则如下: 明文为一段数字串由 0~9 组成密码本为数字 0~9 组成的二维数组需要按明文串的数字顺序在密码本里找到同样的数字串,密码本里的数字串是由相邻的单元格数字组成,上…...
MySQL——性能优化与关系型数据库
文章目录 什么是性能?什么是关系型数据库?数据库设计范式 常见的数据库SQL语言结构化查询语言的六个部分版本 MySQL数据库故事历史版本5.6/5.7差异5.7/8.0差异 什么是性能? 吞吐与延迟:有些结论是反直觉的,指导我们关…...
【机器学习300问】12、为什么要进行特征归一化?
当线性回归模型的特征量变多之后,会出现不同的特征量,然而对于那些同是数值型的特征量为什么要做归一化处理呢? 一、为了消除数据特征之间的量纲影响 使得不同指标之间具有可比性。例如,分析一个人的身高和体重对健康的影响&…...
同架构大数据量HGDB到HGDB数据迁移
文章目录环境文档用途详细信息环境 系统平台:Linux x86-64 Red Hat Enterprise Linux 7,银河麒麟 (X86_64) 版本:4.5.8 文档用途 本文介绍同架构大数据量情况下,为了减少停机时间,先搭建流复制同步数据&…...
ae新手福音,用快马平台ai生成带注释的片段视频代码轻松入门
作为一个刚接触AE的新手,第一次打开软件时确实被复杂的界面吓到了。各种面板、时间轴、效果控件看得眼花缭乱,更别说要自己写表达式了。直到发现了InsCode(快马)平台,用自然语言描述就能生成带详细注释的AE项目代码,简直是新手的救…...
YOLOv8环境搭好了,然后呢?5个实用脚本带你玩转目标检测(从预测到训练)
YOLOv8环境搭好了,然后呢?5个实用脚本带你玩转目标检测(从预测到训练) 刚完成YOLOv8环境配置的开发者常会遇到这样的困境:跑通官方demo后,面对自己的实际需求却无从下手。本文将提供五个即用型Python脚本&a…...
最完整的大模型算法工程师技术栈图谱(2026版)
目录 一、基础能力(所有AI工程师的底座) 1 编程语言 2 数据结构与算法 3 数学基础 二、深度学习基础 深度学习模型基础 三、大模型核心技术 1 Transformer架构 2 预训练 3 Tokenizer 四、大模型训练体系 1 分布式训练 2 训练优化技术 3 微…...
K230目标检测实战:手把手教你用Labelme标注数据并一键转成VOC格式(附避坑指南)
K230目标检测实战:高效数据标注与VOC格式转换全攻略 当你第一次接触K230开发板进行目标检测项目时,数据准备往往是最大的拦路虎。特别是从原始图片到符合AI_Cube要求的VOC格式数据集,这个过程充满了各种"坑"。本文将分享一套经过实…...
Linux 内核模块编程入门
Linux 内核模块编程入门 内核模块的重要性 作为科技创业者,我深刻理解内核模块在系统开发中的灵活性和强大功能。内核模块允许我们在不重新编译整个内核的情况下,动态地添加或移除功能。这种机制不仅加快了开发迭代速度,还为产品定制化提供了…...
如何用WechatFerry构建企业级微信自动化解决方案
如何用WechatFerry构建企业级微信自动化解决方案 【免费下载链接】wechatferry 基于 WechatFerry 的微信机器人底层框架 项目地址: https://gitcode.com/gh_mirrors/wec/wechatferry 一、场景化价值:从业务痛点到自动化突破 在数字化转型加速的今天…...
如何突破内容访问限制?5类开源工具的技术解析与场景适配
如何突破内容访问限制?5类开源工具的技术解析与场景适配 【免费下载链接】bypass-paywalls-chrome-clean 项目地址: https://gitcode.com/GitHub_Trending/by/bypass-paywalls-chrome-clean 在信息爆炸的数字时代,优质内容往往被各种访问限制所阻…...
OpenClaw会议纪要大师:Qwen3-32B实时转录飞书语音会议
OpenClaw会议纪要大师:Qwen3-32B实时转录飞书语音会议 1. 为什么需要自动化会议纪要 每次开完会最头疼的就是整理会议纪要。作为团队的技术负责人,我每周要参加至少8场跨部门会议,传统的手动记录方式让我苦不堪言——要么记录不全重点&…...
OpenClaw极简部署:nanobot镜像+手机Termux方案
OpenClaw极简部署:nanobot镜像手机Termux方案 1. 为什么要在手机上部署OpenClaw? 去年夏天,我在咖啡馆等朋友时突发奇想:如果能用手机随时调用AI助手处理文件该多好。当时尝试了几款云端AI工具,但要么功能受限&#…...
